JavaScript中的类型
JavaScript中变量是没有类型的,只有值才有,变量可以随时持有任何类型的值
JavaScript中的类型包括了6个基本类型(ES6中新增了一个symbol),和一个复杂类型(object)
- 空值(null)
- 未定义(undefined)
- 布尔值(boolean)
- 数字(number)
- 字符串(string)
- 对象(object)
- 符号(symbol,ES6新增)
我们可以用typeof运算符来查看值的类型,他返回的是一个字符串值
typeof undefined === "undefined"
typeof true === "boolean"
typeof 42 === "number"
typeof "42" === "string"
typeof {life: 42} === "object"
typeof Symbol() === "symbol"
以上六种类型均有同名的字符串与之对应
除了null
typeof null === "object"
这是因为一个由来已久的bug
JavaScript把二进制前三位为0的值判断为对象
而null的二进制全为零
于是被误判为了对象
因此我们需要用复合条件来检测null值的类型(既是假值,typeof返回的又是对象的基本类型)
var a = null;
(!a && typeof a === "object"); //true
还有一种情况
typeof function(){} === "function"
typeof [1, 2, 3] === "object"
似乎function也是一种类型
但是function事实上和数组一样也是object的一个子类型
function有一个内部属性[[call]]
该属性使其可以被调用
还有一个属性length,表示声明的参数的个数
数组的length则表示数组的长度
function a(b, c) {}
a.length; //2
被误解的undefined
似乎undefined代表这变量未声明
但事实上undefined代表的是变量已声明但是未持有值
var a;
a; //undefined
b; //ReferenceError: b is not defined
而我们用typeof输出却会发现
typeof a; //undefined
typeof b; //undefined
这是因为typeof有一个特殊的安全机制
安全机制
上面我们说到typeof有一个不报错的检查一个未声明的变量的安全机制
事实上这个安全机制可以帮我们很多忙
if(a) {} //如果a未定义,会抛出一个错误
if(typeof a !== "undefined") {} //这样则是安全的
另外一种方法是通过对象的属性来进行检查
比如检查一个全局变量的时候
if(window.a) {
/*..*/
}