聊一聊 JS 輸出為 [object object] 是怎么回事?
今天在學習ES6中的 Symbol 資料型別時,在寫demo時控制臺輸出為 Symbol[object object] ,當時有點疑惑,查閱了相關資料后搞清楚了其中的原因,
在解釋之前,由于有些小伙伴可能還沒有接觸過ES6,所以先說一下上面用到的ES6的一些特性:
const: 宣告一個常量
Symbol:JS中的第7種資料型別,表示獨一無二的值,Symbol型別的值有Symbol函式生成,
如
var s1 = Symbol("abc");// 生成Symbol型別的值s=Symbol(abc)這個值是獨一無二的,
var s2 = Symbol("abc");//s2 = Symbol(abc)
console.log(s1 === s2)// false, 說明這兩個值是不相等的如果 Symbol 的引數是一個物件,那么就會呼叫
toString()方法先將其轉換為字串,關于 Symbol 更詳細的介紹可以參考阮一峰老師的ES6標準入門,
現在上那段輸出 Symbol[object object] 的代碼:
const obj = {
f() {
return "abc";
}
};
const sym = Symbol(obj);
console.log(sym); // Symbol[object object]
由于 obj 是一個物件,所以會呼叫 toString() 方法將其轉換為字串,對 toString 方法不太了解的小伙伴可以查看下面MDN的解釋:
- 除了
null和undefined之外,其他的型別(數值、布爾、字串、物件)都有toString()方法,它回傳相應值的字串表現(并不修改原變數),- 每個物件都有一個
toString()方法,- 當該物件被表示為一個文本值時,或者一個物件以預期的字串方式參考時自動呼叫,
- 默認情況下,
toString()方法被每個Object物件繼承,如果此方法在自定義物件中未被覆寫,toString()回傳 "[object type]",其中type是物件的型別,
obj是我們自定義的物件,而且 toString() 方法也沒有被覆寫,所以會回傳 [object object],
現在我們嘗試覆寫 toString() 方法,如下面的代碼所示:
// ES5寫法
var obj = {
toString: function() {
return "abc";
}
};
// ES6寫法
const obj = {
toString() {
return "abc";
}
};
const sym = Symbol(obj);
console.log(sym); // Symbol(abc)
當我們覆寫掉 toString() 方法之后,自定義物件 obj 在呼叫 toString() 方法的時候呼叫的就是我們自定義的 toString() 方法, 輸出為 "abc" ,因此最終的結果為 Symbol(abc),
完,如有不恰當之處歡迎指正哦,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/125539.html
標籤:其他
