首先我们需要了解到,在 JavaScript 中有 6 种不同的数据类型:
- string
- number
- boolean
- object
- function
- symbol
3 种对象类型:
- Object
- Date
- Array
2 个不包含任何值的数据类型:
- null
- undefined
然后来看一下今天的重点
1.typeof
操作符用来查看 JavaScript 变量的数据类型。
结论:
typeof可以精准的判断基本数据类型,但是数组(Array)、日期(Date)、对象、null 的数据类型都是 object,我们就无法通过 typeof 来判断他们的类型(无法准确判断引用数据类型)。
2.instanceof
instanceof用来检测构造函数的prototype属性是否出现在某一个实例对象的原型链上,返回的是布尔值,也就是说会顺着原型链去找,直到找到相同的原型对象,返回true,否则为false
3.constructor 属性
constructor 属性返回创建该对象的函数,也就是
构造函数。
"zs".constructor // 返回函数 String() { [native code] }
(5.2).constructor // 返回函数 Number() { [native code] }
false.constructor // 返回函数 Boolean() { [native code] }
[1,2,1].constructor // 返回函数 Array() { [native code] }
{name:'zs', age:16}.constructor // 返回函数 Object() { [native code] }
new Date().constructor // 返回函数 Date() { [native code] }
function () {}.constructor // 返回函数 Function(){ [native code] }
区分array date
function isArray(myArray) {
return myArray.constructor.toString().indexOf("Array") > -1;
}
isArray([1,2,1]) // 返回 true
function isDate(myDate) {
return myDate.constructor.toString().indexOf("Date") > -1;
}
isDate(new Date()) // 返回 true
4.万能的Object.prototype.toString.call()
toString()是Object原型对象上的方法,返回的是代表该对象的字符串。
调用Object.prototype.toString方法返回的格式是[object Xxxx],其中Xxxx就是对象的类型。
而对于其他对象(Array、String、Number、Boolean、RegExp、Date等),则需要通过call、apply来调用才能返回正确的类型信息。
拓展:
封装函数判断数据类型
function getStyle(data) {
let type = typeof(data)
if(type !=="object") {
return type
}
return Object.prototype.toString.call(data).replace(/^\[object (\S+)\]$/, "$1")
}
getStyle([])