JavaScript 属性删除与遍历
上一篇文章 JavaScript 对象是什么 讲了对象的创建和读写。这一节讲和属性有关的两个操作,删除属性以及遍历所有属性。
delete 删除属性
delete 运算符用来删除对象的属性,写法是 delete 对象.键名。删除之后键不存在,再访问得到 undefined。
const person = {
name: '小明',
age: 20,
city: '北京',
};
delete person.city;
console.log(person.city);
console.log(person);
第一行输出 undefined。第二行输出的对象里只剩 name 和 age,city 已经没了。
delete 平时用得不多,在清理临时数据时会碰到。注意 delete 只能删对象的属性,不能用来删变量。
in 检查属性是否存在
判断对象有没有某个属性,用 in 运算符,写法是 '键名' in 对象,返回 true 或 false。
const person = {
name: '小明',
age: 20,
};
console.log('name' in person);
console.log('city' in person);
第一行输出 true,第二行输出 false。注意键名要加引号,写成字符串。
为什么需要 in。直接访问不存在的属性会得到 undefined,但属性值本身也可能是 undefined,这时就看不出属性到底存不存在。
const a = { x: undefined };
const b = {};
console.log(a.x === undefined);
console.log(b.x === undefined);
两行都输出 true,可 a 有 x 属性,b 没有。用 in 才能区分。
console.log('x' in a);
console.log('x' in b);
第一行输出 true,第二行输出 false。只想判断属性是否存在时,用 in 更准确。
for…in 遍历属性
for…in 是对象专用的遍历语法。每次循环拿到一个键名,配合 对象[键名] 取出对应的值。
const person = {
name: '小明',
age: 20,
city: '北京',
};
for (const key in person) {
console.log(key + '=' + person[key]);
}
依次输出 name=小明、age=20、city=北京,每行一个。循环变量 key 拿到的是键名字符串,所以取值要用方括号 person[key],写 person.key 就错了,那会去查名为 key 的属性。
一个注意点,for…in 会遍历到原型链上继承下来的属性。原型是对象共享机制的一部分,详细内容见 JavaScript 原型是什么。目前写的对象都是自己定义键名,遍历到的就是这些键。
小结
delete 删除属性,删除后访问得到 undefined。in 运算符检查属性是否存在,返回布尔值,比直接比较 undefined 更准确。for…in 遍历对象属性,循环变量是键名字符串,配合方括号取值。for…in 会把原型链上的属性也带出来,原型相关内容后面单独讲。