JavaScript 프로그램 작성 과정에서 JS는 처리하기 전에 다양한 컨텍스트에 따라 객체를 자동으로 숫자나 문자열로 변환합니다. 자동 변환 규칙은 다음과 같습니다.
객체를 문자열로 자동 변환하는 규칙:
1. 객체가 속한 클래스가 toString() 메서드를 재정의하는 경우 이 메서드를 호출합니다. toString() 호출의 반환 결과가 Primitive(문자열, 숫자, 부울, 정의되지 않음, null)인 경우 Primitive 값을 문자열로 변환하여 반환합니다.
2. 객체가 속한 클래스가 toString() 메서드를 재정의하지 않는 경우 - toString() 호출의 반환 결과는 "[object Object]"이거나 toString() 메서드가 재정의되었지만 메소드는 객체를 반환합니다. 그런 다음 JS는 객체의 valueOf() 메서드를 호출합니다. valueOf() 호출의 반환 결과가 Primitive(문자열, 숫자, 부울, 정의되지 않음, null)인 경우 Primitive 값이 문자열로 변환되어 반환됩니다.
3. 위의 두 가지 사항 중 어느 것도 충족되지 않고 객체의 toString() 메서드 또는 valueOf() 메서드를 호출하여 Primitive 값을 얻을 수 없는 경우 JS는 TypeError를 발생시킵니다.
객체를 숫자로 자동 변환하는 규칙:
1. 객체의 valueOf() 메서드를 호출합니다. 얻은 값이 Primitive 값인 경우 Primitive 값을 숫자로 변환하여 반환합니다.
2. valueOf() 메서드에서 Primitive 값을 얻을 수 없으면 객체의 toString() 메서드를 호출하고, toString()이 Primitive 값을 반환하면 Primitive 값을 숫자로 변환하여 반환합니다.
3. 위의 두 가지 사항 중 어느 것도 충족되지 않으면 JS는 TypeError를 발생시킵니다.
보시다시피 객체를 문자열로 자동 변환하는 규칙과 객체를 숫자로 자동 변환하는 규칙은 실제로 toString() 메서드와 valueOf() 메서드의 호출 순서에 있습니다.
위의 규칙에 따르면 일부 변환 결과를 잘 이해할 수 있습니다.
1. 빈 배열의 경우 숫자로 변환하면 결과는 0입니다. 이는 array의 valueOf() 메서드가 먼저 호출되기 때문입니다. valueOf()는 배열 객체 자체를 반환하므로 JS는 빈 배열의 toString() 메서드를 호출합니다. array는 null 문자이므로 빈 문자열은 결국 숫자 0으로 변환되어 반환됩니다.
2. 숫자 멤버가 하나만 있는 배열의 경우 동일한 규칙을 적용하여 숫자로 변환하면 최종 결과는 숫자가 됩니다.
3. 숫자 멤버가 여러 개인 배열의 경우 문자열을 숫자로 변환할 수 없으므로 최종 결과는 NaN입니다.
언제 문자열로 변환되나요? 언제 숫자로 변환되나요?
객체에 대해 자동 유형 변환을 수행할 때 JS는 객체 유형 및 연산자에 따라 이를 문자열 또는 숫자로 변환하도록 선택합니다. 구체적인 규칙은 다음과 같습니다.
1. 연산자 양쪽에 객체가 나타나면 객체를 문자열로 변환합니다.
2. Date 객체를 제외한 모든 객체는 먼저 숫자로 변환됩니다.
3. Date 객체의 경우 먼저 문자열로 변환합니다.
연산자의 경우 객체나 문자열이 연산자의 양쪽에 나타나는 경우를 제외하고 다른 모든 경우에는 "숫자로 변환" 작업이 동시에 수행된다는 점에 주목할 가치가 있습니다. 값 사이의 순서.
실험
console.log(3 [2]);//32
var now = new Date();
console.log(현재 1);//2014년 3월 26일 수요일 10:51:39 GMT 0800 (CST)1
console.log(현재 - 1);//1395802299223
console.log(현재 * 2);//2791604598448
console.log(참 참);//2
console.log(2 null);//2, null은 0으로 변환됩니다
console.log(2 undefine);//NaN, undefine은 NaN으로 변환됩니다
console.log(1 2 "고양이");//고양이 3마리
console.log(1 (2 "고양이"));//고양이 12마리