拖延症。。。。得治啊!(纔開始慢慢總結秋招中遇到的問題)
問題是這樣的:
判斷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…我覺得好像還沒說清楚,等我再想想。。。
參考文章