六维教程

JavaScript 对象是什么

数组适合存放一组同类数据,但现实里的信息往往是一组有关联的不同数据。比如一个人的姓名、年龄、城市,三个值各不相同,全塞进数组就分不清哪个是哪个了。对象就是用来解决这个问题的。

对象是一组键值对的集合,键名 key 对应一个值 value。可以类比一张名片,字段名是姓名、电话,字段值是对应内容。

用字面量创建对象

创建对象用一对大括号,里面写键值对。键名和值之间用英文冒号隔开,多对之间用逗号隔开。

const person = {
  name: '小明',
  age: 20,
  city: '北京',
};

这里创建了一个描述人的对象,键名是 name、age、city,值是各自的内容。键名一般用英文单词,比如用 name 而不是 姓名。

读取属性

读取属性最常用的是点语法,写法是 对象名.键名

console.log(person.name);
console.log(person.age);

依次输出 小明、20。点语法简单直观,日常使用最多。

另一种是方括号语法,写法是 对象名['键名']

console.log(person['city']);

输出 北京。方括号里写的是字符串形式的键名。两种方式结果一样,平时用点语法就行。下面两种场景必须用方括号。

第一种场景,键名是变量。

const key = 'age';
console.log(person[key]);

输出 20。方括号里直接放变量名,程序先取出变量的值,再按这个值去查属性。

第二种场景,键名不是合法的变量名,比如带短横线。

const obj = {
  'user-name': '小美',
};
console.log(obj['user-name']);

输出 小美。这种键名点语法写不了,只能方括号。

添加和修改属性

给对象添加新属性,直接给一个不存在的键名赋值就行。

const person = {
  name: '小明',
  age: 20,
};
person.city = '北京';
console.log(person);

运行后对象里多出 city 属性。person 用 const 声明,但添加属性不受影响,因为改的是对象内部,不是给变量重新赋值。

修改已有属性同理,给存在的键名赋新值。

person.age = 21;
console.log(person.age);

输出 21。

对象是引用类型

这是对象最重要的一条特性。数字、字符串这些基本类型按值存储,对象不一样,它是引用类型。把对象赋值给另一个变量,两个变量指向同一个对象,修改其中一个,另一个也跟着变。

const a = { count: 1 };
const b = a;
b.count = 99;
console.log(a.count);

输出 99。明明只改了 b,a 却跟着变,因为 a 和 b 指向同一个对象。这一点在 JavaScript 数据类型与 typeof 里提到过,写代码时最容易在这踩坑。

想让两个变量互不影响,得复制一份对象出来,复制的写法后面会讲。

键名都按字符串处理

对象里的键名,不管怎么写,最终都会被当作字符串处理。比如 { 1: 'a' } 里的键 1,实际是字符串 ‘1’。平时用英文单词做键名,就能避开这些细节。

小结

对象是一组键值对,用大括号字面量创建。读取属性用点语法,键名是变量或不合法的特殊键名时用方括号。直接赋值就能添加和修改属性。对象是引用类型,赋值给多个变量会共享同一个对象。键名最终都按字符串处理。

上一篇
JavaScript 数组常用方法
下一篇
JavaScript 属性删除与遍历