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
'IT story' 카테고리의 다른 글
ReactJS SyntheticEvent stopPropagation ()은 React 이벤트에서만 작동합니까? (0) | 2020.08.02 |
---|---|
창 관리자에 안드로이드 뷰가 첨부되지 않음 (0) | 2020.08.02 |
Android Studio 프로젝트에 지원 라이브러리 추가 (0) | 2020.08.02 |
메소드 인수에서 NotNull 어노테이션 사용 (0) | 2020.08.02 |
docker-compose.yml에서 시작점으로 인수를 전달하는 방법 (0) | 2020.08.02 |