前言
js的数据类型分为两种:
基本数据类型:boolean,null,undefined,string,number,symbol(es6)
引用数据类型: object,array,function
1、typeof
typeof 操作符返回一个字符串,表示未经计算的操作数的类型。
typeof true // "boolean"
typeof null // "object"
typeof undefined // "undefined"
typeof 'abc' // "string"
typeof 1 // "number"
typeof Symbol() // "symbol"
typeof {} // "object"
typeof [] // "object"
typeof function() {} // "function"
typeof
可以识别 boolean,undefined,string,number,symbol,function,object。不能识别array,null
2、instanceof
instanceof 运算符 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
注:因为 null 和 undefined 没有构造函数,所以会报错
true instanceof Boolean // false
null instanceof null // Uncaught TypeError: Right-hand side of 'instanceof' is not an object
undefined instanceof undefined // Uncaught TypeError: Right-hand side of 'instanceof' is not an object
'abc' instanceof String // false
1 instanceof Number // false
Symbol() instanceof Symbol // false
({}) instanceof Object // true
[] instanceof Array // true
[] instanceof Object // true
(function() {}) instanceof Function // true
小提示:因为{}
和 function() {}
会被js 当成代码块,所以如果直接 instanceof
会报错Unexpected token 'instanceof'
,所以外面加了小括号。
instanceof
不能识别数据类型 number、boolean、string、undefined、null、symbol,基本可以正确识别引用数据类型array,object,function。
注意:如果通过instanceof
判断是不是Object
,需谨慎。因为从结果可以看到[] instanceof Object
返回结果也为true
。
3、constructor
注:因为 null 和 undefined 没有构造函数,所以两者都没有constructor属性。
true.constructor === Boolean // true
'abc'.constructor === String // true
(1).constructor === Number // true
Symbol().constructor === Symbol // true
({}).constructor === Object // true
[].constructor === Array // true
(function() {}).constructor === Function // true
小提示: 1外面需要加()
,因为1.constructor
中的.
会被当成小数点,所以会报错。{}
和function() {}
外面加括号,同2。
constructor
判断是准确的,但是不安全,因为contructor
的指向是可以被改变的。
4、Object.prototype.toString.call
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('abc') // "[object String]"
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call(Symbol()) // "[object Symbol]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call(function() {}) // "[object Function]"
Object.prototype.toString.call
方法,可以很准确且安全的判断类型。
项目中用哪个,需要根据场景判断。一般情况下,判断基本数据类型用 typeof
,引用数据类型用 instanceof
。
END,感谢阅读!欢迎评论区留言讨论~