有這樣一個面試題:
此題考查的是其他型別的值轉換為字串後的結果
下面我們就由此來總結一下其他型別的值轉為字串後的值都是什麼?
從上面的例項可以看出,基本資料型別的值轉換成字串都如我們預期的那樣。但是對於object物件,轉換為字串卻出乎我們的意料,都是 [object Object]。兩個不同的物件{key:123}和{key:456}轉換成字串都是相同的值 '[object Object]'。
需要我們注意的是 toString() 方法是Object的原型方法,由於js中一切都是物件,所有的型別的值都繼承了這個方法,而 Object.prototype.toString.call() 也可以用來判斷物件的型別,是判斷型別值的最準確的方法。
特別提醒:除了Object物件之外,其他型別直接呼叫 toString() 方法和通過 Object.prototype.toString.call() 使用得到的結果是截然不同的,直接呼叫是轉換為字串,而通過 Object.prototype.toString.call() 來使用的話就是判斷型別了,得到的結果是類似 [object type] 的結果。其中type代表型別,首字母也是大寫。
判斷資料型別的方法詳情見我另一篇博文js中判斷型別的四種方法。
解析程式碼如下:
TIPS:
物件的鍵名可以是字串和Symbol值,所以當鍵名為除了字串和Symbol值以外的其他型別值時,都是需要轉換為字串的,
但是注意,如果是Symbol值,可以直接當做鍵名
鍵名在物件中存在時,可以不要引號,但是通過a[b]的方式呼叫鍵名時,此時b必須是帶有引號的字串
對於第一題:a[b] = 'b' ==> a['123'] = 'b', a[c] = 'c' ==> a['123'] = 'c'
相當於先給 a['123'] 賦值為字串 'b',在給它賦值為字串 'c',所以最後物件a為 {123:'c'}
對於第二題:由於Symbol的值是唯一的,所以 b 不等於 c,
此時物件a 的值為 {Symbol('123') : 'b',Symbol('123') : 'c'}
對於第三題:{key:123}和{key:456}呼叫toString方法轉換為字串的值同為 '[object Object]',所以跟第一題一樣,
此時物件a的值為 {[object Object] : 'c'}
所以上面面試題的答案是:'c','b','c'。
總結:
1.Object物件轉換為字串和判斷資料型別都是直接呼叫 toStirng() 方法,得到的結果都是 [object Object]。
2.除了Obeject之外的其他型別,直接呼叫 toStirng() 方法,可以轉換為字串型別,判斷資料型別得用 Object.prototype.toString.call() 方法!