Javascript 何时复制值?

Javascript 何时复制值?,javascript,Javascript,我知道Javascript总是通过引用传递对象。但是其他类型的呢 数字-? 字符串-不可修改,所以这不重要 对象-ref 数组-? 功能-? regexp-? 我得出的结论是,并非Javascript中的所有值都可以是对象,也不能通过引用传递: 因为numba无法递增,除非我返回数字并在闭包中更新变量……这告诉我这不是通过引用传递。我错过什么了吗 或者以最基本的 function UpdateNumber(numba) { numba = 10; document.write

我知道Javascript总是通过引用传递对象。但是其他类型的呢

数字-?
字符串-不可修改,所以这不重要
对象-ref
数组-?
功能-?
regexp-?

我得出的结论是,并非Javascript中的所有值都可以是对象,也不能通过引用传递:

因为
numba
无法递增,除非我返回数字并在闭包中更新变量……这告诉我这不是通过引用传递。我错过什么了吗


或者以最基本的

function UpdateNumber(numba) {
    numba = 10;  
   document.writeln('in func number becomes ' + numba);
}

var numba2 = 5;
UpdateNumber(numba2);

document.writeln('back to caller number is ' + numba2);
//in func number becomes 10 
//back to caller number is 5 

不可以。JavaScript总是通过值传递,而不是通过引用传递

人们经常混淆在方法中修改对象的能力,并将修改作为通过引用在外部可见。事实并非如此。通过引用传递意味着修改值指向的对象在函数外部可见。比如说

var f1 = function (p1) {
  p1 = 42;
};
var x = {};
f1(x);

在本例中,如果JavaScript实现了按引用传递,则
x==42
为真。但事实并非如此。变量
x
仍然具有值
{}

否。JavaScript总是通过值传递,而不是通过引用传递

人们经常混淆在方法中修改对象的能力,并将修改作为通过引用在外部可见。事实并非如此。通过引用传递意味着修改值指向的对象在函数外部可见。比如说

var f1 = function (p1) {
  p1 = 42;
};
var x = {};
f1(x);

在本例中,如果JavaScript实现了按引用传递,则
x==42
为真。但事实并非如此。变量
x
仍然具有值
{}

每个对象都通过引用传递。事实上,一切都是一个物体

function addProperty( o ) {
    o.property = 'value';
}

// here, we can see that even numbers are passed by reference
var n = new Number( 1 );
addProperty( n );
console.log( n.property );// 'value'
<>但是即使<强>所有的< /强>都被引用传递,对于垃圾,你可以考虑它们是通过值传递的,因为你不能修改它们。

var n = 1;
n.property = 'value';
console.log( n.property );// undefined
在ES 5中,有一个新函数
Object.freeze
,它使对象无法修改。 基本上,当你传递一个垃圾时,你所做的就是传递一个不可变的对象

var n = 1;
var o = Object.create( null );
Object.freeze( o );
doWhatTheFuckYouWant( o );
doWhatTheFuckYouWant( n );

在这两种情况下,您都可以确保函数不会对对象进行任何更改,因为对象没有任何可以更改的内容。因此,您不在乎它是否被克隆。

每个对象都是通过引用传递的。事实上,一切都是一个物体

function addProperty( o ) {
    o.property = 'value';
}

// here, we can see that even numbers are passed by reference
var n = new Number( 1 );
addProperty( n );
console.log( n.property );// 'value'
<>但是即使<强>所有的< /强>都被引用传递,对于垃圾,你可以考虑它们是通过值传递的,因为你不能修改它们。

var n = 1;
n.property = 'value';
console.log( n.property );// undefined
在ES 5中,有一个新函数
Object.freeze
,它使对象无法修改。 基本上,当你传递一个垃圾时,你所做的就是传递一个不可变的对象

var n = 1;
var o = Object.create( null );
Object.freeze( o );
doWhatTheFuckYouWant( o );
doWhatTheFuckYouWant( n );

在这两种情况下,您都可以确保函数不会对对象进行任何更改,因为对象没有任何可以更改的内容。因此,你根本不在乎它是否被克隆。

我认为这样想更有效:

  • 有可变值(对象、数组等)和不可变值(数字、布尔值、字符串)
  • 参数传递总是通过赋值
  • 无法在函数外部看到参数赋值,因为您只是将局部变量更改为指向其他地方
  • 如果对象是可变的,并且您调用方法或分配给属性,那么这些更改将在函数外部看到(即,当对象传递到函数中时,没有对其进行复制)

因此,您不需要了解类型是否通过引用传递,您需要检查它是否是可变的。

我认为这样考虑更有效:

  • 有可变值(对象、数组等)和不可变值(数字、布尔值、字符串)
  • 参数传递总是通过赋值
  • 无法在函数外部看到参数赋值,因为您只是将局部变量更改为指向其他地方
  • 如果对象是可变的,并且您调用方法或分配给属性,那么这些更改将在函数外部看到(即,当对象传递到函数中时,没有对其进行复制)

因此,您不需要了解类型是否通过引用传递,您需要检查它是否是可变的。

“对象通过引用传递。它们永远不会被复制”-“Javascript:好的部分”由Douglas编写Crockford@P.Brian.Mackey引用仍按值传递。“按引用传递”和“按值传递引用”之间存在差异。JavaScript做的是后者。在JavaScript中,没有指针,所以通过引用传递具有一种不同的含义…@xavierm02不是真的。其他语言支持无需指针的按引用传递的概念(例如,C#无
不安全
、F#和VB.Net)。通过引用传递的概念可以独立于指针来考虑。它是传递位置而不是值的一种方式。C++也可以代替指针来做。@ Xaviavi02,不要相信你在JS书籍上读到的所有东西。如果您对这个主题感兴趣,请阅读本文:+1至Jared。“对象是通过引用传递的。它们永远不会被复制。”——“Javascript:好的部分”由Douglas撰写Crockford@P.Brian.Mackey引用仍按值传递。“按引用传递”和“按值传递引用”之间存在差异。JavaScript做的是后者。在JavaScript中,没有指针,所以通过引用传递具有一种不同的含义…@xavierm02不是真的。其他语言支持无需指针的按引用传递的概念(例如,C#无
不安全
、F#和VB.Net)。通过引用传递的概念可以独立于指针来考虑。它是传递位置而不是值的一种方式。C++也可以代替指针来做。@ Xaviavi02,不要相信你的一切。