Uint16Array不是String.fromCharCode.apply的有效参数

时间:2014-06-04 12:04:00

标签: javascript jasmine phantomjs

关于数组缓冲区和字符串之间转换的单元测试,我遇到了一个奇怪的问题。

此代码取自:http://updates.html5rocks.com/2012/06/How-to-convert-ArrayBuffer-to-and-from-String。适用于这个小提琴:http://jsfiddle.net/W3DH9/

function ab2str(buf) {
    return String.fromCharCode.apply(null, new Uint16Array(buf));
}

function str2ab(str) {
    var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
    var bufView = new Uint16Array(buf);
    for (var i=0, strLen=str.length; i<strLen; i++) {
        bufView[i] = str.charCodeAt(i);
    }
    return buf;
}

alert(ab2str(str2ab('foo')));

我实现了代码并在jasmine中为它编写了一个单元测试。在这里我得到一个奇怪的错误,说TypeError: '[object Uint16Array]' is not a valid argument for 'Function.prototype.apply' (evaluating 'new Uint16Array(buf)')

我正在运行PhantomJS 1.9.7和Node v0.10.22

如果我将其记录到控制台,则为Object{prototype: Object{subarray: function subarray() { ... }, BYTES_PER_ELEMENT: 2, set: function set() { ... }}, BYTES_PER_ELEMENT: 2}

我的Chrome浏览器会在本机代码中实现此功能。

似乎String.fromCharCode无法应用于类似对象的数组。

1 个答案:

答案 0 :(得分:0)

这是由于PhantomJS中的错误:

请参阅https://github.com/ariya/phantomjs/issues/11172