1. 什么是 Object?
Object(对象)是 JavaScript 中最基础的数据结构,用于存储键值对(key-value pairs)。
本质:无序的属性集合,所有对象都继承自
Object.prototype
特点:
属性键为字符串或 Symbol 类型
值可以是任意数据类型(包括函数和其他对象)
示例:
const person = { name: 'Alice', // 字符串属性 age: 25, // 数字属性 sayHi() { // 方法 console.log('Hi!'); } };
2. 创建 Object 的 4 种方式
方式 | 示例 | 适用场景 |
---|---|---|
字面量 | const obj = { key: 'value' } |
最常用,简单场景 |
构造函数 | const obj = new Object() |
需要显式构造时 |
Object.create() | const obj = Object.create(proto) |
需要控制原型链继承 |
Class | class Person {} const obj = new Person() |
面向对象编程 |
3. Object 的 10 个核心方法
1. Object.keys(obj)
作用:返回对象自身的可枚举属性名数组(不包含原型链上的属性)。
示例:
const user = { name: "Alice", age: 25 };
const keys = Object.keys(user); // ["name", "age"]
2. Object.values(obj)
作用:返回对象自身的可枚举属性值数组。
示例:
const user = { name: "Alice", age: 25 };
const values = Object.values(user); // ["Alice", 25]
3. Object.entries(obj)
作用:返回对象的 [key, value]
键值对数组。
示例:
const user = { name: "Alice", age: 25 };
const entries = Object.entries(user); // [["name", "Alice"], ["age", 25]]
4. Object.assign(target, ...sources)
作用:合并多个对象(浅拷贝)。
示例:
const obj1 = { a: 1 };
const obj2 = { b: 2 };
const merged = Object.assign({}, obj1, obj2); // { a: 1, b: 2 }
5. Object.freeze(obj)
作用:冻结对象,使其不可修改(不能增删改属性)。
示例:
const user = { name: "Alice" };
Object.freeze(user);
user.name = "Bob"; // 静默失败(严格模式会报错)
console.log(user.name); // "Alice"
6. Object.seal(obj)
作用:密封对象,不能增删属性,但可以修改现有属性。
示例:
const user = { name: "Alice" };
Object.seal(user);
user.name = "Bob"; // 允许修改
user.age = 25; // 静默失败(严格模式会报错)
7. Object.defineProperty(obj, prop, descriptor)
作用:定义或修改对象的属性特性(如 writable
、enumerable
)。
示例:
const obj = {};
Object.defineProperty(obj, "x", {
value: 1,
writable: false, // 不可修改
});
obj.x = 2; // 静默失败(严格模式会报错)
console.log(obj.x); // 1
8. obj.hasOwnProperty(key)
作用:检查属性是否为对象自身的属性(不包含继承的属性)。
示例:
const user = { name: "Alice" };
console.log(user.hasOwnProperty("name")); // true
console.log(user.hasOwnProperty("toString")); // false(继承自 Object.prototype)
9. obj.toString()
作用:返回对象的字符串表示(默认返回 [object Object]
)。
示例:
const obj = {};
console.log(obj.toString()); // "[object Object]"
// 自定义 toString()
const person = {
name: "Alice",
toString() {
return `Person: ${this.name}`;
},
};
console.log(person.toString()); // "Person: Alice"
10. Object.is(value1, value2)
作用:比 ===
更严格的比较(适用于 NaN
和 +0/-0
)。
示例:
console.log(Object.is(NaN, NaN)); // true(=== 返回 false)
console.log(Object.is(+0, -0)); // false(=== 返回 true)
console.log(Object.is(5, "5")); // false(=== 也返回 false)
方法/操作 | 作用 | 示例 |
---|---|---|
Object.keys() |
获取对象自身可枚举属性名数组 | Object.keys({a:1}) → ['a'] |
Object.values() |
获取对象自身可枚举属性值数组 | Object.values({a:1}) → [1] |
Object.entries() |
获取 [key, value] 数组 |
Object.entries({a:1}) → [['a',1]] |
Object.assign() |
合并对象(浅拷贝) | Object.assign({a:1}, {b:2}) → {a:1, b:2} |
Object.freeze() |
冻结对象(不可修改) | Object.freeze(obj) |
Object.seal() |
密封对象(不能增删属性) | Object.seal(obj) |
Object.defineProperty() |
定义/修改属性特性 | Object.defineProperty(obj, 'x', {value:1}) |
hasOwnProperty() |
检查是否自身属性(非继承) | obj.hasOwnProperty('key') |
toString() |
返回对象字符串表示 | obj.toString() |
Object.is() |
比 === 更精确的值比较 |
Object.is(NaN, NaN) → true |
4. Object 的 5 大使用场景
数据封装
const user = { id: 1, name: 'Alice', profile: { age: 25 } };
配置参数传递
function init({ url, timeout = 1000 }) { // ... } init({ url: '/api', timeout: 2000 });
模拟字典/映射
const colorMap = { red: '#FF0000', green: '#00FF00' };
面向对象编程
function Person(name) { this.name = name; } Person.prototype.sayHi = function() { console.log(`Hi, I'm ${this.name}`); };
JSON 数据交互
const jsonStr = JSON.stringify(obj); const parsedObj = JSON.parse(jsonStr);