【问题标题】:Is there a Boolean Typed Array in JavaScript?JavaScript 中有布尔类型数组吗?
【发布时间】:2015-07-09 07:32:36
【问题描述】:

如果我这样做:

var arr=Uint8Array(1);
arr[0]="hi";
console.log(arr[0]);

结果是0,而不是"hi"。这是因为该类型的对象 (Uint8Array) 只允许 8 位无符号整数作为其项的值。

是否有某种类型的类似数组的对象用于存储布尔 (true/false) 值?

如何创建该类型的对象?

注意:请不要使用watch;它不是跨浏览器。我将在任何浏览器中使用它。

【问题讨论】:

  • var arr = [true, false, true]; 不适合你?
  • var arr=[true,false,true]; arr[0]="测试";控制台.log(arr);试试看。
  • 它返回["test", false, true]。有什么问题?
  • "test" 不是布尔值。这个想法是让一个数组能够专门存储布尔值。

标签: javascript arrays boolean


【解决方案1】:

您不能在 JavaScript 中原生地拥有纯布尔数组。特别是在旧版浏览器支持下。在将值插入数组之前检查它的类型。如果它不是布尔值,即typeof x === 'boolean',则不要插入它。

【讨论】:

    【解决方案2】:

    JavaScript 类型数组支持的唯一类型如下:

    • Int8Array
    • Uint8Array
    • Uint8ClampedArray
    • Int16Array
    • Uint16Array
    • Int32Array
    • Uint32Array
    • Float32Array
    • Float64Array

    除此之外,您必须使用像这样的标准 JavaScript 数组:

    var a = [true];
    a[0] = false;
    console.log(a); // false
    

    请注意,作为动态类型语言的 JavaScript 将允许开发人员也将其他类型的值放入数组中(例如 "hi")。您可以使用在仔细检查类型后为用户修改数组的函数来强制类型:

    function set(index, value) {
        if (typeof value != 'boolean') {
            throw new Error('Expected a boolean');
        }
        a[index] = value;
    }
    

    【讨论】:

      【解决方案3】:

      不,没有。这是typed arrays in JS 上的 MDN 文档,您可以看到只有用于各种大小的整数和浮点数的类型化数组。

      至于为什么没有“布尔类型数组”?好吧,我认为 JS 中类型化数组的主要目的是有效地处理 API 的大量数据,并且对于 API 获取大量布尔数据的需求确实不是很多。

      简而言之,主要目的是性能,而不是类型安全。类型化数组的目的并不是防止错误类型的数据被添加到数组中。

      但是,如果您真的想要一个“布尔数组”,您可以在 UInt8Array 周围编写一个包装器,用于存储和读取布尔值,使用按位运算将布尔值存储为单个位。 (即类似this answer,虽然由类型化数组支持)但我会质疑这样做的价值。

      【讨论】:

        【解决方案4】:

        这不是我想要的,但它可能是一个很好的实现:

        Uint8Array.prototype.getBitSum=function() {
         var _t=0;
         [].forEach.call(this, function(v, i) { _t+=Math.pow(256,i)*v; });
         return _t;
        }
        
        Uint8Array.prototype.getBit=function(b) {
         var _t=this.getBitSum();
         return ((_t & Math.pow(2,b)) != false);
        }
        
        Uint8Array.prototype.setBit=function(b, v) {
         var _v=v;
         if (isNaN(_v)) return false;
         var _B=Math.floor(b/8), _B_b=(b%8);
         if (_v) this[_B]|=Math.pow(2,_B_b);
         else this[_B]&=(255-Math.pow(2,_B_b));
         return true;
        }
        

        我对某些术语的了解有限,这对我来说是一项艰巨的工作。 如果您发现一些错误...请添加评论。

        这样做的原因是为了尽量减少内存预留。所以我认为它是正确的。

        【讨论】:

        • 您可以查找 > 运算符。
        • 您实际上是在进行位打包,这是在 JS 中创建布尔类型数组的理想方式。您唯一可以更改的是将 Math 对象方法更改为它们的按位等效项,预计结果会更快。就像除以Math.floor(b/8) 就像b >> 3 而模b%8 将只是b&7 等等...检查this nice article
        【解决方案5】:

        您要求在 JavaScript 中使用 bitset。有一些库在 JavaScript 中实现了位集,例如:

        https://github.com/lemire/FastBitSet.js

        【讨论】:

          猜你喜欢
          • 2011-04-13
          • 2015-04-20
          • 2011-05-30
          • 2018-01-18
          • 2013-01-07
          • 2010-09-13
          • 1970-01-01
          • 2015-07-05
          • 2014-12-11
          相关资源
          最近更新 更多