js中的基本類型有
Null
,Undefined
,String
,Number
,Boolean
,Symbol
等,
其中爲了便於操作基本類型值,ECMAScript還提供了String
,Number
,Boolean
這三個特殊的引用類型.這就是我們今天的主角——基本包裝類型.
我們先來看下面的代碼,思考下代碼的運行結果:
var s = 'str'
s.name = 'string'
console.log(s.name) // undefined
這裏s.name
爲什麼結果不是'string'
而是undefined
呢?
這樣因爲每當我們讀取一個基本類型值的時候,後臺會自動創建一個對應的基本包裝類型的對象,代碼如下:
var s = 'str' // string 基本類型
s.name = 'string' // 下面{}中的是執行到這裏的時候,後臺自動執行的操作僞代碼
{
var _s = new String('str') // 通過包裝對象創建出一個和基本類型值相同的對象
_s.name = 'string' // 給這個對象賦值
_s = null // 臨時變量被銷燬
}
console.log(s.name) // 下面{}中的是執行到這裏的時候,後臺自動執行的操作僞代碼
{
var _s = new String('str')
_s.name // _s這個對象沒有name這個屬性,返回undefined
_s = null // 臨時變量被銷燬
}
實際上,這些後臺的操作基本就是一瞬間的事情,這也是基本包裝類型和引用類型的區別:生存期
.
引用類型創建的對象,在執行期間是一直存在於內存當中的,而基本包裝類型只存在一瞬間
我們再來看下面的例子:
var s = 'str'
var t = 'str'.substr(1,2)
// {}中的是在後臺自動執行的僞代碼
{
var _s = new String('str') // 創建一個String基本包裝類型
var t = _s.substr(1,2) // 而_s是有substr()這個內置方法的,返回方法結果
_s = null // // 臨時變量被銷燬
}
console.log(t) // tr
從上可以得出一個基本包裝類型的執行過程:
- 創建對應類型的一個實例
- 在實例上調用指定的方法或者屬性
- 銷燬這個臨時實例
那麼我們如何才能給基本類型添加屬性或方法呢?
在基本包裝類型的原型下添加即可:
String.prototype.getLen = function(){
return this.length
}
var s = 'str'
console.log(s.getLen()) // 3
總結: 正是因爲有了基本包裝類型,所以JS中的基本類型可以被當作對象來訪問.