【问题标题】:Is the result of (new Uint8Array(1))[0] = 0x100 undefined?(new Uint8Array(1))[0] = 0x100 的结果是否未定义?
【发布时间】: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,但我可以相信这个结果是一致的吗?

【问题讨论】:

    标签: javascript typed-arrays


    【解决方案1】:

    你在这里做什么:

    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)。

    Fiddle

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

    【讨论】:

    • 我不确定。在 C++ 中,假设 B 是一个对象,int A = B = 0x100 会做类似A = B.operator=(0x100) 的事情。此运算符重载是否会返回 0x100 以外的其他值,那么 A 将不等于最右边的值。由于这样的概念似乎并不连贯,所以我也会在 JS 中找到它。您是否可以参考可以确认您的答案的标准?
    • @MaëlNison 小提琴确认了我的答案,正如您在控制台中看到的那样。由于您没有进行比较,因此括号不会返回布尔值,而是返回设置值 (0x100)。 JS 使用 C 语法,但与 C 本身无关(例如,是无类型和动态的)。
    • 当然,正如我在我自己测试过的问题中所写,我更多的是在寻找学术答案:) 但你是对的,我在ES5 spec 上检查了它,它清楚地表明在lref = rval 的情况下,底层的PutVal(lref, rval) 操作不会返回任何内容,整个表达式的结果应该是rval 本身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2019-03-08
    • 2021-11-10
    相关资源
    最近更新 更多