You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// L instanceof R
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显式原型
L = L.__proto__; // 取 L 的隐式原型
while (true) {
if (L === null) //已经找到顶层
return false;
if (O === L) //当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__; //继续向上一层原型链查找
}
}
首先
typeof
能够正确的判断基本数据类型,但是除了null
, typeof null输出的是对象。但是对象来说,typeof 不能正确的判断其类型, typeof 一个函数可以输出 'function',而除此之外,输出的全是 object,这种情况下,我们无法准确的知道对象的类型。
instanceof
可以准确的判断复杂数据类型,但是不能正确判断基本数据类型。instanceof
是通过原型链判断的,A instanceof B
, 在A
的原型链中层层查找,是否有原型等于B.prototype
,如果一直找到A
的原型链的顶端(null
;即Object.prototype.__proto__
),仍然不等于B.prototype
,那么返回false
,否则返回true
。其原理代码如下:Symbol.hasInstance
被用于确定构造对象是否是其实例。instanceof
的行为可以通过这个来定制。所以我们可以用这个方法来封装
instanceof
判断数据类型除了typeof、instanceof还有constructor、Object.prototype.toString共四种
使用constructor
1、
null
和undefined
是无效的对象,因此是不会有constructor
存在的,这两种类型的数据需要通过其他方式来判断。2、函数的
constructor
是不稳定的,这个主要体现在自定义对象上,当开发者重写prototype
后,原有的constructor
引用会丢失,constructor
会默认为Object
使用Object.prototype.toString
在任何值上调用
Object
原生的toString()
方法,都会返回一个[object NativeConstructorName]
格式的字符串。对于Object
对象,直接调用toString()
就能返回[object Object]
。而对于其他对象,则需要通过call / apply
来调用才能返回正确的类型信息。但是它不能检测非原生构造函数的构造函数名。
参考文献
The text was updated successfully, but these errors were encountered: