类型
将JS的数据类型分为以下两类:
-
基本类型:String、Number、Boolean、Undefined、Null、Symbol
-
引用类型:Object、Array、RegExp、Date、Function
方法
Object.prototype.toString.call
除自定义类型外,几乎通用。返回:[object, 类型],类型首字母大写
Object.prototype.toString.call("1"), // [object String]
Object.prototype.toString.call(1), // [object Number]
Object.prototype.toString.call(true), // [object Boolean]
Object.prototype.toString.call(null), // [object Null]
Object.prototype.toString.call(undefined), // [object Undefined]
Object.prototype.toString.call({x:1}), // [object Object]
Object.prototype.toString.call([1]), // [object Array]
Object.prototype.toString.call(new Date()) // [object Date]
typeof
通过typeof判断基础类型,基本可返回对应的数据类型(PS:除null外)
console.log(typeof "1") // string
console.log(typeof 1) // number
console.log(typeof true) // boolean
console.log(typeof undefined) // undefined
console.log(typeof Symbol()) // symbol
但注意以下情况,选择运用 typeof 判断前,避免踩坑:
- 判断
引用类型,看看 Function 类型
console.log(typeof []) // object
console.log(typeof (()=>{})) // function
- 判断由
new运算符创建的类型
console.log(typeof new String(1)) // object
console.log(typeof new Number(1)) // object
console.log(typeof new Boolean(1)) // object
console.log(typeof new Array([1])) // object
console.log(typeof new Date()) // object
注意:Function 构造函数创建一个新的 Function 对象,可使用typeof判断
console.log(new Function()) // ƒ anonymous() {}
console.log(typeof new Function()) // function
- 判断
null
console.log(typeof null) // object
- 判断
NaNNaN为非数据类型,用typeof判断,返回结果特别~
console.log(typeof NaN) // number
instanceof
弥补了 typeof 在对引用类型判断的坑,但在基础类型判断上不占优势
- 引用类型的值均为 Object 的实例
console.log([] instanceof Array) // true
console.log([] instanceof Object) // true
console.log((()=>{}) instanceof Function) // true
console.log((()=>{}) instanceof Object) // true
- 基本类型不是对象,所以使用 instanceof 判断均为
false
console.log('str' instanceof String) // false
console.log(new String('str') instanceof String) // true
- 特殊的
null
console.log(typeof null) // object
console.log(null instanceof Object) // false
constructor属性
constructor 是原型 prototype 的一个属性
相比Object.prototype.toString.call,还可以判断自定义类型
console.log((1).constructor == Number) // true
console.log("1".constructor == String) // true
console.log([].constructor == Array) // true
console.log(({}).constructor == Object) // true
// 自定义类型
function Person(name) {
this.name = name;
}
let person = new Person("Alison");
console.log(person.constructor == Person) // true
其他
isNaN()
除typeof外,NaN也要避免用===判断,解决方法:isNaN()
console.log(isNaN(NaN)) // true
console.log(NaN === NaN) // false
Array.isArray()
用于确定值是否为 Array。若值是 Array,返回true,否则false
console.log(Array.isArray([1])) // true
console.log(Array.isArray("1")) // false
Object.is()
判断两个值是否为同一个值,弥补了== 或 ===的不准确运算。PS:Object.is不会强制转换传递的两个值
console.log(Object.is(NaN, NaN)) // true
console.log(Object.is(+0, -0)) // false
Last but not least
如有不妥,请多指教~