数据类型

128 阅读1分钟

原始类型

UndefinedNullBooleanNumberStringSymbol

引用类型

ObjectArrayFunction

判断类型

用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是不可信的,只能判断原始类型里面的UndefinedBooleanNumberStringSymbol,对于 Null ,则判断为 Object,对于 ArrayFunction ,则全判定为 Object

Object.prototype.toSrting.call 比 constructor 全面一点,constructor 不可以检测 Null 以及 Undefined ,除此之外两者的判定结果是一样,能准确检测类型。

对于 NaN ,三者都不能准确判定,需要 Number.isNaN 来辅助判定。