Javascript 明确的增量和加法会导致错误

Javascript 明确的增量和加法会导致错误,javascript,syntax,increment,addition,operator-precedence,Javascript,Syntax,Increment,Addition,Operator Precedence,在使用JavaScript语法时,我突然想到以下代码将在SpiderMonkey和V8引擎中引发错误: var a = 1, b = 1; a++++b; 这对我来说是很奇怪的,因为下面的方法非常有效: var a = 1, b = 1; a+++b; // = 2; (Add a and b, then increase a) // now a == 2 and b == 1 a+++-b; // = 1; (add a and -b, then increase a) // now a

在使用JavaScript语法时,我突然想到以下代码将在SpiderMonkey和V8引擎中引发错误:

var a = 1, b = 1;
a++++b;
这对我来说是很奇怪的,因为下面的方法非常有效:

var a = 1, b = 1;

a+++b; // = 2; (Add a and b, then increase a)
// now a == 2 and b == 1

a+++-b; // = 1; (add a and -b, then increase a)
// now a == 3 and b == 1
此外,以下代码是无意义的:

var a = 1, b = 1;
a++ ++b; // throws an error
我现在的论点是,如果
a++b
相当于
a++b
,而不是
a++b
,并且
a++-b
相当于
a++-b
,那么
a++b
只能被解释为
a++b
,才能成为有效的JavaScript代码。 相反,引擎坚持将
a+++b
解释为
a+++b

对我来说,这与引擎使用
/
符号实现的逻辑形成对比,以区分除法和正则表达式。一个例子

var e = 30, f = 3, g = 2;

e/f/g; // == 5

e
/f/g; // == 5

/f/g; // is equivalent to new RegExp("f","g")
这里的论点是,因为最后一行中的除法没有意义,所以它被解释为正则表达式

显然,
/
符号得到了特殊处理,以便区分除法和正则表达式。但是为什么
++
--
没有得到特殊待遇呢?(即,外部运算符优先级)


第二个问题是,为什么不在代码具有多个有效解释时才调用运算符优先级。

在代码
A+++b
中,有两个不同的语句:
A++
++b
,没有任何组合。在
a+++++b
上下文中的
++
运算符实际上是一个类型转换器(用于将字符串转换为数字),并且有一个不同的类型,它紧跟在列表中的其他类型之后。

是的,
++
也用于“强制转换”-例如
++“10”
将该
字符串
类型转换为
数字
type@CoryG你能详细说明你的答案吗?我看不出这与我在问题中已经讨论过的有什么不同。@TrenchCode抱歉,如果我说得简短,我一直在写一个解析器,标记器,在过去的几个月里,一种定制语言的抽象语法树系统与JS非常接近,所以我倾向于想当然地认为,一开始我的头脑中有多少PitA是围绕优先顺序的。JS被设计成可以很快地被解析,因此你没有像许多其他语言那样明确的优先顺序,这个列表在不筛选规范的情况下就可以达到它所能达到的水平。像
/
注释和
+
类型转换器之类的东西在整个列表之前和之后都会被解析(续)@TrenchCode对于解析器来说,通过文本进行一次非即时迭代(或者结合前面所有内容的单个解析循环)来确定字符串的内部或外部,然后确定注释的内部或外部相对简单,因此在检查运算符之前,解析器会进行这些操作(如果只是文字或注释形式的文本,为什么还要费心进行语法分析呢?)同样,转换器是JS的一种事后攻击功能,因为事情本来应该是类型不变的,但在实践中并没有这样做,所以它们不会fit@TrenchCode试图标准化JavaScript(或任何语言,编程或口语)转换成非常严格的语法而没有漏洞很少能完美工作(尽管我知道几十个实例,但实际上我想不出一个实例)-它们被设计用来描述任意复杂的事物,并且是可扩展的,而编写它们的人天生就不可能知道所有的用例-除了语言的版本1,你会发现不一致。