作为一个前端菜鸟,今天啃ES6对象新特性时,仿佛打开了新世界的大门!以前写对象就像在超市排队结账——慢且重复,现在?直接走自助通道,刷一下完事儿!其实很多ES6新特性大家一直在用,但是却不知道这是ES6新增的,下面就把这些让我直呼真香的技巧分享给你👇
🛒 一、属性简写:变量名直接当属性名用(懒人福音)
以前写对象属性,变量名和属性名相同时还得重复写:
const name = '小明';
const age = 18;
// 旧写法(手酸不?)
const user = {
name: name,
age: age
};
ES6直接让你省掉重复代码:
const user = { name, age }; // 自动把变量名变成属性名
console.log(user); // {name: "小明", age: 18}
这就像超市自助结账——不用再对着收银员重复说“这个、这个,还有这个”了!相信这个对象特性大家一直在用,但是却不知道这是ES6新增的
🔤 二、属性名表达式:属性名也能玩动态拼接
以前属性名只能是固定字符串,现在可以用[]包裹表达式动态生成:
const key = 'skill';
const obj = {
name: '张三',
// 动态生成属性名
[key + 'Type']: '前端开发',
['level' + (1 + 2)]: '高级'
};
console.log(obj);
// {name: "张三", skillType: "前端开发", level3: "高级"}
应用场景:动态配置字段名、避免属性名冲突时超好用!
👪 三、super关键字
在对象方法中,super直接指向它原型对象:
const parent = {
greet() {
return 'Hello!';
},
name:'张三'
};
const child = {
greet() {
return super.greet() + ' 我是小明!'; // 调用父级方法
},
getName(){
return super.name
}
};
Object.setPrototypeOf(child, parent); // 设置原型链
console.log(child.greet()); // "Hello! 我是小明!"
console.log(child.getName()); // "张三"
⚠️ 注意:super必须在简写方法(如greet())内使用,普通函数会报错!
📦 四、扩展运算符...:对象的“吸星大法”
用...可以一键复制/合并对象(浅拷贝!):
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
// 合并对象
const merged = { ...obj1, ...obj2 };
// {a:1, b:2, c:3, d:4}
// 覆盖属性
const updated = { ...obj1, b: 99 };
// {a:1, b:99}
// 注意:相同属性后者覆盖前者
const conflict = { ...obj1, ...{ a: 100 } };
// {a:100, b:2}
{ ...obj1, b: 99 }在react的状态管理时很常用,在原先的基础上修改
重要提示:
...只做浅拷贝!嵌套对象还是共享内存(坑过无数人!):
const oldboj = { a: 1, b: 2, c: 3 }
const newboj = { ...oldboj }
newboj.a = 10
console.log(oldboj)
console.log(newboj)
const nestObj = { x: { y: 1 } };
const copy = { ...nestObj };
copy.x.y = 100; // 原对象的x.y也被改了!
console.log(nestObj.x.y); // 100 😱
🔍 五、属性遍历:5种姿势任君选择
ES6一口气提供了5种遍历对象属性的方式,各有专长:
| 方法 | 遍历内容 | 是否包含Symbol | 是否包含继承属性 |
|---|---|---|---|
for...in | 可枚举属性 | ❌ | ✅ |
Object.keys(obj) | 自身可枚举属性 | ❌ | ❌ |
Object.getOwnPropertyNames(obj) | 自身所有属性(除Symbol) | ❌ | ❌ |
Object.getOwnPropertySymbols(obj) | 自身Symbol属性 | ✅ | ❌ |
Reflect.ownKeys(obj) | 自身所有属性 | ✅ | ❌ |
实际开发建议:
- 日常遍历用
Object.keys()最安全(不碰原型链) - 需要Symbol属性时上
Reflect.ownKeys() for...in慎用(会遍历继承属性,可能踩坑)
具体的用法,大家可以参考官方文档,这里我只是简单的整理ES6新增的对象的一些用法
🛠 六、对象新增方法:这些API真能救命!
1. Object.is():比===更严格的相等判断
console.log(Object.is(NaN, NaN)); // true(NaN终于等于自己了!)
console.log(Object.is(0, -0)); // false(区分+0和-0)
2. Object.assign():对象合并(浅拷贝版)
const target = { a: 1 };
const source = { b: 2 };
Object.assign(target, source);
console.log(target); // {a:1, b:2}(直接修改target!)
3. Object.fromEntries():键值对数组 ➔ 对象
const entries = [['name', '小李'], ['age', 25]];
const obj = Object.fromEntries(entries);
console.log(obj); // {name: "小李", age: 25}
4. Object.values() / Object.entries():拆解对象
const user = {name: '老王', age: 40};
// 获取值数组
console.log(Object.values(user)); // ["老王", 40]
// 获取键值对数组
console.log(Object.entries(user));
// [ ["name", "老王"], ["age", 40] ]
💎 总结:ES6让对象操作爽到飞起!
今天学的这些特性,几乎每天都在实际编码中出现:
- 简写属性 → 少写30%重复代码
- 属性名表达式 → 动态字段名场景必备
- super → 面向对象继承更清晰
- 扩展运算符
...→ 复制合并对象首选(但牢记浅拷贝!) - 五种遍历方式 → 根据需求精准选择
- 新增API → 解决特定场景痛点(如
Object.is()处理NaN)
学习资源推荐: