JS第3章——类型、值和变量
一、数字
和其他编程语言不同的是,JavaScript不区分整数值和浮点数值。JavaScript中的所有数字均用浮点数值来表示。
当一个数字直接出现在JavaScript程序中,我们称之为“数字直接量”。
JavaScript中的数字直接量分为“整型直接量”和“浮点型直接量”。
1、整型直接量
在JavaScript中,用一个数字序列表示一个十进制整数。
除了十进制的整型直接量,JavaScript同样能识别十六进制(以16为基数)值,以0x或0X为前缀。
ES6的严格模式明令禁止不许使用八进制直接量。
2、浮点型直接量
eg:var i=1.2;
3、NaN
NaN是JavaScript中很特殊的一个值,意为“不是一个数字”。
它和任何值都不相等,包括和它自己。具体的表现如下:
也就是说,没有办法通过x==NaN来判断变量x是否为NaN。怎么办?
使用函数isNaN()来判断。如果参数是NaN或者是一个非数字值,则返回true。如下图:
如何理解:isNaN("hello")?
"hello"不是一个数字吗?是的(true),"hello"不是数字而是字符串。
二、文本
字符串(string)是一组由16位值组成的不可变的有序数列,每个字符通常来自于Unicode集。
JavaScript中通过字符串类型来表示文本。
字符串的长度是其所含16位值的个数。
1、字符串直接量
在JavaScript中的字符串直接量,是由单引号or双引号括起来的字符序列。
以前,字符串直接量必须写在一行中。
在ES5中,字符串直接量可以拆分成数行,单每行必须以反斜线(\)结束。
2、转义字符
常用的转义字符有:
\n 换行符
\r 回车符
\" 双引号
\' 单引号
3、字符串的使用
4、模式匹配
三、布尔值
JavaScript中只有6个值会被转换为false。分别是:
- undefined
- null
- 0
- -0
- NaN
- ""
其他的值,包括对象or数组都会转换成true。
四、null和undefined
大多数计算机语言,有且仅有一个表示“无”的值。比如C语言中的null,Java语言中的null。
有点奇怪的是,JavaScript语言居然有两个表示"无"的值:undefined和null。
1、历史原因
JavaScript在1995年诞生之际,和Java一样,只设置了null作为表示“无”的值。
根据C语言的传统,null被设计成可以自动转化为0
但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。
首先,null像在Java中一样被当成一个对象。但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示"无"的值最好不是对象。
其次,JavaScript的最初版本没有错误处理机制,发生数据类型不匹配时,往往是自动转换类型or默默地失败。Brendan Eich认为,如果null自动转为0,很不容易发现错误。
因此,Brendan Eich又设计了一个undefined。
2、最初设计
JavaScript的最初版本是这样区分的:
null是一个表示“无”的对象,转为数值时为0。
undefined时一个表示"无"的原始值,转为数值为NaN。
3、目前的用法
但是,上面这样的区分,在实践中很快就被证明不可行。目前,null和undefined基本是同义的,只是有一些细微的差别。
null表示“没有对象”,即该处不应该有值。典型用法是:
(1)作为函数的参数,表示该函数的参数不是对象。
(2)作为对象原型链的终点。
undefined表示“缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了但还没有赋值时,就等于undefined
(2)调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
五、全局对象
六、包装对象
七、不可变的原始值和可变的对象引用
JavaScript中的原始值与对象有着根本区别。原始值是不可更改的,而对象的属性or方法是可以被修改的。
原始值:undefined、null、布尔值、数字和字符串
对象:数组、函数
对象和原始值不同。
首先,它们是可变的——它们的值时可以修改的。
其次,对象的比较并非是值的比较。即使两个对象包含同样的属性和相同的值,它们也是不相等的。因为对象的比较比较的是存储空间的地址。
也就是说,两个单独的对象永远不相等!两个单独的数组也永远不相等!