理解JavaScript中的对象传递与赋值操作

54 阅读2分钟

在JavaScript中,对象传递和赋值操作是两个非常重要的概念。它们在日常开发中扮演着关键角色,但也常常会让人感到困惑。本文将通过两个简单的例子,更好地理解它们的区别和实际应用。

示例代码1:修改对象属性

我们先来看第一段示例代码:

let obj = {
  name: 'zs'
}

function fn(p) {
  p.name = 'ls';
}

fn(obj);
console.log(obj);  // 输出: { name: 'ls' }

解释

在这段代码中,我们创建了一个对象 obj,并定义了一个函数 fn。我们将 obj 传递给 fn,然后在函数内部修改它的 name 属性。最后,我们打印 obj 来查看结果。

  • 对象传递(Pass-by-Reference): 当一个对象被传递给一个函数时,传递的是该对象的引用。这意味着函数内部的参数 p 将引用同一个对象 obj,对 p 的任何修改都会反映在 obj 上。因此,当 p.name = 'ls' 执行时,objname 属性被修改为 'ls'

控制台输出:

{ name: 'ls' }

示例代码2:重新赋值对象

接下来,我们看看第二段示例代码:

let obj = {
  name: 'zs'
}

function fn(p) {
  p = {
    name: 'ls'
  };
}

fn(obj);
console.log(obj);  // 输出: { name: 'zs' }

解释

在这段代码中,我们同样创建了一个对象 obj,并定义了一个函数 fn。这次,我们在函数内部将 p 重新赋值为一个新的对象 { name: 'ls' }。最后,我们打印 obj 来查看结果。

  • 赋值操作: 当我们在函数内部执行 p = { name: 'ls' } 时,p 被赋值为一个新的对象引用。这意味着 p 不再引用传入的原始对象 obj,而是引用一个全新的对象 { name: 'ls' }。然而,这个赋值操作只改变了 p 的引用,并没有改变 obj 的引用。因此,obj 仍然指向原始对象 { name: 'zs' }

控制台输出:

{ name: 'zs' }

总结

通过这两个例子,我们了解到:

  1. 对象传递
    • 当对象被传递给函数时,传递的是该对象的引用。对该引用对象的属性修改会影响到原始对象。
  2. 赋值操作
    • 当函数内部对参数重新赋值时,只改变了参数的引用,不会影响到传入的原始对象。

理解这些概念对于编写高效、正确的JavaScript代码至关重要。这篇文章能更好地掌握JavaScript中的对象传递与赋值操作。