1纬凤、來看一些奇怪的現(xiàn)象
-
console.log("ABC" instanceof String)
>>false
也就是說字符串的字面量并不是String
對象的實例 -
console.log("ABC" instanceof Object)
>>false
字符串的字面量甚至不是個Object
的實例 -
console.log("ABC".indexOf === String().indexOf)
>>true
-
console.log("ABC". includes === String(). includes)
>>true
...
這就很奇怪了為什么字符串的字面量不是String
對象(甚至不是個對象)的實例卻擁有String
的方法呢易阳?
2、復習下基本數(shù)據(jù)類型
在 JavaScript 中勤庐,基本類型(基本數(shù)值、基本數(shù)據(jù)類型)是一種既非對象也無方法或屬性的數(shù)據(jù)狱窘。有 7 種原始數(shù)據(jù)類型:
以上摘自 MDN
-
typeof 'ABC'
>>string
-
typeof new String('ABC')
>>object
運行以上代碼可以發(fā)現(xiàn)货葬,字面量字符串確實只是基本類型string
且與String
實例對象是不同的。
3贴届、既然是基本類型如何做到擁有String
對象的方法呢靠粪?
基本類型沒有方法,但仍然表現(xiàn)得像有方法一樣毫蚓。當在基本類型上訪問屬性時占键,JavaScript 自動將值裝入包裝器對象中,并訪問該對象上的屬性绍些。例如捞慌,
"foo".includes("f")
隱式創(chuàng)建了一個String
包裝對象耀鸦,并在該對象上調用String.prototype.includes()
柬批。這種自動裝箱行為在 JavaScript 代碼中是無法觀察到的啸澡,但卻是各種行為的一個很好的心理模型——例如,為什么“改變”基本類型不起作用(因為str.Foo = 1
不是賦值給str
本身的Foo
屬性氮帐,而是賦值給了一個臨時包裝器對象)
以上摘自 MDN
其實MDN中已經解釋得很清楚了嗅虏,當訪問訪問屬性時其實是訪問量一個臨時被包裝成 String
實例的對象。
這種隱式自動裝箱行為在其他幾個有對應包裝類型的基本類型中也會發(fā)生:
類型 | 包裝器對象 |
---|---|
null |
N/A |
undefined |
N/A |
boolean |
Boolean |
number |
Number |
bigInt |
BigInt |
string |
String |
symbol |
Symbol |
根據(jù)以上我們其實可以得出結論:
JavaScript 中除了 null
和 undefined
一切皆可以表現(xiàn)為對象上沐。