物件的特性存取方式

2020-06-06
JS新手村

物件的特性存取方式

Object(物件)這個型別是一個複合值(compound value),

設定Properties(特性(或稱屬性),可以想成有名字的索引值),每一個都可以是任何型別。

特性的存取方式:點記號法方括號記號法

點記號法(dot natation)

1
2
const obj = { a:1, b:2 }
console.log(obj.a) //1

點記號方式較短亦閱讀,會優先使用此方式

方括號記號法(bracket notation)

1
2
3
const obj = { a:1, b:2 }
console.log(obj['a']) //1
//'',"" 兩種皆可以

如果特性的名稱有特殊字元,必須使用方括號記號法。

1
2
3
obj.123     //error
obj.'123' //error
obj['123'] //ok
  • 使用點記號法時,屬性名稱(索引名稱)會被視為識別字,因此不能使用不合法的命名。
  • 用方括號記號法,則視為使用字串設定屬性名稱

中文也會通

1
2
3
4
var obj = { 中文: '你好'};
console.log(obj.中文) //'你好'
console.log(obj['中文']) // '你好'
console.log(obj[中文]) //Uncaught ReferenceError: 中文 is not defined

踩過的點

1
2
3
4
5
6
7
8
9
10
//將出現的水果和次數用物件顯示
const fruit = ['apple', 'banana', 'orange', 'grapes', 'banana', 'mango', 'orange'];

let sumUp = fruit.reduce((obj, item) => {
if(!obj.item) obj.item = 0;
obj.item++
return obj
},{})

console.log(sumUp); //{ item : 7} WT..0.0?!

注意物件存取的方式,上述範例中把值帶入變數的話:

1
if(!obj.'apple') obj.'apple' {...}

就發現不對勁的地方了!
把點記號法改方括號就可以了

1
2
3
4
5
6
7
8
const fruit = ['apple', 'banana', 'orange', 'grapes', 'banana', 'mango', 'orange'];

let sumUp = fruit.reduce((obj, item) => {
if(!obj[item]) obj[item] = 0;
obj[item]++
return obj
},{})
console.log(sumUp); //{ apple: 1, banana: 2, orange: 2, grapes: 1, mango: 1 }