본문 바로가기

IT/개발자

String()과 toString()의 차이

반응형

Javascript에서 코딩 중. 궁금해져서 찾아본 차이.

요약하자면,

  1. String()과 toString()은 동작하는 방식이 다르다.
  2. String(value)로 부르는 경우 value object의 마지막에 toString() 함수를 호출하여 값을 가져옴.
  3. toString(value)의 경우, null이나 undefined일 경우, TypeError Exception이 발생함. (위의 경우는 "null")
  4. String(value) 방식은 toString()함수를 호출할때, primitive 값이 없으면, valueOf()함수를 리턴하고, 해당 함수의 리턴 값마저 primitive 값이 없으면, TypeError Exception이 발생함.

<Stack Overflow 에서 찾은 답변. 링크

They are not completely the same, and actually, the String constructor called as a function (your first example), will at the end, call the toString method of the object passed, for example:

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

On the other hand, if an identifier refers to null or undefined, you can't use the toString method, it will give you a TypeError exception:

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

The String constructor called as a function would be roughly equivalent to:

value + '';

The type conversion rules from Object-to-Primitive are detailed described on the specification, the [[DefaultValue]] internal operation.

Briefly summarized, when converting from Object-to-String, the following steps are taken:

  1. If available, execute the toString method.
    • If the result is a primitive, return result, else go to Step 2.
  2. If available, execute the valueOf method.
    • If the result is a primitive, return result, else go to Step 3.
  3. Throw TypeError.

Given the above rules, we can make an example of the semantics involved:

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
}

 

반응형