这是一个出现过无数次的话题,这里再次重写仅做为我的的学习笔记,谢谢观看。es6
typeof 运算符的主要做用就是用来检测数据的类型,通常状况下咱们都是使用它来判断数据类型,可是这里,我把typeof 放在0的位置,由于 typeof 不能检测到数组类型!typeof 所能识别的类型只有原始类型(Undefined,Null,Boolean,Number,String,Symbol )以及 function 和 object。数组
须要注意的是null,null所检测出来的结果是"object",由于在js中,null除了做为空引用的存在,它也是对象整个原型链上最顶端的存在,即app
Object.prototype.__proto__ === null;//true
其余使用typeof的场景:函数
// Numbers typeof 3.14 === 'number'; typeof Math.LN2 === 'number'; typeof Infinity === 'number'; typeof NaN === 'number'; //尽管NaN是"Not-A-Number"的缩写 // Strings typeof "bla" === 'string'; typeof (typeof 1) === 'string'; //typeof老是返回一个字符串 // Booleans typeof true === 'boolean'; // Symbols typeof Symbol() === 'symbol'; typeof Symbol.iterator === 'symbol'; // Undefined typeof undefined === 'undefined'; // null typeof null === 'object';//从一开始出现JavaScript就是这样的 // function typeof function(){} === 'function'; typeof class C{} === 'function' // Objects typeof {a:1} === 'object'; // 下面的结果是什么? typeof new Boolean(true) === 'object'; typeof new Number(1) === 'object'; typeof new String("abc") === 'object'; //new 所建立的都是对象,赋值给变量是执行了内部valueOf()或者toString()函数
最后,typeof不能检测到数组类型!学习
从原型链上寻找(认祖归宗)prototype
一、Object.getPrototypeOf(obj) == Array.prototypecode
getPrototypeOf: 这是Object自带的一个API,做用是获取一个对象的原型对象对象
二、var bool = Array.prototype.isPrototypeOf(obj)继承
每一个对象都有一个isPrototypeOf的API,继承自Object.prototype,用来 判断father(Array)是不是child(obj)的父对象ip
从构造函数上判断(它的亲娘)
一、obj.constructor == Array
构造函数的prototype指向原型对象,同时,原型对象有constructor指回构造函数对象,constructor只在原型对象上有
二、var bool = obj instanceof Array
instance: 判断对象(obj)是否由构造函数(Array)建立出来
这种方法有一个问题,就是验证不够严格。 即便对象建立时不是使用数组建立的,可是只要原型链上有数组类型,也认为是数组,以下面一段代码:
function Test(){} Test.prototype = Array.prototype; let test = new Test(); test instanceof Array;//true
这个class不是es6中对象声明的class
这个class是每一个对象中记录对象建立时使用的类型的属性,一旦对象被建立,class属性就没法被修改!
得到class的惟一的办法就是调用Object.prototype中的toString()方法
输出结果有"[object Object]","[object Function]"等
问题: 几乎全部内置对象的原型对象都重写了Object中的toString方法,全部内置对象的子对象,都没法直接调到Object的toString。
let arr = [1]; arr.toString();//"1" let date = new Date(); date.toString();//"Wed Mar 07 2018 16:22:16 GMT+0800 (中国标准时间)"
虽然直接使用不行,可是咱们能够利用js的call和apply函数来解决这个问题
Object.prototype.toString.call(obj)=="[object Array]"
使用这个方法判断其余类型:
console.log(Object.prototype.toString.call("jerry"));//[object String] console.log(Object.prototype.toString.call(12));//[object Number] console.log(Object.prototype.toString.call(true));//[object Boolean] console.log(Object.prototype.toString.call(undefined));//[object Undefined] console.log(Object.prototype.toString.call(null));//[object Null] console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object] console.log(Object.prototype.toString.call(function(){}));//[object Function] console.log(Object.prototype.toString.call([]));//[object Array] console.log(Object.prototype.toString.call(new Date));//[object Date] console.log(Object.prototype.toString.call(/\d/));//[object RegExp] function Person(){}; console.log(Object.prototype.toString.call(new Person));//[object Object]
这是ES5出的一个API,专门用来判断一个对象是否是数组的,因此,看到这里有没有感受前面都白看了....
他的用法也很简单:
var arr = [1,2,3,4]; Array.isArray(arr);//true
若是文中有什么错误的地方,还请你们给予指出,另外你们若是还有什么别的方法的话,也能够在评论区写下或私信我,你们集思广益,相互学习,共同进步。