[javascript] String (value) 대 value.toString ()의 차이점은 무엇입니까?

Javascript에는 유형 및 유형 변환에 대한 “트릭”이 많이 있으므로이 두 가지 방법이 동일한 지 아니면 다른 경우가 있는지 궁금합니다.



답변

그것들은 완전히 동일하지 않으며 실제로 함수로 호출 된 String 생성자 (첫 번째 예)는 마지막에 toString전달 된 객체 의 메서드를 호출합니다 . 예를 들면 다음과 같습니다.

var o = { toString: function () { return "foo"; } };
String(o); // "foo"

식별자가 참조하는 경우 반면에, null또는 undefined, 당신은 사용할 수없는 toString방법을 당신에게 줄 것이다 TypeError예외 :

var value = null;
String(null);     // "null"
value.toString(); // TypeError

String함수로 호출 되는 생성자는 대략 다음과 같습니다.

value + '';

Object -to- Primitive 의 유형 변환 규칙 은 사양, [[DefaultValue]]내부 작업 에 자세히 설명되어 있습니다.

간단히 요약하면 Object -to- String 에서 변환 할 때 다음 단계가 수행됩니다.

  1. 가능한 경우 toString메서드를 실행합니다 .
    • 이 경우 resultA는 기본 , 복귀 result2 단계, 다른 이동.
  2. 가능한 경우 valueOf메서드를 실행합니다 .
    • 이 경우 resultA는 기본 , 복귀 result3 단계, 다른 이동.
  3. 던져 TypeError.

위의 규칙이 주어지면 관련된 의미 체계의 예를 만들 수 있습니다.

var o = {
  toString: function () { return "foo"; },
  valueOf:  function () { return "bar"; }
};

String(o); // "foo"

// Make the toString method unavailable:
o.toString = null;

String(o); // "bar"

// Also make the valueOf method unavailable:
o.valueOf = null;

try {
  String(o);
} catch (e) {
  alert(e); // TypeError
}

이 메커니즘에 대해 더 알고 싶다면 ToPrimitiveToString내부 작업을 살펴 보는 것이 좋습니다 .

또한이 기사를 읽는 것이 좋습니다.


답변

value.toString()valuenull 인 경우 오류가 발생합니다 . String(value)하지 말아야합니다.

예를 들면 :

var value = null;
alert(value.toString());

때문에 실패합니다 value == null.

var value = null;
alert(String(value));

“null”(또는 이와 유사한) 메시지를 표시해야하지만 충돌하지는 않습니다.


답변

String(value)또는 value.toString()같은 속성이없는 값을 제외하고 모든 경우 와 동일한 결과를 가져야합니다 . 동일한 결과를 생성합니다.nullundefined''+value


답변

String () [ 생성자 호출 ]은 기본적으로 .toString ()을 호출합니다.

.toString ()String () 은 기본 값 (number, boolean, string)에서 호출 될 수 있으며 기본적으로 특별한 작업은 수행하지 않습니다.

참 => ‘참’

거짓 => ‘거짓’

17 => ’17’

‘안녕하세요’=> ‘안녕하세요’

그러나 객체에 대해 이러한 함수를 호출하는 것이 흥미로운 부분입니다.

객체에 자체 .toString () 함수가있는 경우이 객체를 문자열 (명시 적으로 / 암시 적으로)으로 처리해야 할 때마다 호출됩니다.

let obj = {
           myName:"some object",
           toString:function(){ return this.myName; }
          }

//implicitly treating this obj as a string
"hello " + obj; //"hello some object"

//OR (explicitly)
"hello " + String(obj) //calling the existent toString function

//OR
"hello " + obj.toString(); //calling toString directly

그런데이 객체를 숫자로 취급하려면 .valueOf () 함수가 정의되어 있어야합니다.

하나의 객체에 둘 다 있으면 어떨까요?

이 객체를 문자열로 취급하려면 => .toString () 사용

이 객체를 숫자로 취급하려면 => .valueOf () 사용

우리는 무엇을 한 경우 .valueOf () 정의?

객체 내부에 정의 된 .valueOf () 는 객체를 문자열로 처리하든 숫자로 처리하든 상관없이 호출됩니다.


답변