JavaScript的优点之一是,无需知道这种语言的很多细节,就可以使用它来做很多事情。但要真正掌握这门语言、提升水平,必须对类型了如指掌。
JavaScript的类型系统并不特别缜密,我们会发现它有一些怪癖。把这些怪癖弄清才能避免各种与类型相关的难堪错误。
类型
JavaScript中,类型分为两种:基本类型和对象
- 基本类型:数字
number
、字符串string
、布尔值boolean
、null
和undefined
- 特殊的类型:对象
object
类型(用于表示问题空间中的事物)
不属于基本类型的值都是对象
如“数组Array
”,其本质上就是对象(即object
),有push
等方法
在一些情况下,基本类型也如同对象被暂时转换为对象进行处理:
使用基本类型string
的属性或方法时(如split
、substring
、contact
等),JavaScript将把它暂时转换为对象,使用指定的属性或方法,再将其转换为基本类型字符串。这个过程是自动进行的,程序员无需关注。ps.
number
、boolean
类型(有toString
等方法)也有类似的转化;
用typeof
运算符查看其操作数的类型
var test1 = "abcdef"; console.log(typeof test1);//string
var test2 = 123; console.log(typeof test2);//number
var test3 = true; console.log(typeof test3);//boolean
var test4 = {}; console.log(typeof test4);//object
var test5 = []; console.log(typeof test5);//object
var test6 = ""; console.log(typeof test6);//string
var test7 = ''; console.log(typeof test7);//string
var test8; console.log(typeof test8);//undefined
function test9(){
return "abcdef"
}; console.log(typeof test9);//function
var test10 = null; console.log(typeof test10);//object
console.log(typeof undefined);//undefined
console.log(typeof NaN);//number
特别注意:
- 数组
Arrary
的类型----object
null
的类型-------------object
这符合上面的结论[不属于基本类型的值都是对象]
特别的,
NaN
的类型--------------number
undefined
的类型------undefined
JavaScript的假值
JavaScript中总共有5个假值:undefined、null、0、" "(空字符串)和false;
其他值都是真值。
undefined——未初始化/未定义
undefined
意味着变量未初始化(即:未赋值)或未定义(即:不存在)
访问未赋值的变量var
、不存在的属性或数组元素,都将得到undefined
理解:
undefined
是一个值,它赋给任何未定义的、未初始化的东西,从而让我们能够判断一个变量、属性或数组元素是否赋值了
既然undefined
是一个值,那么它也有类型,但其类型既不是对象/数字/字符串/布尔值,也不是任何明确的东西,因此将它的类型也视为[未定义](undefined
)的
这是JavaScript的怪异的灰色地带之一,你不得不接受
避免在计算中使用未初始化的值
使用一个变量(基本类型的变量、属性或数组元素)时,先检查是否为undefined
null——“对象不存在”
变量未初始化、对象未指定属性或数组未指定元素时,将返回undefined
本来应该提供一个对象,但无法创建或找到这样一个对象,将提供null
为何不使用undefined来表达这种意思呢?
这并不完美,而且显得有些多余,但现实情况就是如此。
例如
document.getElementById()
本来要求它返回一个对象,可是如果当前无法返回一个对象,就返回null
var killerObjectSomeday = null;
你还可直接将变量设置为nul,这是什么意思呢?意思是说我本来要将一个对象赋给这个变量,但现在没有这样的对象
null
的类型为object
。这合情合理,因为null用于表示不存在的对象。
不过这存在很大的争议,在最新的规范中,
null
的类型为null
。
浏览器的JavaScript实现没有遵守这种规范,但很少需要在代码中确定null
的类型
NaN——“不是数字的数字”
NaN
——“Not A Number”,即:不是一个数字
更准确地说,NaN
指无法表示的数字,NaN
的类型为number
例如
0/0
,在计算机中无法表示其结果,就用NaN
表示它
类似的例子还有Math.sqrt(-9)
、"food"*1000
等,它们都是NaN
因此,可以认为,NaN
本应是一个数字,只是(计算机)无法表示而已
这也是JavaScript的灰色地带之一
NaN
与其他数值比较,结果为不相等NaN
与NaN
比较,结果为不相等
(理解:NaN
是无法表示的数字,但并非所有无法表示的数字都相同,如Math.sqrt(-1)
和Math.sqrt(-2)
)
i.e. NaN
与任何值(包括NaN
)比较,结果都是不相等
var num;
if(num == NaN) 这个式子的结果永远为false!!!
...
- 要确认一个值是否为
NaN
,应使用函数isNaN
ps. 传递一个不能转化为数字的字符串,如isNaN(“100food”)、isNaN(“0/0”)等,isNaN
返回true
Infinity——过大的数
在JavaScript中,
Infinity
指的是任何超过浮点数上限1.7976931348623157E+10308
-Infinity
指超过浮点数下限-1.7976931348623157E+10308
的值
Infinity
的类型为number
,怀疑某个值太大时,可检查它是否为Infinity:
if (num==Infinity) {
alert("That's a big number!");
}