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()); //報錯
還有,既然是臨時包裝類型的對象,那麼下面的代碼:
此時沒有觸發產生臨時包裝類型的對象?如果產生了,那麼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:
//segment 3:
var falseObject=new Boolean(false);
var falseValue=false;
alert(falseObject instanceof Boolean); //true
alert(falseValue instanceof Boolean); //false
//順便問一句 知乎現在可以邀請15個人了?還有那些大神的代碼為什麼是彩色的 格式化規範好的?腫么做到的?
var obj=new Object("some text");
alert(obj instanceof String); //true
基礎不夠就別亂猜了
還是去看看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先看規範 //segment 3:
var falseObject=new Boolean(false);
var falseValue=false;
alert(falseObject instanceof Boolean); //true
alert(falseValue instanceof Boolean); //false
臨時包裝對象只在方法調用時產生(即方法中的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權威指南書籍 |