文章目录
1 定义
对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
- 键名又称为属性或属性名(property)
- 键值又称为属性值(value)
//常用写法
let obj = {
'name': 'zxc', 'age': 23}
//规范写法
let obj2 = new Object({
'name': 'zxc', 'age': 23})
2 键名
对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),不是标识符, 可以包含任意字符。引号可省略,省略之后就只能写标识符和纯数字,就算引号省略了, 键名还是字符串。
- 如果键名是数值,会被自动转为字符串。
- 如果键名不符合标识符的条件(比如第一个字符为数字,或者含有空格或运算符),且也不是数字,则必须加上引号,否则会报错。
- 如果一个属性值为函数,通常把这个属性称为“方法”。
- 如果属性值还是一个对象,就形成了链式引用。
对象的属性之间用逗号分隔,最后一个属性后面可以加逗号(trailing comma),也可以不加。
属性可以动态创建,不必在对象声明时就指定。
ES6
对象定义时,需要变量作为属性名,属性值需要用[]
来包裹住。
let name = 'age'
let info = {
[name] = 18
}
info // {age: 18}
由来:
let name = 'age'
let info = {
}
info[name] = '18'
info // {age: 18}
ES6之前,对象定义完后,变量可以作为属性名,来动态定义属性。因此借鉴这部分用[]
方式。
1.4 表达式还是语句?
对象采用大括号表示,这导致了一个问题:如果行首是一个大括号,它到底是表达式还是语句?
{
foo: 123 }
JavaScript 引擎读到上面这行代码,会发现可能有两种含义。
第一种可能是,这是一个表达式,表示一个包含foo
属性的对象;
第二种可能是,这是一个语句,表示一个代码块,里面有一个标签foo
,指向表达式123
。
疑问: chrome直接输出{ foo: 123 }
, 是一个对象.
答: 因为 chrome 欺骗了我们, 用 firefox 可以验证下面这句话,JS是只花了10天就设计出来的语言。
为了避免这种歧义,JavaScript 引擎的做法是,如果遇到这种情况,无法确定是对象还是代码块,一律解释为代码块。
{
console.log(123) } // 123
上面的语句是一个代码块,而且只有解释为代码块,才能执行。
如果要解释为对象,最好在大括号前加上圆括号。
因为圆括号的里面,只能是表达式,所以确保大括号只能解释为对象。
({
foo: 123 }) // 正确
({
console.log(