JavaScript将`+ + i`解释为什么?

sam*_*ime 28 javascript

我以前从未见过的一件有趣的事情发布在另一个问题上.他们有类似的东西:

var i = + +1;
Run Code Online (Sandbox Code Playgroud)

他们认为额外+将它转换为字符串,但他们只是添加到一个字符串,这是导致它转换的.

然而,这引出了一个问题:这里发生了什么?

我本来希望这是一个编译器错误,但JavaScript(至少在Chrome中)对它来说很好......它基本上什么都不做.

我创建了一个小JSFiddle来演示:Demo

var i = 5;
var j = + +i;
document.body.innerHTML = i === j ? 'Same' : 'Different';
Run Code Online (Sandbox Code Playgroud)

任何人都知道实际发生了什么以及JavaScript在这个过程中做了什么?

我想也许它会像对待它一样++i,但i不会增加,你甚至可以使用一个值(例如+ +5)来做,这是你无法做到的++(例如,++5是一个参考错误).

间距也不会影响它(例如,+ + 1并且+ +1是相同的).

我最好的猜测是它基本上将它们视为正面/负面的迹象并将它们组合在一起.它看起来像1 == - -1-1 == + -1,但是这仅仅是太奇怪了.

这只是一种古怪的行为,还是在某个标准中记录?

Mad*_*iha 32

将您的语句通过AST Explorer,我们可以看到我们得到的是两个嵌套的一元表达式,带有一元+运算符.

它是一个由+和组成的一元表达式+i,并且+i本身是一个由+和组成的一元表达式i.

使用一元+运算符的一元表达式将表达式部分转换为数字.所以你实际上转换i为一个数字,然后再将其结果转换为数字(这是一个无操作).

为了完成,它可以在您添加的级别上工作:

var i = 5;
console.log(+ + + + + +i); // 5
console.log(i); // still 5
Run Code Online (Sandbox Code Playgroud)

  • 所以这是JavaScript的"buffalo Buffalo buffalo buffalo". (10认同)
  • @samanime你从未使用像`var x = -y;`或`var a = -5;`这样的东西? (7认同)

ssu*_*ube 9

它在规范中.

我们可以从§14.6.2.2中看到增量和减量运算符在一元运算符之前(并且应该是首选)列出.因此,优先权本身并不能解释这一点.

查看§11.7中的标点符号表,我们可以看到++规范中的每个(运算符)实例都将两者一起显示,没有空格.这不是决定性的,直到你检查......

第11.2节中的空白规则,具体为:

白色空格代码点可能出现在StringLiteral,RegularExpressionLiteral,Template或TemplateSubstitutionTail中,它们被视为构成文字值的一部分的重要代码点.它们也可能出现在注释中,但不能出现在任何其他类型的令牌中.

JS不允许任意空格中间运算符.

PegJSEsprima中的JS语法证实了这一点,匹配文字的双字符串++.


Lua*_*ico 6

对我来说非常清楚;

var a = +3;
var b = +a; // same as a, could be -a, for instance
var c = + +a; // same as above, same as +(+a)
Run Code Online (Sandbox Code Playgroud)