有没有办法测试两个
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实例.