不完全笔记-JS类型判断

197 阅读2分钟

类型

将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
  • 判断NaN NaN为非数据类型,用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

如有不妥,请多指教~