더 구체적으로 말하자면, 일반적으로 valueOf와 toString 두 메서드 중 하나만 호출할 수 있으며, 개체 유형에 따라 다른 판단 순서가 있습니다. 구체적으로: 1. 객체를 문자열로 변환하려면 먼저 객체에 toString() 메서드가 있는지 감지하고 이를 호출하여 원래 값을 반환한 다음 값을 문자열로 변환합니다. 객체에 toString() 메서드가 없거나 이 메서드가 기본 값을 반환하지 않는 경우. 그런 다음 js는 객체에 valueOf() 메서드가 있는지 여부를 감지하고 존재하는 경우 이를 호출하고 원래 값을 호출하여 반환한 다음 이 값을 문자열로 변환합니다. 객체의 valueOf 메서드와 toString 메서드가 모두 없으면 TypeError 예외가 발생합니다. 2. 객체를 숫자로 변환하려는 경우 valueOf() 메서드가 있는지 감지합니다. toString() 메서드를 감지하지 못하는 경우 구체적인 원리는 위와 같습니다. 3. 날짜가 아닌 모든 객체의 경우 객체를 기본 값으로 변환하는 것은 기본적으로 객체를 숫자로 변환하는 것이며, 모두 valueof()를 먼저 호출하면 객체를 문자열로 변환하는 모드입니다. 사용됩니다. 귀하의 질문에 따라 a는 날짜 객체가 아니므로 valueof() 메서드가 먼저 호출됩니다. 성공적인 변환 후에는 toString() 메서드가 자연스럽게 다시 호출되지 않습니다.
이것은 js의 구문 분석 메커니즘이므로 "+"를 사용하면 암시적 변환을 사용하는 데 문제가 있음을 나타냅니다. 특별한 조항이 없으면 js는 변환과 같은 toString 메서드를 자동으로 호출합니다. valueOf를 쓰면 valueOf에 따라 변환됩니다. 물론 toString이 더 높은 우선순위를 가집니다
더 구체적으로 말하자면, 일반적으로 valueOf와 toString 두 메서드 중 하나만 호출할 수 있으며, 개체 유형에 따라 다른 판단 순서가 있습니다. 구체적으로:
1. 객체를 문자열로 변환하려면 먼저 객체에 toString() 메서드가 있는지 감지하고 이를 호출하여 원래 값을 반환한 다음 값을 문자열로 변환합니다. 객체에 toString() 메서드가 없거나 이 메서드가 기본 값을 반환하지 않는 경우. 그런 다음 js는 객체에 valueOf() 메서드가 있는지 여부를 감지하고 존재하는 경우 이를 호출하고 원래 값을 호출하여 반환한 다음 이 값을 문자열로 변환합니다. 객체의 valueOf 메서드와 toString 메서드가 모두 없으면 TypeError 예외가 발생합니다.
2. 객체를 숫자로 변환하려는 경우 valueOf() 메서드가 있는지 감지합니다. toString() 메서드를 감지하지 못하는 경우 구체적인 원리는 위와 같습니다.
3. 날짜가 아닌 모든 객체의 경우 객체를 기본 값으로 변환하는 것은 기본적으로 객체를 숫자로 변환하는 것이며, 모두 valueof()를 먼저 호출하면 객체를 문자열로 변환하는 모드입니다. 사용됩니다.
귀하의 질문에 따라 a는 날짜 객체가 아니므로 valueof() 메서드가 먼저 호출됩니다. 성공적인 변환 후에는 toString() 메서드가 자연스럽게 다시 호출되지 않습니다.
a+'1'을 실행하면 a.valueOf 메소드만 호출되고 toString 메소드는 호출되지 않습니다. 먼저 toValueOf 및 toString 메소드의 메커니즘을 이해할 수 있습니다.
JS 구문 분석 메커니즘의 문제
이것은 js의 구문 분석 메커니즘이므로 "+"를 사용하면 암시적 변환을 사용하는 데 문제가 있음을 나타냅니다. 특별한 조항이 없으면 js는 변환과 같은 toString 메서드를 자동으로 호출합니다. valueOf를 쓰면 valueOf에 따라 변환됩니다. 물론 toString이 더 높은 우선순위를 가집니다
덧셈 연산을 할 때는 valueOf만 호출하게 됩니다. 출력되지 않기 때문에 문자열로 변환할 필요도 없고 당연히 toString도 실행되지 않습니다.
으아아아이렇게 출력해 보면 두 메소드가 모두 호출되는 것을 볼 수 있습니다: