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


105

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

답변:


123

그것들은 완전히 동일하지 않으며 실제로 함수로 호출 된 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내부 작업을 살펴 보는 것이 좋습니다 .

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


1
이것을 호출하면 세 번째 "방법"이 있습니다. new String(value)어떤 값에 대해서도 항상 문자열 객체를 반환합니다.
Herbertusz

@Herbertusz new String({toString: null})TypeError.
Константин Ван jul.

심볼의 추가로 String()하고 + ''지금은 상당히 큰 차이가있다. String(Symbol())실행되지만 Symbol() + ''오류가 발생합니다 (그리고 Symbol ()은 null 및 undefined와 달리 거짓 가드를 전달하므로 x && (x + '')이제 throw 할 수 있습니다).
yeerk

24

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

예를 들면 :

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

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

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

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


3
나는 자바 스크립트에서 널 포인터 예외를 본 적이 없습니다 ... 어디에서 보았습니까?
Dagg Nabbit

좋은. 예를 들면 더 좋을 것입니다
mykhal

@no, @casablanca 수정 됨. 저는 Java에 익숙합니다. @mykhal 어떻게 보이나요?
Jonathan

"null"문자열을 반환합니다. :)
moefinley

1

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


1

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 () 는 객체를 문자열로 처리하든 숫자로 처리하든 상관없이 호출됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.