2014-02-16 34 views

回答

3

你在做什么在这里:

var result = (array[ 0 ] = 0x100); 

实际上是相同的(短手)作为同时设置阵列,并在同一时间同一值结果(括号不要紧为0x100的是一个被评估并传递到结果):

var result = array[ 0 ] = 0x100; 

或扩展:

array[ 0 ] = 0x100; 
var result = 0x100; 

因此在这种情况下显然result将是0x100(256)。

阵列的含量为0,如果你直接登录它可以看到:

console.log(array[ 0 ]); 

(如果使用Uint8ClampedArray代替值将是0xff的或255)。

Fiddle

因此,在这种情况下,结果将是一致的,但绕过所述阵列相对于所述结果变量和值集合。数组也将被设置,但该值适合于无符号字节范围,而该值与结果var相同。

+0

我不确定。在C++中,假设B是一个对象,'int A = B = 0x100'会做类似'A = B.operator =(0x100)'的操作。如果这个运算符重载会返回“0x100”以外的值,那么A就不会等于最右边的值。既然这样的概念似乎并不一致,我会除了在JS中找到它。你会参考一个可以证实你答案的标准吗? –

+0

@MaëlNison小提琴确认我的答案,因为你可以在控制台中看到。由于你没有进行比较,所以括号不会返回布尔值,而是返回设定值(0x100)。 JS使用C语法,但与C无关(例如,无类型和动态)。 – K3N

+0

当然,正如我在自己测试的问题中所写的那样,我更多地寻找学术答案:)但是你说得对,我在[ES5规范](http://es5.github.io/ #x11.13.1),它清楚地表明,在'lref = rval'的情况下,底层的PutVal(lref,rval)操作不返回任何东西,整个表达式的结果本身应该是'rval' 。 –