javascript – 如何在ArrayBuffer,DataView和TypedArray中测试相等性

前端之家收集整理的这篇文章主要介绍了javascript – 如何在ArrayBuffer,DataView和TypedArray中测试相等性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法测试两个 JavaScript ArrayBuffers是否相等?我想为消息编写方法编写测试.我找到的唯一方法是将ArrayBuffer转换为字符串然后进行比较.我错过了什么?

以下代码给出了错误,即使我认为它应该是真的:

(function() {
    'use strict';

    /* Fill buffer with data of Verse header and user_auth
     * command */
    var buf_pos = 0;
    var name_len = 6
    var message_len = 4 + 1 + 1 + 1 + name_len + 1;

    var buf = new ArrayBuffer(message_len);
    var view = new DataView(buf);
    /* Verse header starts with version */
    view.setUint8(buf_pos,1 << 4); /* First 4 bits are reserved for version of protocol */
    buf_pos += 2;
    /* The lenght of the message */
    view.setUint16(buf_pos,message_len);
    buf_pos += 2;

    buf_pos = 0;
    var buf2 = new ArrayBuffer(message_len);
    var view2 = new DataView(buf);
    /* Verse header starts with version */
    view2.setUint8(buf_pos,1 << 4); /* First 4 bits are reserved for version of protocol */
    buf_pos += 2;
    /* The lenght of the message */
    view2.setUint16(buf_pos,message_len);
    buf_pos += 2;


    if(buf == buf2){
        console.log('true');
    }
    else{
        console.log('false');
    }


}());

如果我尝试比较视图和view2它再次是假的.

解决方法

您无法使用==或===在JavaScript中直接比较两个对象.
这些运算符只会检查引用的相等性(即表达式是否引用相同的对象).

但是,您可以使用DataView或ArrayView对象来检索ArrayBuffer对象的特定部分的值并进行检查.

如果要检查标题

if (  view1.getUint8 (0) == view2.getUint8 (0)
   && view1.getUint16(2) == view2.getUint16(2)) ...

或者,如果要检查缓冲区的整体性:

function equal (buf1,buf2)
{
    if (buf1.byteLength != buf2.byteLength) return false;
    var dv1 = new Int8Array(buf1);
    var dv2 = new Int8Array(buf2);
    for (var i = 0 ; i != buf1.byteLength ; i++)
    {
        if (dv1[i] != dv2[i]) return false;
    }
    return true;
}

如果你想基于ArrayBuffer实现一个复杂的数据结构,我建议创建你自己的类,否则你每次想要将火柴杆移入和移出结构时都必须使用繁琐的原始DataView / ArrayView实例.

猜你在找的JavaScript相关文章