Javascript_javascript 기술에서 valueOf와 toString의 차이점에 대한 간략한 분석

WBOY
풀어 주다: 2016-05-16 17:40:03
원래의
847명이 탐색했습니다.

머리말

기본적으로 모든 JS 데이터 유형에는 null을 제외한 이 두 가지 메소드가 있습니다. 둘 다 JavaScript 값 계산 및 표시 문제를 해결하고 다시 작성하면 호출 최적화가 향상됩니다.

테스트 분석

먼저 예시를 살펴보겠습니다.

코드 복사 코드는 다음과 같습니다.

var aaa = {
i: 10,
valueOf: function() { return this.i 30 },
toString: function() { return this.valueOf() }
}

alert(aaa > 20); // true
alert( aaa); // 40
alert(aaa) // 50


이 결과가 나온 이유 왜냐하면 그들은 비밀리에 valueOf 또는 toString 메소드를 호출하기 때문입니다.
그런데 어떤 상황에서 어떤 메서드가 호출되는지 어떻게 구별할 수 있나요? 다른 메서드를 통해 테스트해 볼 수 있습니다.
console.log를 사용하므로, Firebug가 설치된 FF에서 실험해 보세요!
코드 복사 코드는 다음과 같습니다.

var bbb = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
},
valueOf: function() {
console. log(' valueOf');
return this.i;
}
}

alert(bbb); // 10 toString
alert( bbb); // 10 valueOf
alert('' bbb) // 10 valueOf
alert(String(bbb)); / 10 toString
alert(Number(bbb)); // 10 valueOf
alert(bbb == '10') // true valueOf
alert(bbb === '10'); /false


결과를 보면 문자열로 변환할 때는 toString 메소드, 수치로 변환할 때는 valueOf 메소드를 호출한 듯한 느낌을 주는데 둘은 매우 불일치합니다. 하나는 경고('' bbb)이고, 문자열 연결은 toString 메소드를 호출해야 합니다. 우리가 일시적으로 이해할 수 있는 다른 하나는 === 연산자가 암시적 변환을 수행하지 않으므로 호출되지 않는다는 것입니다. 진실을 밝히기 위해서는 좀 더 엄격한 실험이 필요합니다.
코드 복사 코드는 다음과 같습니다.

var aa = {
i: 10,
toString: function() {
console.log('toString');
return this.i
}
}
alert(aa);// 10 toString
alert( aa); // 10 toString
alert('' aa); // 10 toString
alert(String(aa)) // 10 toString
alert(Aa )); // 10 toString
alert(aa == '10'); // true toString

valueOf를 다시 살펴보세요.
코드 복사 코드는 다음과 같습니다.

var bb = {
i: 10,
valueOf: function() {
console.log('valueOf')
return this.i
}
}

alert(bb);// [객체 객체]
alert(bb); // 10 valueOf
alert('' bb) // 10 valueOf
alert(String(bb)) ; // [객체 객체]
alert(Number(bb)); // 10 valueOf
alert(bb == '10') // true valueOf


다르죠? ! 위의 toString만큼 통일되고 규칙적이지는 않습니다.
그 [객체 Object]는 Object에서 상속된 것 같습니다. 제거하고 살펴보겠습니다.
코드 복사 코드는 다음과 같습니다.

Object.prototype.toString = null
var cc = {
i: 10,
valueOf: function() {
console.log('valueOf')
return this.i;

alert(cc); // 10 valueOf

alert( cc); // 10 valueOf
alert('' cc) // 10 valueOf
alert(String(cc) ); // 10 valueOf
alert(Number(cc)); // 10 valueOf
alert(cc == '10'); // true valueOf


요약: 이는 작업에 편향되어 있고 toString은 표시에 편향되어 있습니다.

1. 객체를 변환할 때(예: 경고(a)) toString 메서드가 먼저 호출됩니다. toString이 재정의되지 않으면 valueOf 메서드가 호출되지만 toString 출력은 다음과 같습니다. 객체는 입니다.
2. 강제로 문자열 형식으로 변환하는 경우 toString 메서드가 먼저 호출되고, 강제로 숫자로 변환하는 경우 valueOf 메서드가 먼저 호출됩니다.
3. 연산 연산자가 있는 경우 valueOf가 toString보다 우선순위가 높습니다.
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿