一、typeof
適合基本類型及function檢測,遇到null失效
二、instanceof
適合自定義對象,也可以用檢測原生對象,在不同iframe和window間檢測時失效
三.Object.prototype.toStirng.call()和Object.prototype.toString.apply()
實例
要求:
1. 數組中的成員類型相同,順序可以不同。例如[1, true] 與 [false, 2]是相似的。
2. 數組的長度一致。
3. 類型的判斷范圍,需要區分:String, Boolean, Number, undefined, null, 函數,日期, window.
當以上全部滿足,則返回"判定結果:通過",否則返回"判定結果:不通過"。
let data = [{
arr1: [1, true, null],
arr2: [null, false, 100],
expect: true
}, {
arr1: [function () {}, 100],
arr2: [100, {}],
expect: false
}, {
arr1: [null, 999],
arr2: [{}, 444],
expect: false
}, {
arr1: [window, 1, true, new Date(), "hahaha", (function () {}), undefined],
arr2: [undefined, (function () {}), "okokok", new Date(), false, 2, window],
expect: true
}, {
arr1: [new Date()],
arr2: [{}],
expect: false
}, {
arr1: [window],
arr2: [{}],
expect: false
}, {
arr1: [undefined, 1],
arr2: [null, 2],
expect: false
}, {
arr1: [new Object, new Object, new Object],
arr2: [{}, {}, null],
expect: false
}, {
arr1: null,
arr2: null,
expect: false
}, {
arr1: [],
arr2: undefined,
expect: false
}, {
arr1: "abc",
arr2: "cba",
expect: false
}];
for (let i = 0; i < data.length; i++) {
if (arraysSimilar(data[i].arr1, data[i].arr2)) {
console.log("通過")
} else {
console.log("不通過")
}
};
function arraysSimilar(arr1, arr2) {
let compareArr1 = arr1;
let compareArr2 = arr2;
console.log(Object.prototype.toString.call(compareArr1))
console.log(Object.prototype.toString.call(compareArr2))
let typeObj = {};
//第一個if確定了類型相同,//第二個if確定了長度相同,//里面的代碼實現數組一和數組二的數據類型都相同
if (Object.prototype.toString.call(compareArr1) == "[object Array]" && Object.prototype.toString.call(
compareArr2) == "[object Array]") {
console.log("類型相同")
if (compareArr1.length == compareArr2.length) {
console.log("長度相同")
for (let i = 0; i < compareArr1.length; i++) {
let type = Object.prototype.toString.call(compareArr1[i])
typeObj[type] = 123
}
for (let i = 0; i < compareArr2.length; i++) {
let type = Object.prototype.toString.call(compareArr2[i])
console.log(typeof typeObj[type])
if (typeof typeObj[type] != 'undefined') {
return true
} else {
return false
}
}
} else {
return false
}
} else {
return false
}
}