Javascript에는 유형 및 유형 변환에 대한 “트릭”이 많이 있으므로이 두 가지 방법이 동일한 지 아니면 다른 경우가 있는지 궁금합니다.
답변
그것들은 완전히 동일하지 않으며 실제로 함수로 호출 된 String 생성자 (첫 번째 예)는 마지막에 toString
전달 된 객체 의 메서드를 호출합니다 . 예를 들면 다음과 같습니다.
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
식별자가 참조하는 경우 반면에, null
또는 undefined
, 당신은 사용할 수없는 toString
방법을 당신에게 줄 것이다 TypeError
예외 :
var value = null;
String(null); // "null"
value.toString(); // TypeError
String
함수로 호출 되는 생성자는 대략 다음과 같습니다.
value + '';
Object -to- Primitive 의 유형 변환 규칙 은 사양, [[DefaultValue]]
내부 작업 에 자세히 설명되어 있습니다.
간단히 요약하면 Object -to- String 에서 변환 할 때 다음 단계가 수행됩니다.
- 가능한 경우
toString
메서드를 실행합니다 .- 이 경우
result
A는 기본 , 복귀result
2 단계, 다른 이동.
- 이 경우
- 가능한 경우
valueOf
메서드를 실행합니다 .- 이 경우
result
A는 기본 , 복귀result
3 단계, 다른 이동.
- 이 경우
- 던져
TypeError
.
위의 규칙이 주어지면 관련된 의미 체계의 예를 만들 수 있습니다.
var o = {
toString: function () { return "foo"; },
valueOf: function () { return "bar"; }
};
String(o); // "foo"
// Make the toString method unavailable:
o.toString = null;
String(o); // "bar"
// Also make the valueOf method unavailable:
o.valueOf = null;
try {
String(o);
} catch (e) {
alert(e); // TypeError
}
이 메커니즘에 대해 더 알고 싶다면 ToPrimitive
및 ToString
내부 작업을 살펴 보는 것이 좋습니다 .
또한이 기사를 읽는 것이 좋습니다.
답변
value.toString()
value
null 인 경우 오류가 발생합니다 . String(value)
하지 말아야합니다.
예를 들면 :
var value = null;
alert(value.toString());
때문에 실패합니다 value == null
.
var value = null;
alert(String(value));
“null”(또는 이와 유사한) 메시지를 표시해야하지만 충돌하지는 않습니다.
답변
String(value)
또는 value.toString()
같은 속성이없는 값을 제외하고 모든 경우 와 동일한 결과를 가져야합니다 . 동일한 결과를 생성합니다.null
undefined
''+value
답변
String () [ 생성자 호출 ]은 기본적으로 .toString ()을 호출합니다.
.toString () 및 String () 은 기본 값 (number, boolean, string)에서 호출 될 수 있으며 기본적으로 특별한 작업은 수행하지 않습니다.
참 => ‘참’
거짓 => ‘거짓’
17 => ’17’
‘안녕하세요’=> ‘안녕하세요’
그러나 객체에 대해 이러한 함수를 호출하는 것이 흥미로운 부분입니다.
객체에 자체 .toString () 함수가있는 경우이 객체를 문자열 (명시 적으로 / 암시 적으로)으로 처리해야 할 때마다 호출됩니다.
let obj = {
myName:"some object",
toString:function(){ return this.myName; }
}
//implicitly treating this obj as a string
"hello " + obj; //"hello some object"
//OR (explicitly)
"hello " + String(obj) //calling the existent toString function
//OR
"hello " + obj.toString(); //calling toString directly
그런데이 객체를 숫자로 취급하려면 .valueOf () 함수가 정의되어 있어야합니다.
하나의 객체에 둘 다 있으면 어떨까요?
이 객체를 문자열로 취급하려면 => .toString () 사용
이 객체를 숫자로 취급하려면 => .valueOf () 사용
우리는 무엇을 한 경우 .valueOf () 정의?
객체 내부에 정의 된 .valueOf () 는 객체를 문자열로 처리하든 숫자로 처리하든 상관없이 호출됩니다.