IT story

Javascript의 valueOf () 대 toString ()

hot-time 2020. 8. 2. 17:20
반응형

Javascript의 valueOf () 대 toString ()


Javascript에서 모든 객체에는 valueOf () 및 toString () 메소드가 있습니다. 문자열 변환이 호출 될 때마다 toString () 메서드가 호출되었다고 생각했을 것입니다. 그러나 분명히 valueOf ()에 의해 나옵니다.

예를 들어, 코드

var x = {toString: function() {return "foo"; },
         valueOf: function() {return 42; }};
window.console.log ("x="+x);
window.console.log ("x="+x.toString());

인쇄합니다

x=42
x=foo

예를 들어, 만약 x가 복소수라면 valueOf ()가 그 크기를 알려주기를 원하지만 문자열로 변환하고 싶을 때마다 "a + bi"와 같은 것을 원할 것입니다. 그리고 문자열을 암시하는 컨텍스트에서 명시 적으로 toString ()을 호출하고 싶지 않습니다.

이것이 바로 그 방법입니까?


( "x ="+ x)가 "x = tostring"이 아닌 "x = value"를 제공하는 이유는 다음과 같습니다. "+"를 평가할 때, 자바 스크립트는 먼저 피연산자의 프리미티브 값을 수집 한 다음 각 프리미티브의 유형에 따라 추가 또는 연결을 적용할지 여부를 결정합니다.

이것이 여러분이 생각하는 방식입니다

a + b:
    pa = ToPrimitive(a)
    if(pa is string)
       return concat(pa, ToString(b))
    else
       return add(pa, ToNumber(b))

이것이 실제로 일어나는 일입니다

a + b:
    pa = ToPrimitive(a)
    pb = ToPrimitive(b)*
    if(pa is string || pb is string)
       return concat(ToString(pa), ToString(pb))
    else
       return add(ToNumber(pa), ToNumber(pb))

즉, toString은 원래 객체가 아닌 valueOf의 결과에 적용됩니다.

자세한 내용 은 ECMAScript 언어 사양의 11.6.1 추가 연산자 (+) 섹션을 참조하십시오 .


* 문자열 컨텍스트에서 호출 될 때 ToPrimitive toString을 호출하지만 '+'는 유형 컨텍스트를 적용하지 않기 때문에 여기서는 그렇지 않습니다.


대답에 도달하기 전에 조금 더 자세히 설명하겠습니다.

var x = {
    toString: function () { return "foo"; },
    valueOf: function () { return 42; }
};

alert(x); // foo
"x=" + x; // "x=42"
x + "=x"; // "42=x"
x + "1"; // 421
x + 1; // 43
["x=", x].join(""); // "x=foo"

toString기능은 일반적으로 "트럼프" 되지 않습니다valueOf . ECMAScript 표준은 실제로이 질문에 아주 잘 대답합니다. 모든 객체에는 [[DefaultValue]]요청시 계산되는 속성이 있습니다. 이 속성을 요청할 때 인터프리터는 어떤 종류의 값을 기대할 수 있는지에 대한 "힌트"도 제공합니다. 힌트가 String이면 toString이전에 사용됩니다 valueOf. 힌트는하지만, Number다음, valueOf먼저 사용됩니다. 하나만 존재하거나 기본이 아닌 것을 반환하는 경우 일반적으로 다른 하나를 두 번째 선택으로 호출합니다.

+작업자는 항상 힌트를 제공하는 Number첫 번째 피연산자 문자열 값이더라도. 비록 그것이 요청 x의 대한 Number첫 번째 피연산자가 문자열에서 반환하기 때문에, 표현 [[DefaultValue]]은 문자열 연결을 수행합니다.

toString문자열 연결에 대한 호출 을 보장 하려면 배열과 .join("")메소드를 사용하십시오.

(ActionScript 3.0은의 동작을 약간 수정합니다 +. 피연산자 중 하나가이면 String문자열 연결 연산자로 취급하고을 String호출 할 때 힌트를 사용 합니다 [[DefaultValue]]. 따라서 AS3에서이 예는 "foo, x = foo, foo를 생성합니다. = x, foo1, 43, x = foo ").

참고 URL : https://stackoverflow.com/questions/2485632/valueof-vs-tostring-in-javascript

반응형