JavaScript 프로그램 작성 프로세스 중에 JS는 객체를 자동으로 숫자 또는 문자열로 변환 한 다음 다른 컨텍스트에 따라 처리합니다. 이 자동 변환의 규칙은 다음과 같습니다.
객체를 string으로 자동 변환하기위한 규칙 :
1. 객체가 클래스에 속한 경우 ToString () 메소드를 무시하면 메소드가 호출됩니다. ToString () 호출의 반환 결과가 원시 (문자열, 번호, 부울, 정의되지 않은, null) 인 경우 원시 값이 문자열로 변환되어 반환됩니다.
2. TOSTRING () 메소드가 클래스 TOSTRING ()에 의해 재정의되지 않으면 TOSTRING () 호출의 반환 결과는 "[Object Object]"입니다. 또는 toString () 메소드가 재정의되지만 메소드는 결과를 객체로 반환합니다. 그러면 JS는 객체의 valueof () 메소드를 호출합니다. valueof () 호출의 반환 결과가 Primitive (문자열, 번호, 부울, 정의, null) 인 경우 원시 값을 문자열로 변환하고 리턴합니다.
3. 위의 점 중 어느 것도 충족되지 않고 객체의 toString () 메소드 또는 valueOf () 메소드를 호출하여 원시 값을 얻을 수없는 경우, JS는 TypeError 오류를 던집니다.
객체를 자동으로 숫자로 변환하는 규칙 :
1. valueof () 메소드의 객체를 호출하십시오. 원시 값이 얻어지면 원시 값을 숫자로 변환하여 반환하십시오.
2. valueof () 메소드에서 원시 값을 얻을 수없는 경우 객체의 toString () 메소드를 호출하십시오. ToString ()이 기본 값을 반환하면 원시 값을 숫자로 변환하고 반환하십시오.
3. 위의 두 지점 중 어느 것도 충족 할 수 없으면 JS는 TypeError 오류를 던집니다.
객체를 자동으로 문자열로 변환하고 객체를 숫자로 자동 변환하는 규칙이 실제로 동일하다는 것을 알 수 있습니다. 차이점은 call toString () 메소드 및 valueof () 메소드의 순서입니다.
위의 규칙에 따르면, 일부 전환 결과는 잘 이해 될 수 있습니다.
1. 빈 배열의 경우 숫자로 변환 할 때 결과는 0입니다. () 배열의 값이 먼저 호출되기 때문입니다. valueOf ()는 배열 객체 자체를 반환하기 때문에 JS는 다음으로 빈 배열의 toString () 메소드를 호출합니다. 빈 배열 toString ()의 결과가 빈 문자열로 돌아 가기 때문에 빈 문자열은 결국 숫자 0으로 변환되어 반환됩니다.
2. 숫자 멤버가 하나만있는 배열의 경우 동일한 규칙을 적용하여 숫자로 변환하면 최종 결과는 숫자입니다.
3. 여러 숫자 멤버가있는 배열의 경우 문자열을 숫자로 변환 할 수 없으므로 최종 결과는 NAN입니다.
문자열로 언제 변환해야합니까? 언제 번호로 변환해야합니까?
객체에서 자동 유형 변환을 수행 할 때 JS는 객체 유형 및 연산자에 따라 문자열 또는 숫자로 변환하도록 선택합니다. 특정 규칙은 다음과 같습니다.
1. + 연산자의 양쪽에 객체가 나타나면 객체를 문자열로 변환하십시오.
2. 모든 객체 (날짜 개체 제외)는 먼저 숫자로 변환됩니다.
3. 날짜 개체의 경우 우선 순위가 문자열로 변환됩니다.
연산자의 양쪽에 객체 또는 문자열이 나타나는 경우를 제외하고 + 연산자의 경우 다른 경우 "숫자로 변환"의 작동이 수행됩니다. 동시에이 작업은 값 간 순서와도 관련이 있습니다.
실험
코드 사본은 다음과 같습니다.
Console.log (3 * []); // 0
Console.log (3 * [2]); // 6
Console.log (3 * [1,2]); // nan
Console.log (3 + [2]); // 32
var now = 새 날짜 ();
Console.log (지금 + 1); // Wed 2014 년 3 월 26 일 10:51:39 GMT + 0800 (CST) 1
Console.log (지금 -1); // 1395802299223
Console.log (지금 * 2); // 2791604598448
Console.log (true + true); // 2
console.log (2 + null); // 2, null은 0으로 변환됩니다
console.log (2 + undefined); // nan, undefined는 nan으로 변환됩니다
Console.log (1 + 2 + "고양이"); // 3 고양이
Console.log (1 + (2 + "고양이"); // 12 고양이