拖延症。。。。得治啊!(才开始慢慢总结秋招中遇到的问题)
问题是这样的:
判断JavaScript数据类型的方法:(好了,那也就写一下咯)
- 最常见的:typeof判断,但是它的缺陷是,返回的类型都是字符串形式
typeof null ===object
,- 它不能判断
Array
类型,判断出的数组类型是Object。
- 在已知是对象类型时:instanceof
那么,问题也就来了,instanceof到底是怎样判断的。
- 根据对象的constructor判断:constructor
- constructor 属性返回对创建此对象的数组,函数的引用。
Object.prototype.toString.call()==='[object Array]'
来进行判断。通用,但是很麻烦。
instanceof到底是怎样判断引用类型的。
第一反应是继承,但是我貌似是想多了。
看一段代码:
function A(){}
let a = new A()
console.log(a instanceof A)//true
很明显instanceof就是在判断一个实例是否属于某种类型
当然也很明了,instanceof就可以判断继承关系中用来判断一个实例十六否属于它的父类型。
function instance_of(L,R) {
var o=R.prototype,
L=L.__proto__
while (true){
if(L===null)return false
if(o===L) return true
L=L.__proto__
}
}
所有 JavaScript 对象都有 proto 属性,但只有Object.prototype.proto 为 null,前提是没有在 Firefox 或者 Chrome 下修改过这个属性。这个属性指向它的原型对象。
ok,差不多了,我们继续。
ObjectL = Object, ObjectR = Object;
O = ObjectR.prototype = Object.prototype
L = ObjectL.__proto__ = Function.prototype
// 第一次判断
O !== L
L = Function.prototype.__proto__ = Object.prototype// 循环查找 L 是否还有 __proto__
// 第二次判断
O === L// 返回 true
em…我觉得好像还没说清楚,等我再想想。。。
参考文章