如何检查数组中所有元素是否属于同一数据类型?
当然有啦!这里有几个简洁靠谱的方法可以帮你检查数组里所有元素是不是同一类型,咱们一个个来看:
方法1:用Array.every()搭配typeof(适合基础类型判断)
这是最直观的方式——拿数组第一个元素的类型当参照,然后检查剩下所有元素的类型是否和它完全一致。代码示例如下:
function allSameType(arr) { // 空数组的处理可以根据你的需求调整,这里默认返回true if (arr.length === 0) return true; const firstElementType = typeof arr[0]; return arr.every(item => typeof item === firstElementType); } // 测试看看效果 console.log(allSameType([1, 2, 3, 4])); // 输出 true console.log(allSameType([2, 3, 4, "foo"])); // 输出 false
要注意哦,typeof对string、number、boolean这类基础类型很精准,但碰到引用类型(比如数组、普通对象),它都会返回object,如果你的数组里有这类引用类型,需要更细致的区分,就试试下面的方法。
方法2:对比构造函数(区分引用类型)
如果需要区分数组、对象这类引用类型,可以用元素的constructor属性来做对比,这样能精准判断它们是不是同一个构造函数的实例:
function allSameConstructor(arr) { if (arr.length === 0) return true; const firstConstructor = arr[0].constructor; return arr.every(item => { // 先处理null和undefined,它们没有constructor属性 if (item == null) return false; return item.constructor === firstConstructor; }); } // 测试案例 console.log(allSameConstructor([[], [], []])); // true(都是Array实例) console.log(allSameConstructor([{}, new Object(), {}])); // true(都是Object实例) console.log(allSameConstructor([1, 2, new Number(3)])); // true(字面量和Number实例的构造函数都是Number) console.log(allSameConstructor([[], {}])); // false(数组和对象的构造函数不同)
方法3:用Object.prototype.toString.call()(最精准的类型判断)
这个方法能返回最精确的类型标识字符串,比如[object Array]、[object Number],连null和undefined都能区分开,适合对类型判断要求极高的场景:
function allSamePreciseType(arr) { if (arr.length === 0) return true; const firstTypeStr = Object.prototype.toString.call(arr[0]); return arr.every(item => Object.prototype.toString.call(item) === firstTypeStr); } // 测试效果 console.log(allSamePreciseType([1, 2, 3])); // true -> 都是[object Number] console.log(allSamePreciseType([[], {}])); // false -> 一个是[object Array],一个是[object Object] console.log(allSamePreciseType([null, undefined])); // false -> 分别是[object Null]和[object Undefined]
额外小提示
- 空数组的处理:上面的函数都默认空数组返回true,如果你业务里觉得空数组应该返回false,直接把
if (arr.length === 0) return true;改成return false;就行。 - 特殊值处理:比如
NaN的typeof是number,如果数组里混了NaN和普通数字,会被判定为同一类型,这点要根据你的需求提前考虑。
内容的提问来源于stack exchange,提问作者Sacha
相关产品推荐
相关产品推荐

