/**
* @param{*}基本数据类型、引用类型
* @desc 基本数据类型(原始类型|简单数据类型):number、boolean、null、undefined、string
* 一种复杂数据类型object。可以用typeof检测 返回字符串
* ES6新增的数据类型symbol
* ES6新增的数据结构:set、map
*
* 使用typeof、instanceof、Object.prototype.toString(o) 分别来检测的区别
*
*/
var arr = ['ooo']
var str = 'ooo'
var num = 123
var un = undefined
var nul = null
var boo = true
var obj = { name: 'li' }
1.使用typeof
console.log(typeof arr) // object
console.log(typeof str) // string
console.log(typeof num) // number
console.log(typeof un) // undefined
console.log(typeof nul) // object
console.log(typeof boo) // boolean
console.log(typeof obj) // object
typeof 操作符可以判断一个变量是string、undefined、boolean还是number类型,返回的是字符串。但是无法准确判断一个变量是对象object、array还是null。
2.使用instanceof
console.log(`${arr instanceof Object}`) // true
console.log(`${arr instanceof Array}`) // true
console.log(`${str instanceof Object}`) // false
console.log(`${str instanceof String}`) // false
console.log(`${obj instanceof Object}`) // true
instanceof可以检测一个变量是不是引用类型的实例,所有引用类型都是object实例。上例的字符串不能被检测,因为字符串是基本数据类型,instanceof无法检测基本数据类型。
可以使用Array.isArray(arr)方法检测某数组。
console.log(${Array.isArray(arr)}
) // true
3.使用Object.prototype.toString.call()
console.log(Object.prototype.toString.call(arr)) // [object Array]
console.log(Object.prototype.toString.call(str)) // [object String]
console.log(Object.prototype.toString.call(num)) // [object Number]
console.log(Object.prototype.toString.call(un)) // [object Undefined]
console.log(Object.prototype.toString.call(nul)) // [object Null]
console.log(Object.prototype.toString.call(boo)) // [object Boolean]
console.log(Object.prototype.toString.call(obj)) // [object Object]
使用Object.prototype.toString.call() 可以区分出检测值是null 、array还是object构造函数。返回的值是字符串类型"[object Object]",第二个类型名称首字母大写。而typeof返回的是字符串全小写"object"。
null、undefined
console.log(!null && typeof null === 'object')
console.log(!undefined && typeof undefined === 'undefined')
NaN
typeof NaN === 'number' // true
NaN === NaN // false
isNaN(NaN) // true