JavaScript第一讲 类型
数据类型
数据类型有两类:原始类型
(primitive type)和对象类型
(object type)。
其中原始类型包括:
- 数字
- 字符串
- 布尔值
- null
- undefined
其中对象类型就是对象:名/值对(key/value),名和值可以是原始值。
如:数字和字符串。如果想要key为布尔值、null或undefined的话,最后都会以字符串的形式给出。
如:
{"null":"hello world!"}
此外,还可以分为可变
类型和不可变
类型。
其中可变的类型有:对象和数组
不可变的类型有:数字、字符串、布尔值、null和undefiend。
你可能会奇怪,字符串为什么不可变?请看下面例子
let str = "123456";
console.log(str);//123456
str[1] = "3";
console.log(str);//123456
可以访问,但是无法修改。原因会在后面讲到。
数字
在JavaScript中,用一个数字表示整数如:0 1 2
十六进制直接以“0X”或“0x”为前缀来表示,如:oxfa 0Xaa
八进制是以“0”开头的数字,如:012
小数可以表示为:1.1,.22,1.1e3(1100),1.1E3(1100),1.1e-3(0.011)
值得注意的是:
-
JavaScript预定义了全局变量
Infinity
和NaN
(not a number),用来表示正无穷大和非数字值。 -
当运算结果超过JavaScript所能表示的正数或负数的上限后,会以
Infinity
或-Infinity
表示,并不会报错。 -
当运算结果无限接近于零,并比JavaScript所能表示的最小值还小的时候,会返回0。
-
被零整除也会返回
Infinity
或-Infinity
,但是当零除以零的时候是没有意义的会返回NaN
。
0.3-0.2 不是 0.1,这是浮点数的局限性。
字符串
这部分主要介绍之前的问题,为什么字符串不可变。理由如下:
内存管理:
- 字符串在内存中是被分配为一段固定长度的连续内存区域。如果允许修改字符串的内容,那么每次修改可能都需要重新分配内存和调整长度,这会导致复杂的内存管理问题和性能开销。
- 通过将字符串设为不可变,JavaScript 避免了这些复杂的内存操作。每次操作字符串时,如果需要“修改”它,JavaScript 会创建一个新的字符串对象,而不是在原有字符串上进行修改。
不可变对象的特性:
- 不可变对象的一个重要特性是线程安全和稳定性。当多个操作同时作用于同一个字符串时,不会有任何冲突或意外的变化,因为字符串不会在内存中被改变。
- 这种不可变性使得字符串可以被安全地缓存和共享,大大减少了潜在的错误和意外行为。
设计简化:
- 通过将字符串设计为不可变,语言的设计者简化了字符串操作的实现和使用。开发者可以更容易地推断代码的行为,因为字符串的内容一旦设置,就不会在后续代码中被意外修改。
布尔值
对于布尔值,我们需要知道的是有八种为false的情况,有""、±0、undefined、null、NaN、false和0n(ES11引入)。
对于x!=x,仅当x为NaN的时候成立。
null和undefined
null
null为空值,但是对于
typeof null;//为object
它是一个特殊的对象,即“非对象”,也可以理解为数组、字符串和对象是“无值”的。
undefined
对于它,如其含义所示,表示“未定义”。
typeof undefined//undefined
表示它是这个类型的唯一成员。
联系
null == undefined//true 会有强制类型转换
null === undefined//false
如果想要赋值给变量,或者作为参数,最好的还是选择null。可以理解为null是意料之中的“空”,undefined为出乎意料的“空”。