⚡ES6对象骚操作大全:让你的代码浪到飞起!

60 阅读4分钟

作为一个前端菜鸟,今天啃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: "高级"}

应用场景:动态配置字段名、避免属性名冲突时超好用!

image.png

👪 三、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())内使用,普通函数会报错!

image.png

📦 四、扩展运算符...:对象的“吸星大法”

...可以一键复制/合并对象(浅拷贝!):

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的状态管理时很常用,在原先的基础上修改

image.png 重要提示...只做浅拷贝!嵌套对象还是共享内存(坑过无数人!):

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 😱

image.png

🔍 五、属性遍历: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让对象操作爽到飞起!

今天学的这些特性,几乎每天都在实际编码中出现:

  1. 简写属性 → 少写30%重复代码
  2. 属性名表达式 → 动态字段名场景必备
  3. super → 面向对象继承更清晰
  4. 扩展运算符...  → 复制合并对象首选(但牢记浅拷贝!)
  5. 五种遍历方式 → 根据需求精准选择
  6. 新增API → 解决特定场景痛点(如Object.is()处理NaN)

学习资源推荐: