在javascript中添加两个空白对象或空白数组[重复]

Posted

技术标签:

【中文标题】在javascript中添加两个空白对象或空白数组[重复]【英文标题】:Addition on two blank objects or blank arrays in javascript [duplicate] 【发布时间】:2015-07-21 20:56:51 【问题描述】:

当我发现以下控制台输出时,我只是在玩 javascript

    [] + [] // 输出:"" [] + // 输出:[object Object] + [] // 输出:0 + // 输出:NaN

谁能解释一下这些输出背后的逻辑。我觉得这是一种非常奇怪的行为,但我想它可能有一些逻辑。

提前致谢。

【问题讨论】:

叹息,我知道这已经被问过,但 SO 不允许您搜索 [],因为它们不是单词。 1:20 of this video 【参考方案1】:

预期结果

当您添加两个数组时,一切都按预期工作:

[] + []//output''

[] 转换为原语首先尝试valueOf(),它返回数组本身(this):

var arr = [];
arr.valueOf() === arr
true

由于该结果不是原语,因此接下来调用 toString() 并返回空字符串(这是一个原语)。所以[] + []的结果就是两个空字符串的拼接。

 + [] // output: 0

添加一个数组和一个对象也符合我们的预期:

 [] + //output '[object Object]'

说明:将空对象转换为字符串会产生以下结果。

 String()//output: '[object Object]'

因此,先前的结果是通过连接"""[object Object]" 创建的。

意外结果

如果 + 的第一个操作数是一个空的对象字面量,事情就会变得很奇怪(结果在 Firefox 控制台上可以看到):

 + //output: NaN

这里发生了什么?问题在于 JavaScript 将第一个 解释为空代码块并忽略它。因此,NaN 是通过评估+(加上第二个)来计算的。您在此处看到的加号不是二进制加法运算符,而是一元前缀运算符,它将其操作数转换为数字,其方式与Number() 相同。例如:

+"3.65"
3.65

以下表达式都是等价的:

+
Number()
Number(.toString())  // .valueOf() isn’t primitive
Number("[object Object]")
NaN

为什么第一个 被解释为代码块?因为完整的输入被解析为语句,并且语句开头的花括号被解释为开始代码块。因此,您可以通过强制将输入解析为表达式来解决问题:

( + )//output: '[object Object][object Object]'

函数或方法的参数也总是被解析为表达式:

console.log( + )//output: [object Object][object Object]

经过前面的解释,你应该不会再对下面的结果感到惊讶了:

 + []//output: 0

同样,这被解释为一个代码块,后跟+[]。以下表达式是等价的:

+[]
Number([])
Number([].toString())  // [].valueOf() isn’t primitive
Number("")
0

有趣的是,Node.js REPL 解析其输入的方式与 Firefox 或 Chrome 不同(它们甚至使用与 Node.js 相同的 V8 JavaScript 引擎)。以下输入被解析为表达式,结果并不令人惊讶:

 + //output: '[object Object][object Object]'
 + []//output '[object Object]'

这样做的好处是更像是使用输入作为console.log() 的参数时得到的结果。但这也不太像在程序中使用输入作为语句。

参考文献

What is + in JavaScript?

【讨论】:

以上是关于在javascript中添加两个空白对象或空白数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥将项目添加到空白数组中会重复显示项目?

对象数组打印空白字符串

javascript 判断变量 是否为空null,undefined, 空数组,空对象(空Object),字符串是否为空或全由空白字符组成,数字是否为0,布尔是否为false。

Mongoose 为啥要添加空白数组?

在反序列化时如何忽略JSON对象数组中的空白数组?

我们应该在Rest full services中使用啥JSON空白数组或404错误代码