单一类型的Javascript / ES6数组

时间:2018-08-08 21:20:36

标签: javascript arrays ecmascript-6

如何将JS数组限制为一种类型?例如。字符串。

说我有以下代码:

const arr = [];
arr.push('this is a string'); // accept
arr.push('I do not want numbers in this array'); // accept
arr.push(5); // reject - it's not a string!

如何拒绝上次推送或任何其他尝试添加非字符串类型变量的推送? 我能想到的唯一方法是制作一个自定义类,该类扩展Array并覆盖诸如push之类的函数,以检查要添加的元素的类型,如果不是string类型则抛出错误。但是,这似乎很容易产生核武器并且容易出错!

4 个答案:

答案 0 :(得分:2)

生成一个从Array继承的新构造函数。

function array2 (){
    var obj = [];
    Object.setPrototypeOf(obj,array2.prototype);
    return obj;
}

array2.prototype = Object.create(Array.prototype);

array2.prototype.push = function(){
    if(Array.prototype.slice.call(arguments).some(function(d,i){return typeof d !== "string"})){
        return;
    }
    return Array.prototype.push.apply(this,arguments);
}

var u = new array2;
u.push(3); //u still empty;
u.push("3"); //returns 1, u is ["3"];

如果需要,可以修改并抛出。等

答案 1 :(得分:1)

如果要向Javascript添加类型安全性,我建议使用TypeScript。下面是您可以用来确保所推送的内容正确的函数

const pushType = (arr, value, type) => {
  if (typeof value === type) {
    arr.push(value);
  }
};

pushType(['a', 'b'], 'c', 'string');

答案 2 :(得分:0)

扩展Array类以修改如下的推送功能

   class StringArray extends Array {
      constructor(){
       super();
      }
      push(d){
        if(typeof d === "string"){
           this[this.length] = d;
        }
      }
    }

它将仅推送字符串类型的数据

var arr = new StringArray();
arr.push(1) // won't push
arr.push("1") //pushed

答案 3 :(得分:-1)

您可以添加类型验证。使用'typeof'关键字,您将以字符串的形式获取操作数的类型,例如“数字”,“布尔值”,“未定义”。在将值添加到数组之前进行验证。