🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、概述 ### 1.1 生成方法 对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型。 什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。 ~~~ var obj = { foo: 'Hello', bar: 'World' }; ~~~ 上面代码中,大括号就定义了一个对象,它被赋值给变量`obj`,所以变量`obj`就指向一个对象。该对象内部包含两个键值对,第一个键值对是`foo: 'Hello'`,其中`foo`是“键名”,字符串`Hello`是“键值”。键名与键值之间用冒号分隔。第二个键值对是`bar: 'World'`,`bar`是键名,`World`是键值。两个键值对之间用逗号分隔。 ### 1.2 键名 对象的所有键名都是字符串。上面的代码也可以写成下面这样。 ~~~ var obj = { 'foo': 'Hello', 'bar': 'World' }; ~~~ 如果键名是数值,会被自动转为字符串。 ~~~ var obj = { 1: 'a', 3.2: 'b', 1e2: true, 1e-2: true, .234: true, 0xFF: true }; obj['100'] // true ~~~ 上面代码中,对象`obj`的所有键名虽然看上去像数值,实际上都被自动转成了字符串。 如果键名不符合标识名的条件(比如第一个字符为数字,或者含有空格或运算符),且也不是数字,则必须加上引号,否则会报错。 ~~~ // 报错 var obj = { 1p: 'Hello World' }; // 不报错 var obj = { '1p': 'Hello World', 'h w': 'Hello World', 'p+q': 'Hello World' }; ~~~ 对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。 ~~~ var obj = { p: function (x) { return 2 * x; } }; obj.p(1) // 2 ~~~ ### 1.3 对象的引用 如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。 ~~~ var o1 = {}; var o2 = o1; o1.a = 1; o2.a // 1 o2.b = 2; o1.b // 2 ~~~ 上面代码中,`o1`和`o2`指向同一个对象,因此为其中任何一个变量添加属性,另一个变量都可以读写该属性。 但是,这种引用只局限于对象,如果两个变量指向同一个原始类型的值。那么,变量这时都是值的拷贝。 ~~~ var x = 1; var y = x; x = 2; y // 1 ~~~ ## 二、属性的操作 ### 2.1 属性的读取 读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。 ~~~ var obj = { p: 'Hello World' }; obj.p // "Hello World" obj['p'] // "Hello World" ~~~ 请注意,如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。 ~~~ var foo = 'bar'; var obj = { foo: 1, bar: 2 }; obj.foo // 1 obj[foo] // 2 ~~~ 数字键可以不加引号,因为会自动转成字符串。 ~~~ var obj = { 0.7: 'Hello World' }; obj['0.7'] // "Hello World" obj[0.7] // "Hello World" ~~~ ### 2.2 属性的赋值 点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值。 ~~~ var obj = {}; obj.foo = 'Hello'; obj['bar'] = 'World'; ~~~ JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性。 ~~~ var obj = { p: 1 }; // 等价于 var obj = {}; obj.p = 1; ~~~ ### 2.3 属性的查看 查看一个对象本身的所有属性,可以使用`Object.keys`方法。 ~~~ var obj = { key1: 1, key2: 2 }; Object.keys(obj); // ['key1', 'key2'] ~~~