亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

兩種變量創建類型的異同

兩種變量創建類型的異同

慕慕森 2019-04-16 20:26:32
我們知道,javascript中,除了null、undefined兩種類型,一切都是對象。然而:javascriptvarnum_obj=newNumber(100);varnum_val=100;console.log(typeofnum_obj);//"object"console.log(typeofnum_val);//"number"num_obj.myCustomAttr="mycustomattrbute";num_val.myCustomAttr="mycustomattrbute";console.log(num_obj.myCustomAttr);//"mycustomattrbute"console.log(num_val.myCustomAttr);//undefined那么問題來了通過new關鍵字構造的變量與直接賦值的變量有何不同?分別出現上述兩種不同結果的原因是什么?javascript為何要這么設計?
查看完整描述

2 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

JavaScript并非所有的東西都是對象
javascript有2套類型系統:原始值(primitive)和對象(object)。
原始值類型boolean,number以及string都有自己對應的包裝類型Boolean,Number和String。
原始值是不可變的,你不能給它們添加屬性。
你的問題1:
通過new關鍵字構造的字符串變量與直接賦值的字符串變量有何不同?
new創建的是String對象(object)。
直接賦值的字符串變量創建的是字符串原始值(primitive)。
分別出現上述兩種不同結果的原因是什么?
原始值是不可變的,你不能給它們添加屬性。因此輸出undefined。
javascript為何要這么設計?
不能怪javascript,大部分語言都這樣,都有2套類型系統。
但是現在的主流腳本語言正在改變這個現狀,一切都是對象。
因此,你不僅可以寫"abcde".length(),你甚至可以寫1.add(3)表示1+3,如果結合閉包,那就更炫酷了:
5.time({print("hello");});
輸出5次"hello"。
                            
查看完整回答
反對 回復 2019-04-16
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

包裝對象帶有一些有用的屬性和方法。比如,數字對象就帶有toFixed()和toExponential()之類的方法,字符串對象帶有substring()、chatAt()和toLowerCase()等方法以及length屬性。這些方法非常方便,和原始值相比,這是包裝對象的優勢,但其實原始值也可以調用這些方法,因為原始值會首先轉換為一個臨時對象,如果轉換成功,則調用包裝對象的方法。
因為原始值可以根據需要轉換成對象,這樣的話,也不必為了用包裝對象的方法而將原始值手動“包裝”成對象。比如,不必使用newString("hi"),直接使用"hi"即可。
不得不使用包裝對象的一個場景是,有時我們需要對值進行擴充并保持值的狀態。原始值畢竟不是對象,不能直接對其進行擴充。
Source:第三章字面量和構造函數
                            
查看完整回答
反對 回復 2019-04-16
  • 2 回答
  • 0 關注
  • 365 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號