每個物件由 屬性(properties) 與 方法(methods) 組成:
JavaScript 的物件本質上是一種 hashtable。
存取屬性的方法:
object.key
object["key"]
(必須是字串型別)var anObject = {
key1: "value1",
key2: "value2"
};
// 存取方式
console.log(anObject.key1); //"value1"
console.log(anObject["key1"]); //"value1"
// 修改屬性
anObject["key1"] = "new value";
console.log(anObject.key1); //"new value"
// 存取不存在的屬性
console.log(anObject.keyNotExist); //undefined
雖然陣列看起來是序列資料結構,但在 JavaScript 裡,陣列其實也是物件:
let arr = [1, 2, 3, 4];
console.log(typeof arr); //object
console.log(Array.isArray(arr)); //true
同樣地,function 也是一種特殊的物件。
Array 與 Function 都是 Object 的特殊型別。
var Peter = {
name: 'Peter',
score: [1, 2, 3],
address: 'taipei city',
phone: "0909090909",
father: {
name: 'Nick',
phone: '12345'
}
};
console.log(Peter.name); //"Peter"
console.log(Peter.father.name); //"Nick"
物件也常搭配陣列使用,例如建立學生清單:
var students = [];
var Peter = {
name:'Peter',
score:100,
address:'taipei city',
phone:"0909090909"
};
students.push(Peter);
console.log(students[0].name); //"Peter"
在物件方法中,this
代表「呼叫該方法的物件」:
let Wilson = {
first_name: "KK",
age: 27,
sayHi() {
console.log(this.first_name + " says hi");
}
};
Wilson.sayHi(); //"KK says hi"
若 function 沒有掛在物件上呼叫,this
則會指向 全域物件(瀏覽器是 window)。
當物件與運算子一起使用時,JavaScript必須先把物件轉為 primitive value,才能進行運算。
這個過程依據 ToPrimitive 演算法,會依序嘗試呼叫 valueOf()
與 toString()
:
true
toString()
valueOf()
var a = {};
console.log(a.toString()); //[object Object]
var b = { name: "Michael" };
console.log(b.valueOf()); //{ name: "Michael" }
覆寫 valueOf
會改變數值運算的結果:
var a = {
valueOf: function() {
return 10;
}
};
console.log(a + 3); //13
如果物件無法直接轉成數值,JavaScript 就會退回使用 toString()
:
console.log(3 + {}); //"3[object Object]"