JavaScript 数据类型与类型判断详解( 二 )

因为所有原型链的尽头都是 object,所以就造成了这种状况 。当你自定义了一个类A,并且继承了一个原生类B,这个时候 检测结果未必准确 :
A instanceof A // trueA instanceof B // trueA instanceof Object true2.无法判断字面量方式创建的基本数据类型对于基本数据类型来说, 字面量方式 创建出来的结果和 实例方式创建 的是 有一定区别 的
console.log(1 instanceof Number)//falseconsole.log(new Number(1) instanceof Number)//true【JavaScript 数据类型与类型判断详解】从严格意义上来讲, 只有实例创建出来的结果才是标准的对象数据类型值 ,也是标准的Number这个类的一个实例;对于字面量方式创建出来的结果是基本的数据类型值,不是严谨的实例,但是由于JS的松散特点,导致了可以使用Number.prototype上提供的方法 。
3. 无法检测 null 和 undefined对于特殊的数据类型null和undefined,他们的所属类是Null和Undefined,但是浏览器把这两个类保护起来了,不允许我们在外面访问使用 。

JavaScript 数据类型与类型判断详解

文章插图
 
constructorconstructor 作用和 instanceof 非常相似 。但 constructor 检测 Object 与 instanceof 不一样,还可以处理基本数据类型的检测 。
var aa=[1,2];console.log(aa.constructor===Array);//trueconsole.log(aa.constructor===RegExp);//falseconsole.log((1).constructor===Number);//truevar reg=/^$/;console.log(reg.constructor===RegExp);//trueconsole.log(reg.constructor===Object);//falseconstructor的缺点1.无法检测 null 和 undefinednull 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断 。
2.不稳定函数的 constructor 是不稳定的,这个主要体现在把类的原型进行重写,在重写的过程中很有可能出现把之前的 constructor 给覆盖了,这样检测出来的结果就是不准确的,由此可知 instanceof 同样也存在这个问题 。
function Fn(){}Fn.prototype = new Array()var f = new Fnconsole.log(f.constructor)//ArrayObject.prototype.toString.call()这就是大名鼎鼎的全能方法,最准确最常用,据 MDN 描述
每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用 。默认情况下,toString() 方法被每个 Object 对象继承 。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型 。
在 Number、String,Boolean,Array,RegExp、Date、Function 等对象上 toString() 方法都是被重写过了的,会按照一定的规则返回字符串 。但是在 object 对象上,这个方式是返回当前方法执行的主体(方法中的this)所属类的详细信息即"[object Object]",其中第一个object代表当前实例是对象数据类型的(这个是固定的 onject),第二个Object代表的是this所属的类型 。
为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Function.prototype.call() 或者 Function.prototype.Apply() 的形式来调用,传递要检查的对象作为第一个参数,称为 thisArg 。
Object.prototype.toString.call('') ;// [object String]Object.prototype.toString.call(1) ;// [object Number]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(new Function()) ; // [object Function]Object.prototype.toString.call(new Date()) ; // [object Date]Object.prototype.toString.call([]) ; // [object Array]Object.prototype.toString.call(new RegExp()) ; // [object RegExp]Object.prototype.toString.call(new Error()) ; // [object Error]Object.prototype.toString.call(document) ; // [object htmlDocument]Object.prototype.toString.call(window) ; //[object global] window是全局对象global的引用总结 
JavaScript 数据类型与类型判断详解

文章插图
 




推荐阅读