MST

星途 面试题库

面试题:JavaScript 中赋值表达式优化之基础场景

假设有如下代码:let a = {x: 1}; let b = a; b.x = 2; console.log(a.x); 这里 a.x 的值为 2,若要避免这种引用导致的问题,在赋值时如何优化代码?
26.4万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

可以使用对象的解构赋值或者 Object.assign() 方法来创建对象的副本,避免引用导致的问题。

  1. 使用解构赋值
let a = {x: 1}; 
let b = {...a}; 
b.x = 2; 
console.log(a.x); 

这样 a.x 的值仍为 1,因为 ba 的一个浅拷贝。

  1. 使用 Object.assign() 方法
let a = {x: 1}; 
let b = Object.assign({}, a); 
b.x = 2; 
console.log(a.x); 

同样,这里 a.x 的值还是 1Object.assign() 方法也创建了 a 的一个浅拷贝。

如果对象包含嵌套对象,要进行深拷贝,可以使用 JSON.parse(JSON.stringify())(但这种方法有局限性,无法处理函数、正则等特殊对象),或者使用更复杂的递归深拷贝函数。例如:

function deepClone(obj) {
    if (typeof obj!== 'object' || obj === null) {
        return obj;
    }
    let clone = Array.isArray(obj)? [] : {};
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            clone[key] = deepClone(obj[key]);
        }
    }
    return clone;
}

let a = {x: {y: 1}}; 
let b = deepClone(a); 
b.x.y = 2; 
console.log(a.x.y); 

此时 a.x.y 的值仍为 1