String(값) 대 value.to String()의 차이점은 무엇입니까?
Javascript에는 유형과 유형 변환에 대한 "꼼수"가 많은데, 이 두 가지 방법이 동일한지 아니면 다른 코너 케이스가 있는지 궁금합니다.
그들은 완전히 같지는 않으며, 실제로 함수로 호출되는 문자열 생성자(첫 번째 예)는 마지막에 다음과 같이 호출합니다.toString
전달된 개체의 메서드, 예:
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
반면에, 식별자가 언급하는 경우.null
또는undefined
당신은 그것을 사용할 수 없습니다.toString
메소드는 예외를 제공합니다.
var value = null;
String(null); // "null"
value.toString(); // TypeError
그String
함수로 호출되는 생성자는 대략 다음과 같습니다.
value + '';
개체에서 원시 형식으로 변환 규칙은 내부 작업 사양에 자세히 설명되어 있습니다.
요약하면 개체에서 문자열로 변환할 때 다음 단계를 수행합니다.
- 사용 가능한 경우 다음을 실행합니다.
toString
방법.- 만약에
result
원시적인, 귀환입니다.result
그렇지 않으면 2단계로 이동합니다.
- 만약에
- 사용 가능한 경우 다음을 실행합니다.
valueOf
방법.- 만약에
result
원시적인, 귀환입니다.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
}
이 메커니즘에 대해 자세히 알고 싶다면 및 내부 작업을 살펴보는 것이 좋습니다.
또한 이 기사를 읽는 것을 추천합니다.
value.toString()
다음과 같은 경우 오류가 발생합니다.value
null이거나 정의되지 않았습니다.String(value)
해서는 안 됩니다.
예:
var value = null;
alert(value.toString());
때문에 실패할 것입니다.value == null
.
var value = null;
alert(String(value));
메시지에 "crash"(또는 이와 유사함)가 표시되어야 하지만 충돌하지 않습니다.
String(value)
와 동일한 결과가 있어야 합니다.value.toString()
모든 경우에, 다음과 같은 속성이 없는 값을 제외하고.null
또는undefined
.''+value
동일한 결과를 생성합니다.
방금 ES6에서 이것을 사용해 봤는데,String()
보다valueOf()
물체의 내부에, 물체는 가지고 있어야 합니다.toString()
방법.개체에 다음이 없는 경우toString()
그러면 콘솔이 반환됩니다.'[object Object]'
가 있든 없든 간에valueOf()
그렇지 않으면.그래서 첫 번째 "단계"에서, 우리는 항상 다음과 같이 해야 합니다.toString()
상관없이 다른String()
방법은 고려하지 않을 것valueOf
.
다음을 확인하십시오.
let obj = {
name:'b',
age:22,
valueOf: function(){
return 'heeee';
}
}
String(obj); // prints '[object Object]'
반면에,
let obj = {
name:'b',
age:22,
toString:null,
valueOf: function(){
return 'heeee';
}
}
String(obj); // prints 'heeee'
let obj = {
name: 'b',
age: 22,
valueOf: function() {
return 'heeee';
}
}
console.log(String(obj));
let obj2 = {
name: 'b',
age: 22,
toString: null,
valueOf: function() {
return 'heeee';
}
}
console.log(String(obj2));
String() [생성자 호출]은 기본적으로 .toString()을 호출합니다.
.toString() 및 String()은 기본값(숫자, 부울, 문자열)에 대해 호출할 수 있으며 기본적으로 특별한 작업은 수행하지 않습니다.
true => 'true'
false => 'false'
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()는 개체를 문자열로 처리할지 숫자로 처리할지 여부에 관계없이 호출됩니다.
언급URL : https://stackoverflow.com/questions/3945202/whats-the-difference-between-stringvalue-vs-value-tostring
'programing' 카테고리의 다른 글
Python SQL 쿼리 문자열 형식 지정 (0) | 2023.07.24 |
---|---|
코드 점화기 세션이 Ajax 호출로 버그가 발생함 (0) | 2023.07.24 |
제출하기 전에 어떻게 해야 합니까? (0) | 2023.07.24 |
Oracle(PL/)SQL의 문자열 형식 (0) | 2023.07.24 |
PHP 프로그램에서 HTML을 안전하게 출력하는 방법은 무엇입니까? (0) | 2023.07.24 |