原始类型
Undefined,Null ,Boolean,Number,String,Symbol
引用类型
Object ,Array ,Function
判断类型
用typeof, constructor,Object.prototype.toString.call 来比较
a. null
let n = null;
console.log(typeof n);
// null 无 constructor
// console.log(n.constructor);
console.log(Object.prototype.toString.call(n));
// ---打印结果---
// object
// [object Null]
b. undefined
let u = undefined;
console.log(typeof u);
// undefined 无 constructor
// console.log(u.constructor);
console.log(Object.prototype.toString.call(u));
// ---打印结果---
// object
// [object Undefined]
c. string
let string = 'string';
console.log(typeof string);
console.log(string.constructor);
console.log(Object.prototype.toString.call(string));
// ---打印结果---
// string
// [Function: String]
// [object String]
d. boolean
let boolean = false;
console.log(typeof boolean);
console.log(boolean.constructor);
console.log(Object.prototype.toString.call(boolean));
// ---打印结果---
// boolean
// [Function: Boolean]
// [object Boolean]
e. number
let number = 123, nan = NaN;
console.log(typeof number);
console.log(typeof nan);
console.log(number.constructor);
console.log(nan.constructor);
console.log(Object.prototype.toString.call(number));
console.log(Object.prototype.toString.call(nan));
console.log(Number.isNaN(number));
console.log(Number.isNaN(nan));
// ---打印结果---
// number
// number
// [Function: Number]
// [Function: Number]
// [object Number]
// [object Number]
// false
// true
f. symbol
let s = Symbol();
console.log(typeof s);
console.log(s.constructor);
console.log(Object.prototype.toString.call(s));
// ---打印结果---
// symbol
// [Function: Symbol]
// [object Symbol]
g. function
let f = function() {};
console.log(typeof f);
console.log(f.constructor);
console.log(Object.prototype.toString.call(f));
// ---打印结果---
// function
// [Function: Function]
// [object Function]
h. object
let obj = {};
console.log(typeof obj);
console.log(obj.constructor);
console.log(Object.prototype.toString.call(obj));
// ---打印结果---
// object
// [Function: Object]
// [object Object]
i. array
let arr = [];
console.log(typeof arr);
console.log(arr.constructor);
console.log(Object.prototype.toString.call(arr));
// ---打印结果---
// object
// [Function: Array]
// [object Array]
由此可见,typeof是不可信的,只能判断原始类型里面的Undefined,Boolean,Number,String,Symbol,对于 Null ,则判断为 Object,对于 Array ,Function ,则全判定为 Object 。
Object.prototype.toSrting.call 比 constructor 全面一点,constructor 不可以检测 Null 以及 Undefined ,除此之外两者的判定结果是一样,能准确检测类型。
对于 NaN ,三者都不能准确判定,需要 Number.isNaN 来辅助判定。