JS的基本數據類型的臨時包裝類型對象的觸發條件和生命周期是多久?下面代碼為何結果迥異?

比如如下代碼:

//segment 1:
var box ="Mr.Xiao";
alert(box.substring(2));

代碼可以正常運行,因為產生了臨時包裝類型的對象,但是下面的代碼,

//segment 2:
box.name="xiao";
box.age=function(){
return 10;
}
alert(box.name); //undefined
alert(box.age()); //報錯

為何報錯?為何沒有產生臨時包裝類型的對象?家還是生命周期直接過了?難道說沒有觸發產生臨時包裝類型的對象?那麼觸發條件是什麼?

還有,既然是臨時包裝類型的對象,那麼下面的代碼:

//segment 3:
var falseObject=new Boolean(false);
var falseValue=false;
alert(falseObject instanceof Boolean); //true
alert(falseValue instanceof Boolean); //false

此時沒有觸發產生臨時包裝類型的對象?如果產生了,那麼falseValue對應的應該是一個boolean類型(typeof falseValue 的值為boolean),falseObject卻是一個object類型,為什麼 intanceof操作之後,falseObject instanceof Boolean的值為true,另一個為false?是因為其 var falseObject=new Boolean(false);等同於 var falseObject=new Object(false)嗎?

//因為我覺得falseObject確實是一個對象,Object構造函數也會像工廠方法一樣,根據傳入值的類型返回相應的基本包裝類型的實力,e.g:

var obj=new Object("some text");
alert(obj instanceof String); //true

//順便問一句 知乎現在可以邀請15個人了?還有那些大神的代碼為什麼是彩色的 格式化規範好的?腫么做到的?


基礎不夠就別亂猜了

還是去看看ES文檔來的靠譜

去看 11.2.1 Property Accessors 屬性訪問器

這麼寫的

會走下CheckObjectCoercible

然後 CheckObjectCoercible 會經行 ToObject 運算

如果不能ToObject的

拋出異常或者直接返回

這得看baseValue是啥類型看你第一個例子

//segment 1:
var box ="Mr.Xiao";
alert(box.substring(2));

box 字元串試圖使用屬性訪問器

box作為baseValue被CheckObjectCoercible -&> ToObject -&> new String

然後作為String Object 訪問屬性

第二個例子

//segment 2:
box.name="xiao";
box.age=function(){
return 10;
}
alert(box.name); //undefined
alert(box.age()); //報錯

box 字元串試圖使用屬性訪問器

試圖訪問name屬性

那麼 box 被臨時包裝為 String Object 訪問其屬性

但是這個臨時包裝的 Object 有被賦值留存么?

顯然沒有

所以

box 試圖訪問 age 屬性時候是重新包裝了一個 new String

同樣無法留存其CheckObjectCoercible 後結果

那麼

之後的alert訪問 name 和 age 都是對 box 分別進行無留存 new String 操作

與之前的臨時裝箱後生產的對象一點關係都沒有

肯定沒結果啦

例子3

先看規範

instanceof 運算符對於其左右值都沒有規定要做CheckObjectCoercible 或 ToObject

也就是說不會臨時包裝對象

所以

//segment 3:
var falseObject=new Boolean(false);
var falseValue=false;
alert(falseObject instanceof Boolean); //true
alert(falseValue instanceof Boolean); //false

直接 Boolean 基礎類型的 falseValue instanceof Boolean 對象類型肯定是失敗的

而你 new Boolean 出來的是成功的


臨時包裝對象只在方法調用時產生(即方法中的this),其它時候並沒有。


不請自來,所謂包裝對象是針對原始值來說的,屬性賦值或調用方法後會立即銷毀。

segment 3里那個falseObject 不是原始值了,就是個JavaScript 對象,不關包裝對象的事。這裡涉及到instanceof 的用法、原始值和對象的區別,再認真看看《JavaScript 高級程序設計》吧。


凡是調用對象的方法時,就會自動創建一個相應的引用實例,然後執行結束後又會馬上銷毀的。所以,每次的實例都是不一樣的!


JavaScript高級程序設計前100頁就找得到吧。

值類型不能作為引用類型來做對象操作和運算,引用類型可以, String、Number、Boolean是引用類型也是值類型。 關係大概跟面向對象設計里對字元串有String和StringBuilder的關係一樣,只是js類型轉換隱蔽。 原因上面有文檔。。。沒有細看大概估計


JavaScript高級程序設計,先看再寫代碼,別猜。


推薦閱讀:

0基礎如何在5天之內完成一個選戶系統?
如何看待前端培訓公司智能社亦庄總部疑似面臨倒閉?
花兩萬的錢去培訓一個自己本身不喜歡的web前端,好不好?
google的material-ui為什麼沒有柵格系統?
請各位大神支招,零基礎想學web編程,怎麼能既省錢又能學到技術? ?

TAG:Web開發 | 前端開發 | JavaScript | JavaScript權威指南書籍 |