如何将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类型则抛出错误。但是,这似乎很容易产生核武器并且容易出错!
答案 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'关键字,您将以字符串的形式获取操作数的类型,例如“数字”,“布尔值”,“未定义”。在将值添加到数组之前进行验证。