如果所有JavaScript类型都是对象,那么为什么数字是按值传递的?

在关于闭包的文章中,您经常会看到使用自调用函数将闭包创建到循环内部,以便将迭代变量传递给返回的函数表达式,以便在自调用时创建围绕迭代变量值的闭包函数被调用,而不是循环结束后的值。 这里是一个例子:

var func = [];

for (var i = 0; i < 3; i++)
{
    func.push((function(j){ return function(){ console.log(j); }; })(i));
}

// Logs 
// 0
// 1
// 2 
// to the console
for (var i = 0; i < func.length; i++)
{
    func[i]();
}

基于我的简单实验,这项技术可以同时处理数字和字符串。 但是,相同的技术不适用于普通的JavaScript对象。 如果一个对象被传递给一个自调用函数并在一个函数表达式中被引用,那么对该被包含对象的改变在函数表达式中是可见的,因为传递给自调函数的值是对一个对象的引用而不是该对象,就像数字和字符串一样。

我可以理解为什么这种技术不适用于存储对象的变量,但我不明白为什么这种技术应该用数字和字符串工作,其原型链以Object结尾。

这是否意味着字符串和数字只是解释器处理不同的对象的特例,还是我正在遭受根本的误解?


首先,“所有的JavaScript类型都是对象”并不是真的。 原始字符串,数字和布尔值不是对象。

其次,JavaScript中的所有内容都是按价值传递的。 理解“按价值传递”的含义很重要。 这意味着当一个函数被调用时,像这样:

var someVariable = something;
someFunction(someVariable); // <--- this is the function call

那么语言所做的就是复制 someVariable的值并将该副本传递给该函数。 什么是“引用传递”语言会做的是将对该变量的引用传递给该函数。 因为变量值的副本在传递值世界中传递给函数,所以函数绝对没有办法修改someVariable的值。 在“传递参考”语言中,它的确如此。

在某种程度上,C ++可以让你使用任何参数传递方案。 JavaScript不。

JavaScript变量中有对象引用作为值的事实有时并不意味着该语言是通过引用传递的。 我知道这似乎是一个愚蠢的迂腐的区别,但重要的是要明白“传值”和“传递参考”是用于描述语言语义的精确术语。 如果他们没有确切的含义,那么他们就没有用。


还有一件事:当原始值被用作对象时,JavaScript隐式地将字符串,数字和布尔基元值封装在相应的String,Number和Boolean类型的包装中。 当你做一些常见的事情时会发生这种情况:

var five = "hello".length

The的左侧操作数. 运算符必须是一个对象,所以这里没有特殊情况:将基本字符串值隐式提升为String实例。 (运行时真的在封面下做了什么,好吧,我们不能说,也不应该在意。从概念上讲,临时包装对象被创建,使用和丢弃。)


在javascript中有6种基本类型:字符串,数字,布尔值,空值,未定义,符号 - ECMAScript 2015中的新增功能。但是,这些基元有Object包装类。 除nullundefined之外的所有6个都有包装类。 引用这些基元类型按值传递,而不是通过JavaScript设计引用。

链接地址: http://www.djcxy.com/p/51599.html

上一篇: If all JavaScript types are objects, then why are numbers be passed by value?

下一篇: Why is setTimeout executing timeExpired with no delay?