专栏名称: 蚂蚁金服ProtoTeam
数据前端团队
目录
相关文章推荐
51好读  ›  专栏  ›  蚂蚁金服ProtoTeam

JavaScript 中的对象拷贝

蚂蚁金服ProtoTeam  · 掘金  · 前端  · 2017-12-08 03:17

正文

请到「今天看啥」查看全文


关于第2点中的 writable 属性:

writable 设置为 false 时,表示不可写,也就是说属性不能被修改。

var o = {}; // Creates a new object
 
Object.defineProperty(o, 'a', {
  value: 37,
  writable: false
});
 
console.log(o.a); // logs 37
o.a = 25; // No error thrown
// (it would throw in strict mode,
// even if the value had been the same)
console.log(o.a); // logs 37. The assignment didn't work.
 
// strict mode
(function() {
  'use strict';
  var o = {};
  Object.defineProperty(o, 'b', {
    value: 2,
    writable: false
  });
  o.b = 3; // throws TypeError: "b" is read-only
  return o.b; // returns 2 without the line above
}());

正如上例中看到的,修改一个 non-writable 的属性不会改变属性的值,同时也不会报异常。

详细查看: MDN 文档

——— 愚人码头注,开始 ——

浅拷贝对象

当拷贝源对象的顶级属性被复制而没有任何引用,并且拷贝源对象存在一个值为对象的属性,被复制为一个引用时,那么我说这个对象被浅拷贝。如果拷贝源对象的属性值是对象的引用,则只将该引用值复制到目标对象。

浅层复制将复制顶级属性,但是嵌套对象将在原始(源)对象和副本(目标)对象之间是共享。

使用 Object.assign() 方法

Object.assign() 方法用于将从一个或多个源对象中的所有可枚举的属性值复制到目标对象。

let obj = {
  a: 1,
  b: 2,
};
let objCopy = Object.assign({}, obj);
console.log(objCopy);
// Result - { a: 1, b: 2 }

—> Edit on JS Bin

到目前为止。我们创建了一个 obj 的副本。让我们看看是否存在不变性:

let obj = {
  a: 1,
  b: 2,
};
let objCopy = Object.assign({}, obj);
 
console.log(objCopy); // result - { a: 1, b: 2 }
objCopy.b = 89;
console.log(objCopy); // result - { a: 1, b: 89 }
console.log(obj); // result - { a: 1, b: 2 }

—> Edit on JS Bin

在上面的代码中,我们将 objCopy 对象中的属性 b 的值更改为 89 ,并且当我们在控制台中 log 修改后的 objCopy 对象时,这些更改仅应用于 objCopy 。我们可以看到最后一行代码检查 obj 对象并没有被修改。这意味着我们已经成功地创建了拷贝源对象的副本,而且它没有引用。







请到「今天看啥」查看全文