Skip to content

对象

快速开始

Deep Clone

深拷贝是前端面试常考题,也是避免数据污染的重要手段。JSON.parse(JSON.stringify(obj)) 是最简洁的方案,适用于只包含简单数据类型(数字、字符串、布尔值、数组、纯对象)的对象。但如果对象中包含 undefined, Symbol, Function, Date, RegExp 或循环引用,此方法会失效。

对于更复杂的需求,可以使用 structuredClone(现代浏览器支持),或者自己实现一个递归函数。

javascript
// 简洁版:适用于 JSON 安全的对象
const obj = { a: 1, b: { c: 2 }, d: [3, 4] };
const deepCloned = JSON.parse(JSON.stringify(obj));

// 注意:修改克隆体不会影响原对象
deepCloned.b.c = 999;
console.log(obj.b.c); // 仍然是 2

// 现代版:structuredClone (推荐用于现代环境)
try {
  const modernClone = structuredClone(obj);
  console.log(modernClone);
} catch (e) {
  console.warn('structuredClone not supported in this environment.');
}

从键值对生成对象

有时我们会有一个键值对数组,需要将其转换为标准的 JavaScript 对象。Object.fromEntries() 方法完美地解决了这个问题,它是 Object.entries() 的逆向操作。

javascript
const pairs = [
  ['name', 'Alice'],
  ['age', 30],
  ['city', 'Beijing']
];

const obj = Object.fromEntries(pairs);

console.log(obj); 
// { name: 'Alice', age: 30, city: 'Beijing' }

对象属性过滤

类似于数组的 filter,我们经常需要根据某个条件从对象中挑选出一部分属性。这可以通过 Object.entries()filter()Object.fromEntries() 的组合来实现。

javascript
const user = {
  id: 1,
  name: 'Bob',
  email: 'bob@example.com',
  password: 'secret123', // 我们不想包含密码
  isActive: true
};

// 定义一个过滤函数,返回 true 表示保留该属性
const filterFn = ([key, value]) => key !== 'password';

const publicInfo = Object.fromEntries(
  Object.entries(user).filter(filterFn)
);

console.log(publicInfo);
// { id: 1, name: 'Bob', email: 'bob@example.com', isActive: true }

// 更多过滤例子:
// 只保留字符串类型的属性
const stringProps = Object.fromEntries(
  Object.entries(user).filter(([k, v]) => typeof v === 'string')
);
// { name: 'Bob', email: 'password123' }

// 只保留值为 true 的布尔属性
const activeFlags = Object.fromEntries(
  Object.entries(user).filter(([k, v]) => typeof v === 'boolean' && v)
);
// { isActive: true }