基本类型(数字,字符串等)按值传递,但对象是未知的,因为它们都可以按值传递(如果我们认为保存对象的变量实际上是对对象的引用) )和按引用传递(当我们认为对象的变量包含对象本身时)。
尽管最后并没有什么大不了,但我想知道呈现通过惯例的参数的正确方法是什么。 是否有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楼
- 基元(数字,布尔值等)按值传递。
- 字符串是不可变的,因此对它们而言并不重要。
- 对象通过引用传递(引用通过值传递)。
#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;});
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3139218