淺談基本包裝類型

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中的基本類型可以被當作對象來訪問.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章