在javascript中,对象是用来存储一组键值对的数据结构。以下是一些常见的对象操作方法和技巧:
-
创建对象
let obj = { name: 'John', age: 30, city: 'New York' };
或者使用 new Object() 语法:
let obj = new Object(); obj.name = 'John'; obj.age = 30;
-
访问和修改对象属性
• 通过 点操作符:let name = obj.name; // 'John' obj.age = 31; // 修改属性值
• 通过 方括号操作符(适用于动态属性或属性名是无效的标识符时):
let age = obj['age']; // 31 obj['city'] = 'Los Angeles'; // 修改属性值
-
添加新属性
obj.country = 'USA'; // 添加一个新属性 obj['gender'] = 'Male'; // 另一种方式
-
删除属性
• delete 操作符用于删除对象中的属性delete obj.age; // 删除 age 属性
-
检查属性是否存在
• 使用 in 操作符:console.log('name' in obj); // true console.log('gender' in obj); // false
• 使用 hasOwnProperty() 方法:
console.log(obj.hasOwnProperty('name')); // true
-
获取对象所有的属性名和属性值
• Object.keys():返回对象的所有属性名(数组)let keys = Object.keys(obj); // ['name', 'age', 'city', 'country', 'gender']
• Object.values():返回对象的所有属性值(数组)
let values = Object.values(obj); // ['John', 31, 'Los Angeles', 'USA', 'Male']
• Object.entries():返回对象的所有键值对(二维数组)
let entries = Object.entries(obj); // [['name', 'John'], ['age', 31], ['city', 'Los Angeles'], ['country', 'USA'], ['gender', 'Male']]
-
遍历对象
• 使用 for…in 循环遍历对象的属性:for (let key in obj) { if (obj.hasOwnProperty(key)) { console.log(key, obj[key]); } }
• 使用 Object.entries() 和 forEach() 遍历键值对:
Object.entries(obj).forEach(([key, value]) => { console.log(key, value); });
-
合并对象
• Object.assign():将一个或多个源对象的所有属性复制到目标对象let obj1 = { a: 1, b: 2 }; let obj2 = { b: 3, c: 4 }; let mergedObj = Object.assign({}, obj1, obj2); // { a: 1, b: 3, c: 4 }
• 使用展开运算符(…):
let mergedObj = { ...obj1, ...obj2 }; // { a: 1, b: 3, c: 4 }
-
深拷贝对象
• Object.assign() 是浅拷贝,仅复制一级属性let shallowCopy = Object.assign({}, obj); // 浅拷贝
• 使用 JSON 方法进行深拷贝:
let deepCopy = JSON.parse(JSON.stringify(obj)); // 深拷贝
• 使用第三方库(如 Lodash)的 cloneDeep() 方法:
let deepCopy = _.cloneDeep(obj); // Lodash 深拷贝
-
预设默认值
• 使用 ?? (nullish coalescing operator) 设置默认值(仅在 null 或 undefined 时生效)let name = obj.name ?? 'Default Name'; // 如果 obj.name 是 null 或 undefined,则使用 'Default Name'
• 使用 || 作为传统的默认值方法(适用于 falsy 值)
let name = obj.name || 'Default Name'; // 如果 obj.name 是 falsy(如 null, undefined, '', 0 等)则使用 'Default Name'
-
对象解构
• 从对象中提取值并赋给变量let { name, age } = obj; // 解构,name = 'John', age = 31
• 设置默认值
let { name, city = 'Unknown' } = obj; // 如果 city 不存在,使用默认值 'Unknown'
-
修改对象的原型
• Object.setPrototypeOf():设置对象的原型let newObj = { a: 1 }; let proto = { b: 2 }; Object.setPrototypeOf(newObj, proto); console.log(newObj.b); // 2
-
冻结和密封对象
• Object.freeze():冻结对象,防止修改已有的属性Object.freeze(obj); obj.name = 'Jane'; // 无效,属性不可修改
• Object.seal():密封对象,防止新增或删除属性
Object.seal(obj); obj.gender = 'Female'; // 无效,无法新增属性 delete obj.city; // 无效,无法删除属性