簡體   English   中英

String(value) 與 value.toString() 有什么區別

[英]What's the difference between String(value) vs value.toString()

Javascript 在類型和類型轉換方面有很多“技巧”,所以我想知道這兩種方法是否相同,或者是否有一些極端情況使它們不同?

它們並不完全相同,實際上,作為函數調用的 String 構造函數(您的第一個示例)將在最后調用傳遞的對象的toString方法,例如:

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

另一方面,如果標識符引用nullundefined ,則不能使用toString方法,它會給您一個TypeError異常

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

作為函數調用的String構造函數大致相當於:

value + '';

ObjectPrimitive的類型轉換規則在規范中詳細描述, [[DefaultValue]]內部操作。

簡單總結一下,從ObjectString 的轉換時,采取了以下步驟:

  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
}

如果您想了解有關此機制的更多信息,我建議您查看ToPrimitiveToString內部操作。

我還推薦閱讀這篇文章:

如果value為 null 或 undefined, value.toString()將導致錯誤。 String(value)不應該。

例如:

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

會失敗,因為value == null

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

應該顯示一條消息“null”(或類似的),但它不會崩潰。

String(value)在任何情況下都應該與value.toString()具有相同的結果,除了沒有像nullundefined這樣的屬性的null ''+value將產生相同的結果。

String() [構造函數調用] 基本上是調用.toString()

.toString()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()

我剛剛用 ES6 嘗試了這個,發現要讓String()查看對象內部的valueOf() ,對象必須有toString()方法。 如果對象沒有toString()那么無論是否有valueOf()控制台都會返回'[object Object]' 因此,在第一個“步驟”中,無論如何我們總是必須使用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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM