可计算属性名

本文最后更新于:43 分钟前

可计算属性名

对象

ES6增加了可计算属性名,可以在文字形式中使用[]包裹一个表达式来当作属性名:

1
2
3
4
5
6
7
8
9
var prefix='foo'

var myObj={
[prefix+'bar']:'hello',
[prefix+'baz']:'world'
}

myObj['foobar'] // hello
myObj['foobaz'] // world

数组

数组也支持[]访问的形式。数组期望的是数值下标,也就是说值存储的位置(通常被称为索引)是整数。

1
2
3
4
5
var arr=['foo',42,'bar']

arr.length //3
arr[0] //'foo'
arr[2] //'bar'

数组也是对象,所以虽然每个下标都是整数,但是仍可以给数组添加属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var arr=['foo',42,'bar']

arr.baz='baz'

arr.length //3

arr.baz //'baz'
arr['baz'] //'baz'

console.log(arr) //['foo', 42, 'bar', baz: 'baz']
// 0: "foo"
// 1: 42
// 2: "bar"
// baz: "baz"
// length: 3
// [[Prototype]]: Array(0)

arr[3] //undefined

可以看到虽然添加了命名属性(无论是通过.语法还是[]语法),数组的length值并未发生变化。
你完全可以把数组当作一个普通的键/值对象来使用,并且不添加任何数值索引,但是这并不是一个好主意。
数组和普通的对象都根据其对应的行为和用途进行了优化,所以最好只用对象来存储键/值对,只用数组来存储数值下标/值对。
注意:如果你试图向数组添加一个属性,但是属性名“看起来”像一个数字,那它会变成一个数值下标(因此会修改数组的内容而不是添加一个属性):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var arr=['foo',42,'bar']

arr['3']='baz'
arr.length //3
arr['3'] //'baz'

console.log(arr); // ['foo', 42, 'bar', 'baz']
// 0: "foo"
// 1: 42
// 2: "bar"
// 3: "baz"
// length: 4
// [[Prototype]]: Array(0)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!