Skip to content

对象方法

对象属性具有 4 个描述其行为的特性

因为这些特性是内部值,所以 ECMA-262 规范将其放在了两对方括号中。

  • [[Configurable]]:表示属性能否删除而重新**定义,或者是否可以修改为访问器属**性,默认值为 true。
  • [[Enumerable]]:表示属性是否可枚举,可枚举的属性能够通过 for...in 循环返回,默认值为 true。
  • [[Writable]]:表示属性值能否被修改,默认值为 true。
  • [[Value]]:表示属性的真实值,属性的读取和写入均通过此属性完成,默认值为 undefined。

1. Object.assign()

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。

注意点:

(1)浅拷贝

Object.assign()方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。

js
const obj1 = { a: { b: 1 } };
const obj2 = Object.assign({}, obj1);

obj1.a.b = 2;
obj2.a.b; // 2

(2)同名属性的替换

对于这种嵌套的对象,一旦遇到同名属性,Object.assign()的处理方法是替换,而不是添加。

js
const target = { a: { b: "c", d: "e" } };
const source = { a: { b: "hello" } };
Object.assign(target, source);
// { a: { b: 'hello' } }

(3)数组的处理

Object.assign()可以用来处理数组,但是会把数组视为对象。

js
Object.assign([1, 2, 3], [4, 5]);
// [4, 5, 3]

Object.assign()把数组视为属性名为 0、1、2 的对象,因此源数组的 0 号属性4覆盖了目标数组的 0 号属性1

(4)取值函数的处理

Object.assign()只能进行值的复制,如果要复制的值是一个取值函数,那么将求值后再复制。

js
const source = {
  get foo() {
    return 1;
  },
};
const target = {};

Object.assign(target, source);
// { foo: 1 }

source对象的foo属性是一个取值函数,Object.assign()不会复制这个取值函数,只会拿到值以后,将这个值复制过去。

2. Object.keys() Object.values() Object.entries()

Object.keys() : 返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名。

js
var obj = { foo: "bar", baz: 42 };
Object.keys(obj);
// ["foo", "baz"]

Object.values(): 返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值。

js
const obj = { foo: "bar", baz: 42 };
Object.values(obj);
// ["bar", 42]

Object.entries(): 返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。

js
const obj = { foo: "bar", baz: 42 };
Object.entries(obj);
// [ ["foo", "bar"], ["baz", 42] ]

3.Object.fromEntries()

Object.fromEntries(): 是Object.entries()的逆操作,用于将一个键值对数组转为对象。

js
Object.fromEntries([
  ["foo", "bar"],
  ["baz", 42],
]);
// { foo: "bar", baz: 42 }

4.Object.is()

Object.is() 方法判断两个值是否为同一个值

满足以下条件 Object.is() 返回 true

  • 都是 undefined
  • 都是 null
  • 都是 truefalse
  • 都是相同长度的字符串且相同字符按相同顺序排列
  • 都是相同对象(意味着每个对象有同一个引用)
  • 都是数字且
    • 都是 +0
    • 都是 -0
    • 都是 NaN
    • 或都是非零而且非 NaN 且为同一个值
js
Object.is(NaN, NaN); // true

不常用方法

1.Object.create()

Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的proto

js
let obj = {
  name: "vity",
};
let me = Object.create(obj);
// 以obj作为原型创对象
console.log(me.name); // 'vity'

2.Object.defineProperty()

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

js
const object1 = {};

Object.defineProperty(object1, "property1", {
  value: 42,
  writable: false,
});

object1.property1 = 77;
// throws an error in strict mode

console.log(object1.property1);
// expected output: 42

3.Object.freeze()

Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。

js
const obj = {
  prop: 42,
};

Object.freeze(obj);

obj.prop = 33;
// Throws an error in strict mode  严格模式报错

console.log(obj.prop);
// expected output: 42


⭐️⭐️⭐️ 好啦!!!本文章到这里就结束啦。⭐️⭐️⭐️

✿✿ ヽ(°▽°)ノ ✿

撒花 🌸🌸🌸🌸🌸🌸

上次更新于: