在js中,数据检测的方法有多种。
包括但不限于typeof、instanceof、array.isArray等方法,如其中的typeof 识别的是数据类型,但是无法识别null和array . 引用类型是用instanceof, 而数组则是使用arrary.isarray。
但是object.protype.tostring.call可以识别到null 和array。
前三种已经满足了基本需要,但是这里使用object.protype.tostring.call的原因,不仅是object.protype.tostring.call的检测方法更为安全,实现一个函数的clone,可以对js的5种数据类型进行值复制。
因为toString是object的原型方法,而array、function等类型作为object的实例,都将toString()方法进行了重写。
不同的对象类型调用toString()方法时,根据原型链的知识,调用的是对应的重写后的toString()方法,(function类型返回的内容为函数题的字符串,array类型返回的是元素组成的字符串。。。),并不会去调用object上原型的toString()方法(返回对象的具体类型),所以采用obj .toString() 方法并不能得到其对象类型,只能将obj转化为字符串类型;因此,在想要得到对象的具体类型时,应该调用object上的toString()放大
可以更加准确的判断某个变量的类型。
例如:
this._rulesIsObj = (Object.prototype.toString.call(this._rules) === '[object Object]');
思考:同时作为检测数据类型的方法,为什么会更加推荐使用原型方法obejct.prototype.toString.call(),而不是typeof,这两种方法之间有什么区别?
创建一个变量有两种方法:
var a = "s";//对象变量法
var b = new Object("s")//构造函数
当数据的值分别是undefined和null时,typeof输出的值都是object ,无法区别两个值
const b = "";
var a = new Object("undefined");
const c = Object.prototype.toString.call(a);
console.log(c,"a");
const d = Object.prototype.toString.call(b);
console.log(d,"b");
const e = typeof(a);console.log(e,":e");
const f = typeof(b);console.log(f,":f")```