基本特性
image source: Amazon
主要分為物件型別與原始型別。
Primitive Type
- 數值
- 字串
- 布林
- null
- undefined
Object Type
兩者最大差異就是可否擴增屬性
區別物件、變數、型別
物件
- 具回收概念
- 記憶體中的資料
- 僅存於執行時期
變數
- 沒有回收概念
- 儲存物件的記憶體位址 (指標)
- 開發時期宣告 (
var
)
型別
- 表示物件的種類
- 不同型別有不同的預設屬性和方法
物件與屬性之間又有什麼關係 ? 屬性可以是物件所以可以無限繼續擴增下去。
重複宣告變數 ?
var x = 1;
console.log(x); // 1
var x;
console.log(x); // ?
宣告變數一定要使用 var
?
var x = 100;
console.log(x); // 100
console.log(window.x); // 100
y = 200;
console.log(y); // 200
console.log(window.y); // 200
訪問、宣告、刪除屬性
var model = {
name: 'wilson',
phone: '+88915211631',
address: 'Taipei, Taiwan'
};
address = 'address'; // 注意! 這裡沒有使用 var 宣告, 將被當作 window 下的一個屬性
console.log(model.name); // wilson
console.log(model['phone']); // +88915211631
console.log(model[address]); // Taipei, Taiwan
console.log(address); // address
delete address; // 刪除 address 屬性
console.log(address); // address is not defined
變數 (var
) 無法刪除, 但是可以刪除屬性。
原始型別包裹物件 (不良部分)
JavaScript 原始型別實作繼承原始型別包裹物件
Number
String
Boolean
由於原始型別無法自由擴增屬性,可以透過原始型別包裹物件自由擴增屬性與方法。
var price = 1000;
typeof(price); // number
price.ex = 'ex'; // 擴增屬性
console.log(price.ex); // undefined 擴增失敗
Number.prototype.ex = 'ex'; // 在原型包裹物件擴增 ex 屬性
console.log(price.ex); // ex 擴增成功. 實務上不建議使用該種方式擴增