一、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
}
}