javascript - 什么时候复制值?

标签 javascript

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

数字 - ?
string - 不可变的,所以没关系
对象 - 引用
数组 - ?
函数 - ?
正则表达式 - ?

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

function SomeFunc(func) {
    var numba = 0;
    var innerFunc = function() {
       numba = func(numba);//try commenting me out and switching to next line
        //func(numba);//numba fails to increment
       return numba;
    };
   return innerFunc;
}

//this variable should persist the numba variable through closure.  Incrementing each call by 1.
var closure = SomeFunc(function(numba) {
    numba = numba + 1;
    return numba;
});

document.writeln(closure());
document.writeln(closure());
document.writeln(closure());

因为 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 - 什么时候复制值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7853120/

相关文章:

javascript - 在节点打开时渐进加载 JSTree

javascript - 如何通过按钮切换表单?

php - 获取统计数据并在图表中显示 - PHP/HighCharts

javascript - 使用 ng-repeat 或 ng-options 选择框 Angular 并删除空白选项

javascript - 在 JQuery Mobile 的 div 容器中打开链接

javascript - javascript中的交互式grep?

javascript - 根据 body 类别更改占位符值

javascript - 在 Jquery 中触发复选框更改类

javascript - 如何在javascript中更改表格单元格的颜色

javascript - 如何使用javascript绘制签名(单击、按住和移动鼠标)?