1、typeof 用来检测数据类型的运算符
使用 typeof 检测数据类型,首先返回的都是一个字符串,其次字符串中包含了对应的数据类型
例如:"number"、"string"、"boolean"、“undefined”、"function"、"object"
案例:
console.log(typeof typeof typeof function(){}) === "string"
局限性:
a、typeof null === "object"
b、不能具体细分是数组、正则还是对象中其他值,使用 typeof 检测数据类型对于对象数据类型中的值返回结果都是"object"
2、instanceof 检测某一个实例是否属于某个类
var obj = [12,23]
console.log(obj instanceof Array) // true
console.log(obj instanceof RegExp) // false
局限性:
a、不能用来处理字面量方式创建出来的基本数据类型值,对于基本数据类型来说,字面量方式创建出来的结果和实例方式创建出来的结果是有区别的。严格意义上来说只有实例创建出来的结果才是标准的对象数据类型值,字面量方式创建出来的基本数据类型值,是不严谨的实例,
b、instanceof 特性,只要在当前实例的原型上,检测出来的结果都是 true
在类的原型继承中,检测出来的结果不一定准确,例如:
function Fn(){}
Fn.prototype = new Array;
var f = new Fn // f.__proto__ -> Fn.prototype -> Array.prototype -> Object.prototype
console.log(f instanceof Array) // true
局限性:如果把类的原型进行重写,在重写的过程中很有可能出现把之前的 constructor 给覆盖了,这样检测出来的结果就是不准确的。
console.log(1 instanceof Number) // false
console.log(new Number(1) instanceof Number) //true
3、constructor 构造函数 作用和 instanceof 非常相似
可以处理基本数据类型检测
用 constructor 检测 Object 和 instanceof 不一样,一般情况下检测不了
var obj = [];
console.log(obj.constructor === Array); // true
console.log(obj.constructor === Object) // false
var num = 1;
console.log(num.constructor === Number) // true
4、Object.prototype.toString.call() 是最准确最常用方法
首先获取 Object 原型上的 toString 方法,让方法执行,并且改变方法中的 this 关键字指向
Object.prototype.toString 并不是转换为字符串,而是返回当前方法的执行主体(方法中的 this)所属类的详细信息
var obj = {name:"张三"}
console.log(obj.toString()) // [object Object]
console.log((Math.toString()) // [object Math]
console.log(({name:"张三"}).toString())
理解:toString()中的 this 是 obj,返回的是 obj 所属类的信息,[object Object] 其中第一个 object 代表当前实例是对象数据类型的(这个是固定死的),第二个 Object 代表的是 obj 所属的类是 Object。例如console.log((Math.toString()) // [object Math]
console.log(Object.prototype.toString.call(1)); // [object Number]
console.log(Object.prototype.toString.call("张三")); // [object String]
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(function(){})); // [object Function]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call(/^$/)); // [object RegExp]
理解 toString:
对于 Number、String、Boolean、Array、RegExp、Date、Function 原型上的 toString 方法都是把当前数据类型转换为字符串类型。
网友评论