变量类型
- JS包含六种基本类型 boolean、number、string、symbol、undefined、null
- 三种引用类型 对象、数组、函数
通过typeof识别类型
对以上九种类型的识别为
boolean、number、string、symbol、undefined、object、object、function
所以typeof只能运算符用于判断对象的类型,但是对于一些创建的对象,它们都会返回'object',有时我们需要判断该实例是否为某个对象的实例,那么这个时候需要用到instanceof运算符
instanceof
判断一个对象与构造函数是否在一个原型链上
const Person = function(){}
const p1 = new Person()
p1 instanceof Person // true
var str = 'hello word'
str instanceof String // false
var str2 = new String('hello word')
str2 instanceof String // true
instanceof 方法要求开发者明确地确认对象为某特定类型,所以也有它的局限性
通过typeof + Object.prototype.toString判断
如果是原始类型,他会将原始类型包装为引用类型,然后调用对应方法
/**
* 类型判断
*/
function getType(val){
// 先处理null
if(val === null){
return 'null'
}
// 判断是不是基础类型
const typeOfT = typeof val
if(typeOfT !== 'object'){
return typeOfT
}
// 处理引用类型
const tmp = {
'[object object]' : 'object',
'[object Array]' : 'array',
// 包装类型
'[object String]' : 'object - string',
'[object Number]' : 'object - number',
'[object Boolean]' : 'object - boolean'
}
const typeStr = Object.prototype.toString().call(val)
return tmp[typeStr]
}
变量的转换
变量在计算及运行过程中,会进行隐式的类型转换
转boolean
以下都为假值,其他所有值都转为true,包括所有对象(空对象,空数组)
false、undefiend、null、' '、NaN、0、-0
对象转基本类型
对象在转基本类型时,会调用'valueOf',需要转成字符类型时调用'toString'
var a = {
valueOf() {
return 0;
},
toString() {
return '1';
}
}
1 + a // 1
'1'.concat(a) //"11"
需要对类型转换更深入了解的可参考下面两篇文章