【发布时间】:2014-02-16 22:58:41
【问题描述】:
查看spec,以下行为似乎没有明确定义:
var array = new Uint8Array( 1 );
var result = ( array[ 0 ] = 0x100 );
// Is result === 0x100 or 0 ?
Chrome 返回的是 0x100 而不是 0,但我可以相信这个结果是一致的吗?
【问题讨论】:
查看spec,以下行为似乎没有明确定义:
var array = new Uint8Array( 1 );
var result = ( array[ 0 ] = 0x100 );
// Is result === 0x100 or 0 ?
Chrome 返回的是 0x100 而不是 0,但我可以相信这个结果是一致的吗?
【问题讨论】:
你在这里做什么:
var result = ( array[ 0 ] = 0x100 );
实际上与同时将数组和结果设置为相同的值(括号无关紧要,因为 0x100 是被评估并传递给结果的那个):
var result = array[ 0 ] = 0x100;
或扩展:
array[ 0 ] = 0x100;
var result = 0x100;
很明显result 在这种情况下是 0x100 (256)。
但是 array 的内容是 0,如果你直接 log 就可以看到:
console.log(array[ 0 ]);
(如果您使用 Uint8ClampedArray 而不是该值将是 0xff 或 255)。
因此,在这种情况下,结果将是一致的,但会绕过与结果变量和值集相关的数组。数组也将被设置,但该值适合无符号字节范围,而结果 var 的值是原样。
【讨论】:
int A = B = 0x100 会做类似A = B.operator=(0x100) 的事情。此运算符重载是否会返回 0x100 以外的其他值,那么 A 将不等于最右边的值。由于这样的概念似乎并不连贯,所以我也会在 JS 中找到它。您是否可以参考可以确认您的答案的标准?
lref = rval 的情况下,底层的PutVal(lref, rval) 操作不会返回任何内容,整个表达式的结果应该是rval 本身。