1
望着spec,以下行为似乎并没有作出明确的规定:(new Uint8Array(1))[0] = 0x100的结果未定义?
var array = new Uint8Array(1);
var result = (array[ 0 ] = 0x100);
// Is result === 0x100 or 0 ?
Chrome正在返回0x100
,而不是0
,但我能相信这样的结果是一致的?
望着spec,以下行为似乎并没有作出明确的规定:(new Uint8Array(1))[0] = 0x100的结果未定义?
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)。
但阵列的含量为0,如果你直接登录它可以看到:
console.log(array[ 0 ]);
(如果使用Uint8ClampedArray
代替值将是0xff的或255)。
因此,在这种情况下,结果将是一致的,但绕过所述阵列相对于所述结果变量和值集合。数组也将被设置,但该值适合于无符号字节范围,而该值与结果var相同。
我不确定。在C++中,假设B是一个对象,'int A = B = 0x100'会做类似'A = B.operator =(0x100)'的操作。如果这个运算符重载会返回“0x100”以外的值,那么A就不会等于最右边的值。既然这样的概念似乎并不一致,我会除了在JS中找到它。你会参考一个可以证实你答案的标准吗? –
@MaëlNison小提琴确认我的答案,因为你可以在控制台中看到。由于你没有进行比较,所以括号不会返回布尔值,而是返回设定值(0x100)。 JS使用C语法,但与C无关(例如,无类型和动态)。 – K3N
当然,正如我在自己测试的问题中所写的那样,我更多地寻找学术答案:)但是你说得对,我在[ES5规范](http://es5.github.io/ #x11.13.1),它清楚地表明,在'lref = rval'的情况下,底层的PutVal(lref,rval)操作不返回任何东西,整个表达式的结果本身应该是'rval' 。 –