0

test262测试套件具有包含源的测试:

var x=0, y=0;
var z=
x
++
++
y

注释说:

由于后缀递增/递减运算符(I/DO)和操作数之间的LineTerminator(LT)是不允许的,自动分号插入后两个引用之间用[LT]分隔的两个IO(就像两个DO及其组合)导致语法错误

为什么这段代码会导致语法错误?我认为这是一个有效的代码片段。上面的代码等于var z=x; ++ ++ y;。javascript语法允许表达式++ ++ y。所以有什么问题?

4

3 回答 3

4

此代码将变为:

var z = x;
++ ++ y;

++ ++ y是问题的根源。让我们看看为什么...

++ ++ y被评估为++(++y). 第一步是评估(++y)++运算符增加它旁边的变量引用的值,并返回增加的值。这里重要的部分是它不返回一个引用,只是一个值。所以第二步是++(1), (或任何++y产生的),这是一个错误,因为只能增加引用。

于 2013-01-14T19:58:54.107 回答
-1

评估为:

var x = 0, y = 0;
var z = x ++ ++ y; //MAKES NO SENSE!
于 2013-01-14T19:17:50.310 回答
-1

语法不允许在++or--运算符之前使用换行符;这样的换行符必须转换为;. 因此,表达式必须被解析为好像它是:

var x = 0 , y = 0 ;
var z = x ;
++ ;
++ y ;

第三行是非法的。

参考:

第 7.9.1 节,“自动分号插入规则”,规则 3

第 11.3 节,“11.3 后缀表达式”。

于 2013-01-14T19:57:46.267 回答