JavaScript是按引用传递还是按值传递语言?

我们两清 提交于 2019-12-09 15:11:33

基本类型(数字,字符串等)按值传递,但对象是未知的,因为它们都可以按值传递(如果我们认为保存对象的变量实际上是对对象的引用) )和按引用传递(当我们认为对象的变量包含对象本身时)。

尽管最后并没有什么大不了,但我想知道呈现通过惯例的参数的正确方法是什么。 是否有JavaScript规范的摘录,其中定义了与此相关的语义?


#1楼

当我想将一个对象作为参数传递或修改或完全替换时,我发现Underscore.js库extend方法非常有用。

function replaceOrModify(aObj) {
  if (modify) {

    aObj.setNewValue('foo');

  } else {

   var newObj = new MyObject();
   // _.extend(destination, *sources) 
   _.extend(newObj, aObj);
  }
}

#2楼

基元按值传递,对象按引用传递。 这与其他语言(如C,Visual Basic或Delphi)完全不同。 我不能说它们如何精确地处理对象和基元,但是我知道Visual Basic和Delphi可以(并且应该)指定它们。

从版本5开始,PHP进行了类似的操作:所有对象都通过引用传递,但是所有原语可以通过引用传递(如果前面带有&符)。 否则,基元将按值传递。

因此,在JavaScript中,如果我通过参数将对象X传递给函数,则它仍然是X。如果要更改函数内部的数据(或其他任何对象,但这并不重要),则在功能。


#3楼

  1. 基元(数字,布尔值等)按值传递。
    • 字符串是不可变的,因此对它们而言并不重要。
  2. 对象通过引用传递(引用通过值传递)。

#4楼

函数内部的简单值不会更改函数外部的值(它们通过值传递),而复杂的值会(通过引用传递)。

function willNotChange(x) {

    x = 1;
}

var x = 1000;

willNotChange(x);

document.write('After function call, x = ' + x + '<br>'); // Still 1000

function willChange(y) {

    y.num = 2;
}

var y = {num: 2000};

willChange(y);
document.write('After function call y.num = ' + y.num + '<br>'); // Now 2, not 2000

#5楼

在某些情况下,更改anArg可能会有所帮助:

function alterMyArg(func) {
    // Process some data
    // ...
    func(data);
}

alertMyArg(function(d) {anArg = d;});
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!