1. 程式人生 > >JavaScript字串不是物件,為什麼會有屬性呢?(理解JavaScript中的包裝物件)

JavaScript字串不是物件,為什麼會有屬性呢?(理解JavaScript中的包裝物件)

例項1:

var s = "hello javascript!"; //定義一個字串
var world = s.substring(s.indexOf(" ")+1, s.length); //使用字串的方法

例項2:

var s=""test"; //建立一個字串
s.len=4; //給字串設定一個屬性
var t=s.len; //查詢這個屬性

結果:
在例項1中,可以正常使用s的屬性length,在例項2中t的值為undefined
結論:
字串s是一個原始值,在例項1中,當訪問字串s的屬性時,訪問過程處於一種讀取模式,也就是要從記憶體中讀取這個字串的值。而在讀取模式中訪問字串是,後臺都會自動完成以下處理:
(1)建立String型別的一個例項;
(2)在例項上呼叫指定的方法;
(3)銷燬這個例項。
例項2中,第二行程式碼建立的是一個臨時字串物件,並給len屬性賦值為4,隨即銷燬這個物件,所以第三行t的值是未定義。
以上的這個“臨時物件”被稱為“包裝物件”

,物件和包裝物件的 主要區別在於物件的生存週期,可以看到自動建立的包裝物件的生存週期只是一行程式碼的執行瞬間,然後立即銷燬。而使用new操作符建立的物件的生存週期在執行流離開當前作用域之前都一直儲存在記憶體中。
可以通過String(),Number(),Boolean()建構函式來顯示地建立包裝物件。但是通常情況下不建議這麼做。
對包裝物件的例項呼叫typeof會返回“object”,而且所有包裝物件都會轉換為布林值true。
例:

var falseObject=new Boolean(false);
var result=falseObject && true;
alert(result);//true;
var falseValue=false; result=falseValue && true; alert(result); alert(typeof falseObject);//object alert(typeof falseValue);//boolean alert(falseObject instanceof Boolean);//true alert(falseValue instanceof Boolean);//false

另外,“==”運算子將原始值和其包裝物件視為相等,“===”全等運算子則視為不等。