1.typeof,问题是对null的结果是object
console.log(typeof 42); // "number"
console.log(typeof 'hello'); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof { a: 1 }); // "object"
console.log(typeof [1, 2, 3]); // "object"
console.log(typeof function() {}); // "function"
console.log(typeof null); // "object" (这是一个历史遗留的bug)
2.instanceof,常用来检查复杂对象
console.log([1, 2, 3] instanceof Array); // true
console.log({ a: 1 } instanceof Object); // true
console.log(function() {} instanceof Function); // true
console.log(new Date() instanceof Date); // true
console.log(null instanceof Object); // false
console.log(undefined instanceof Object); // false
3.Object.prototype.toString.call,适用于全部类型
console.log(Object.prototype.toString.call(42)); // "[object Number]"
console.log(Object.prototype.toString.call('hello')); // "[object String]"
console.log(Object.prototype.toString.call(true)); // "[object Boolean]"
console.log(Object.prototype.toString.call(undefined)); // "[object Undefined]"
console.log(Object.prototype.toString.call(null)); // "[object Null]"
console.log(Object.prototype.toString.call({ a: 1 })); // "[object Object]"
console.log(Object.prototype.toString.call([1, 2, 3])); // "[object Array]"
console.log(Object.prototype.toString.call(function() {})); // "[object Function]"
console.log(Object.prototype.toString.call(new Date())); // "[object Date]"
console.log(Object.prototype.toString.call(/regex/)); // "[object RegExp]"
console.log(Object.prototype.toString.call(new Map())); // "[object Map]"
console.log(Object.prototype.toString.call(new Set())); // "[object Set]"
4.Array.isArray 用于数组
console.log(Array.isArray([1, 2, 3])); // true
console.log(Array.isArray({ a: 1 })); // false
5.isNaN Number.isNaN
console.log(isNaN(NaN)); // true
console.log(isNaN('hello')); // true (无法转换为数字的字符串)
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN('hello')); // false (严格判断)
优劣:
从其中看的话有第三条的话感觉别的都没有必要了。但typeof的话使用确实更方便快捷,,对于基本类型的判断还是很方便的。而Object.prototype.toString.call的性能可能不如其他,特别在高频使用的情况下,而第四条的话他的语义性比较高,可读性更强