programing

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

telecom 2023. 7. 24. 22:16
반응형

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

Javascript에는 유형과 유형 변환에 대한 "꼼수"가 많은데, 이 두 가지 방법이 동일한지 아니면 다른 코너 케이스가 있는지 궁금합니다.

그들은 완전히 같지는 않으며, 실제로 함수로 호출되는 문자열 생성자(첫 번째 예)는 마지막에 다음과 같이 호출합니다.toString전달된 개체의 메서드, 예:

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

반면에, 식별자가 언급하는 경우.null또는undefined당신은 그것을 사용할 수 없습니다.toString메소드는 예외를 제공합니다.

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

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

value + '';

개체에서 원시 형식으로 변환 규칙은 내부 작업 사양에 자세히 설명되어 있습니다.

요약하면 개체에서 문자열로 변환할 때 다음 단계를 수행합니다.

  1. 사용 가능한 경우 다음을 실행합니다.toString방법.
    • 만약에result원시적인, 귀환입니다.result그렇지 않으면 2단계로 이동합니다.
  2. 사용 가능한 경우 다음을 실행합니다.valueOf방법.
    • 만약에result원시적인, 귀환입니다.result그렇지 않으면 3단계로 이동합니다.
  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
}

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

또한 이 기사를 읽는 것을 추천합니다.

value.toString()다음과 같은 경우 오류가 발생합니다.valuenull이거나 정의되지 않았습니다.String(value)해서는 안 됩니다.

예:

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

때문에 실패할 것입니다.value == null.

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

메시지에 "crash"(또는 이와 유사함)가 표시되어야 하지만 충돌하지 않습니다.

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

방금 ES6에서 이것을 사용해 봤는데,String()보다valueOf()물체의 내부에, 물체는 가지고 있어야 합니다.toString()방법.개체에 다음이 없는 경우toString()그러면 콘솔이 반환됩니다.'[object Object]'가 있든 없든 간에valueOf()그렇지 않으면.그래서 첫 번째 "단계"에서, 우리는 항상 다음과 같이 해야 합니다.toString()상관없이 다른String()방법은 고려하지 않을 것valueOf.

다음을 확인하십시오.

let obj = {
    name:'b',
    age:22,
    valueOf: function(){
        return 'heeee';
    }
}

String(obj); // prints '[object Object]'

반면에,

let obj = {
    name:'b',
    age:22,
    toString:null,
    valueOf: function(){
        return 'heeee';
    }
}
String(obj); // prints 'heeee'

let obj = {
  name: 'b',
  age: 22,
  valueOf: function() {
    return 'heeee';
  }
}

console.log(String(obj));

let obj2 = {
  name: 'b',
  age: 22,
  toString: null,
  valueOf: function() {
    return 'heeee';
  }
}

console.log(String(obj2));

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

.toString() 및 String()은 기본값(숫자, 부울, 문자열)에 대해 호출할 수 있으며 기본적으로 특별한 작업은 수행하지 않습니다.

true => 'true'

false => 'false'

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()는 개체를 문자열로 처리할지 숫자로 처리할지 여부에 관계없이 호출됩니다.

언급URL : https://stackoverflow.com/questions/3945202/whats-the-difference-between-stringvalue-vs-value-tostring

반응형