js中准确判断数组数据类型

js中判断数据的类型的方法有很多种,具体的原理和用法可以去看看这篇博客:https://www.cnblogs.com/cyy22321-blog/p/16688508.html,下面只是针对数组提出的方式。


一、Object.prototype.toString.call() (推荐使用)

适用于所有类型的判断检测,检测方法是Object.prototype.toString.call(数据) 返回的是该数据类型的字符串。call()方法可以改变this的指向,那么把Object.prototype.toString()方法指向不同的数据类型上面,返回不同的结果。

通过 Object.prototype.toString.call() 将要判断的值作为参数传入,并与字符串 '[object Array]' 进行比较,如果相等,则表示该值是一个数组类型。

let obj = {}
  
        (1) Object.defineProperty(obj,Symbol.toStringTag,{
            get:function(){
                return 'hello'
            }
         })
 
       (2) Object.prototype[Symbol.toStringTag] = 'hello'
 
      console.log(Object.prototype.toString.call(obj))    //[object,hello]

function Foo(){};
const foo = new Foo();
Object.prototype.toString.call(1); // '[object Number]'
Object.prototype.toString.call('1'); // '[object String]'
Object.prototype.toString.call(true); // '[object Boolean]'
Object.prototype.toString.call(undefined); // '[object Undefined]'
Object.prototype.toString.call(null); // '[object Null]'
Object.prototype.toString.call(Symbol(1)); // '[object Symbol]'
Object.prototype.toString.call(Foo); // '[object Function]'
Object.prototype.toString.call(foo); // '[object Object]' , 实例化对象属于Object
Object.prototype.toString.call({}); // '[object Object]'
Object.prototype.toString.call([]); // '[object Array]'
Object.prototype.toString.call(NaN); // '[object Number]' ,此方法判断NaN也属于Number

let arr = [1, 2, 3];
console.log(Object.prototype.toString.call(arr) === '[object Array]'); // 输出 true

let str = 'Hello';
console.log(Object.prototype.toString.call(str) === '[object Array]'); // 输出 false

let obj = { name: 'John' };
console.log(Object.prototype.toString.call(obj) === '[object Array]'); // 输出 false

二、instanceof

主要用于区分引用数据类型,检测方法是检测的类型在当前实例的原型链上,用其检测出来的结果都是true。

要判断的数据 instanceof 构造原型
 const arr = new Array(); // Array 是 js 中内置的构造函数
 console.log(arr instanceof Array); //true
 console.log([] instanceof Array); //true
 console.log({} instanceof Array); //false
 console.log(new Date() instanceof Array); //false

 instanceof的实现原理:验证当前类的原型prototype是否会出现在实例的原型链__proto__上,只要在它的原型链上,则结果都为true。因此,`instanceof` 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 `prototype`,找到返回true,未找到返回false

三、constructor

用于检测引用数据类型,检测方法是获取实例的构造函数判断和某个类是否相同,如果相同就说明该数据是符合那个数据类型的,这种方法不会把原型链上的其他类也加入进来,避免了原型链的干扰。

console.log([].constructor === Array); // true
console.log({}.constructor === Array); // false

四、Array.isArray()

使用 Array.isArray() 方法来准确判断一个值是否为数组类型。该方法返回一个布尔值,如果传入的参数是一个数组,则返回 true,否则返回 false

let arr = [1, 2, 3];
console.log(Array.isArray(arr)); // 输出 true

let str = 'Hello';
console.log(Array.isArray(str)); // 输出 false

let obj = { name: 'John' };
console.log(Array.isArray(obj)); // 输出 false

请注意,Array.isArray() 方法是在 ECMAScript 5 中引入的,因此在使用该方法时,请确保你的 JavaScript 环境支持该方法,很少使用。

posted @ 2023-05-18 17:37  CodeFan*  阅读(115)  评论(0编辑  收藏  举报