JavaScript中Object.assign() 的使用方法

Object.assign() 是一个 JavaScript 的静态方法,用于将一个或多个源对象的所有可枚举的自有属性复制到目标对象。它会返回修改后的目标对象。如果有相同的属性名,后面的源对象的属性会覆盖前面的。这个方法有一些特点和注意事项,本文将介绍以下几点:

1.只会拷贝本身的,不会拷贝prototype上的属性Object.assign()只会复制源对象自身的属性,不会复制它继承自原型链的属性。

function Person(name, age) {
this.name = name;
this.age = age;
}

Person.prototype.sayHello = function() {
console.log("Hello, I'm ${this.name}.");
};

let p1 = new Person('Alice', 20);
let p2 = Object.assign({}, p1);

console.log(p2); // {name: "Alice", age: 20}
console.log(p2.sayHello); // undefined

可以看到,p2对象没有复制p1对象的sayHello方法,因为这个方法是定义在Person.prototype上的,不属于p1对象自身的属性。

2.如果有同名的属性,后面的会覆盖前面的Object.assign()会按照源对象的顺序依次复制属性到目标对象,如果有同名的属性,后面的会覆盖前面的。

let obj1 = {a: 1, b: 2};
let obj2 = {b: 3, c: 4};
let obj3 = Object.assign({},obj1,obj2);

console.log(obj3); // {a: 1, b: 3, c: 4}

可以看到,obj3对象的b属性是由obj2对象覆盖了obj1对象的值。

3.如果target是undefined,null,无法转化为包装类,那么报错Object.assign()方法要求第一个参数必须是一个对象或者可以转化为一个对象的值。如果第一个参数是undefined或null,那么它无法转化为包装类(Object),所以会抛出TypeError异常。如果想要避免这种情况,可以使用默认参数或者逻辑运算符来提供一个空对象作为目标对象。

// 使用默认参数
function assign(target = {}, ...sources) {
return Object.assign(target, ...sources);
}

// 使用逻辑运算符
let target = null;
let source = {name: 'Tom'};
Object.assign(target || {}, source); // {name: "Tom"}

4.如果target是undefined,null,无法转化为包装类,那么报错Object.assign()要求目标对象必须是一个可转化为对象的值,否则会报错。如果传入undefined或者null作为目标对象,那么它们无法转化为包装类,所以会抛出TypeError异常。

let target = undefined;
let source = {a: 1};
let result = Object.assign(target, source); // TypeError: Cannot convert undefined or null to object


5.如果source不是对象,只有是string,可以计算,否则没有影响。Object.assign()方法只会复制源对象的自身属性,不会复制继承属性或不可枚举属性。如果源对象不是一个对象,而是一个原始值(比如数字,布尔值,null,undefined),那么它会被忽略,不会对目标对象产生任何影响。但是,如果源对象是一个字符串,那么它会被转化为一个类似于数组的对象,每个字符都是一个属性,然后复制到目标对象。

let target = {};
let source = 'hello';
Object.assign(target, source); // {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}


6.Object.assign的拷贝是浅拷贝,不是深拷贝Object.assign()方法只会复制源对象的属性值,而不会复制属性的引用。这意味着如果源对象的属性值是一个对象或数组,那么目标对象和源对象会共享同一个引用,修改其中一个会影响另一个。这就是浅拷贝的特点。如果想要实现深拷贝,就需要使用其他的方法,比如JSON.parse(JSON.stringify())或者递归遍历。

let target = {};
let source = {name: 'Tom', age: 20, hobbies: ['reading', 'writing']};
Object.assign(target, source); // {name: "Tom", age: 20, hobbies: ["reading", "writing"]}
target.name = 'Jerry';
target.hobbies.push('coding');
console.log(target); // {name: "Jerry", age: 20, hobbies: ["reading", "writing", "coding"]}
console.log(source); // {name: "Tom", age: 20, hobbies: ["reading", "writing", "coding"]}

以上就是Object.assign()方法的一些注意事项,希望对你有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值