JavaScript是一门简单易用的语言,应用广泛,同时它的语言机制又十分复杂和微妙,即使经验丰富的开发人员也需要用心学习才能真正掌握。
《你不知道的JavaScript》中是这样定义类型的:
类型是值的内部特征,它定义了值的行为,以使其区别于其他值。
这样的定义可能略简单了一些,不够已经足够让我们去理解类型的含义。
不得不提的强制类型转换
在JavaScript中,强制类型转换无处不在,在我们的程序中,有意无意地,都经常地利用到强制类型转换。它给我们带来了许多便利,同时也容易造成某一些坑。当然了,之所以造成坑,也主要就是因为对类型的了解不够。所以,我们十分有必要学习一些关于类型的细节。
内置类型
JavaScript有7种内置类型,分别是:
- 空值,null
- 未定义,undefined
- 布尔值,boolean
- 数字,number
- 字符串,string
- 对象,object
- 符号,symbol(ES6中新增的)
这其中,除了对象以外的统称为基本类型。
typeof null === "object"
出乎意料的,这条语句是true,即用typeof去判断null的类型,得到的是object,这是一个由来已久的bug。修复它可能会导致许多现存系统的崩溃,所以这个bug也许会一直存在。
值和类型
首先JavaScript不同于C++等的编程语言,JavaScript中的变量是无类型的,一个变量可以持有任何类型的值。对一个变量使用typeof操作,返回的也是变量持有的值的类型。
undefined
关于undefined,是挺纠结的...
考虑以下三种情况:- 声明一个变量却不赋值的话,typeof操作返回的值是undefined。
- 如果去typeof一个未声明的变量,不会报错,返回的同样是undefined。
- 使用一个未声明的变量a,会报错a is not defined.
值得注意的是,undefined和not defined看上去很相似,其实是不同的,其实not defined用undeclared来表示会减少许多误解。
不过,上述情况中的第二条的原理,也被称作typeof的安全防范机制,有时候也被用来检查未声明的变量。因为这样不会报错,某些情况下很有用。