-
Notifications
You must be signed in to change notification settings - Fork 30
Expand file tree
/
Copy pathdata-type.md
More file actions
280 lines (186 loc) · 9.64 KB
/
data-type.md
File metadata and controls
280 lines (186 loc) · 9.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
在 JavaScript 代码中,能够表示并操作值的类型称之为**数据类型**。
数据类型可分为可变类型和不可变类型。可变类型的值是可修改的,对象和数据就属于可变类型;不可变类型的值是不可修改的,数字、布尔值、null 和 undefined 都属于不可变类型。
字符串可以看成由字符组成的数组,可能被误认为是可变的。但在 JavaScript 中,字符串的值是不可变的。

## 原始类型原始类型,又称为原始值,是直接代表 JavaScript 语言实现的最底层的数据。
原始类型分别为 boolean 类型、number 类型和 string 类型三种。当然,有些资料将undefined 和 null 也归为原始类型(这里表示为特殊类型)。
声明变量并初始化值为原始类型,一般称之为字面量方式定义变量,也可以称之为直接量方式定义变量。## boolean 类型布尔(boolean)类型是指真或假、开或关、是或否。这个类型只有两个值:true 和 false。> **值得注意的是:**
>
> - 由于 JavaScript 是区分大小写的,布尔类型的 true 和 false 全部是小写。
> - JavaScript 也可以将其他类型的数据,自动转换为布尔类型。| 数据类型 | 转换为 true 的值 | 转换为 false 的值 |
| --- | --- | --- |
| boolean类型 | true | false |
| string类型 | 任何非空字符串 | “”(空字符串)|
| number类型 | 任何非零数字值(包括无穷大)| 0和NaN |
| object类型 | 任何对象 | null |
| undefined | | undefined |
## number 类型number 类型是指数字,JavaScript 不区分整数类型和浮点类型。- 整数类型: 包括负整数、0和正整数等。
- 浮点类型: 表示小数,JavaScript 中的所有数字均用浮点类型表示。
> **值得注意的是:** 八进制或十六进制的数值最终会被转换成十进制数值。## 浮点类型浮点类型,就是指该数值包含整数部分、小数点和小数部分。```javascript
var floatNum1 = 0.1;var floatNum2 = .1;// 有效,但不推荐
```
> **值得注意的是:**
>
> - JavaScript允许小数点前可以没有整数,但不推荐这种写法。
> - 保存浮点类型需要的空间是保存整数类型的两倍。
> - 如果小数点后面没有任何数字,那这个数值作为整数类型保存。```javascript
var floatNum3 = 1.;// 小数点后面没有数字 —— 解析为 1var floatNum4 = 10.0;// 整数 —— 解析为 10
```
### 四舍五入误差整数有无数个,但JavaScript通过浮点类型只能表示有限的个数(确切地说是 18 437 736 874 454 810 627个)。也就是说,当在JavaScript中使用浮点类型时,常常只是真实值的一个近似表示。如下述代码:
```javascript
var x = .3 - .2;var y = .2 - .1;x == y;// 值为false,表示两值不相等x == .1;// 值为false,.3-.2 不等于 .1y = .1;// 值为true,.2-.1 等于 .1
```
> **值得注意的是:** 建议使用大整数表示金额。例如使用分作为单位,而不是使用元作为单位。
### NaNNaN(Not a Number),即非数值,是一个特殊的数值。特点:
- 任何涉及NaN的操作都会返回NaN。- NaN与任何值都不相等,包括NaN本身。> **值得注意的是:** 针对上述特点,JavaScript提供了isNaN( )函数。该函数用于判断计算结果是否为数值。```javascript
console.log(isNaN(10));// 输出false(10是一个数值)console.log(isNaN("10"));// 输出false(可以被转换成数值 10)console.log(isNaN("blue"));// 输出true(不能转换成数值)console.log(isNaN(true));// 输出false(可以被转换成数值 1)
```
## string 类型string 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,被称之为字符串。字符串可以由双引号(")或单引号(')表示。```javascript
var firstString = "Nicholas";var secondString = 'Zakas';
```
string类型包含一些特殊的转义字符,用于表示非打印字符。| 转义字符 | 含义 |
| --- | --- |
| \n | 换行符 |
| \t | 制表符 |
| \b | 退格符 |
| \r | 回车符 |
| \f | 换页符 |
| \\ | 斜杠 |
| \' | 单引号('),在用单引号表示的字符串中使用。|
| \" | 双引号("),在用双引号表示的字符串中使用。|
## typeof 运算符由于 JavaScript 是弱类型/松散类型的,因此需要有一种手段来检测给定变量的数据类型。typeof 运算符就是负责提供这方面信息,如下述代码:
```javascript
var message = "this is message";console.log(typeof message);// 输出 stringconsole.log(typeof(message));// 输出 string
```
> **值得注意的是:** typeof 运算符加上圆括号,会像是函数,而不是运算符,并不建议这种写法。
| 值 | 类型 |
| --- | --- |
| true或false | boolean |
| 任意数字或NaN | number |
| 任意字符串 | string |
| null | object |
## 包装类型
### 包装类型概述
在 JavaScript 中,对应原始类型提供了包装类型。通过包装类型可以创建原始类型的对象(后面的课程学习)。
由于 JavaScript 是区分大小写的,从写法上来说,原始类型是全部小写,包装类型则是全部大写。
一般不建议使用包装类型定义对应的数据类型,但包装类型提供了操作相应值的方法。
> **值得注意的是:** 包装类型涉及到对象的概念,具体技术内容会在后面的课程学习。
### Boolean 类型Boolean 类型是原始类型 boolean 类型对应的包装类型。```javascript
var bool = new Boolean(true);
```
boolean 类型与 Bollean 类型的区别:
- typeof 运算符对原始类型返回 "boolean",而对包装类型为 "object"。
- instanceof 运算符测试 Boolean 类型返回 true,而测试 boolean 类型返回 false。
> **值得注意的是:** 不建议使用 Boolean 类型。### Number 类型
Number 类型是原始类型 number 类型对应的包装类型。```javascript
var num = new Number(10);
```
number 类型与 Number 类型的区别:
- typeof 运算符对原始类型返回 "number",而对包装类型为 "object"。
- instanceof 运算符测试 Number 类型返回 true,而测试 number 类型返回 false。
> **值得注意的是:** 不建议使用 Number 类型。
### String 类型String 类型是原始类型 string 类型对应的包装类型。```javascript
var str = new String("hello world");
```
string 类型与 String 类型的区别:
- typeof 运算符对原始类型返回 "string",而对包装类型为 "object"。
- instanceof 运算符测试 String 类型返回 true,而测试 string 类型返回 false。
> **值得注意的是:** 不建议使用 String 类型。
### instanceof 运算符
instanceof 运算符的左操作数是一个包装类型的变量,右操作数是对应的数据类型。如果左侧的变量是右侧的数据类型,则表达式返回 true;否则返回 false。例如下述代码:
```javascript
var str = "this is message";str instanceof String;// 计算结果为 true, str是String类型str instanceof Object;// 计算结果为 true, 所有包装类型都是Object的实例str instanceof Number;// 计算结果为 false
```
> **值得注意的是:** 所有对象都是 Object 类型的实例对象,通过 instanceof 运算符判断一个对象是否为具体数据类型,也包含"父类"。(后面课程会学习)
## 特殊类型
### undefined
JavaScript 中有两个表示空的数据类型,undefined 和 null,其中比较有用的是 undefined。undefined 类型只有一个值,就是 undefined。
下列情况会返回undefined:
- 访问未修改的变量 undefined
- 没有定义 return 表达式的函数隐式返回 undefined
- return 表达式没有显式的返回任何内容
- 访问不存在的属性
- 任何被设置为 undefined 值的变量
### null
null 类型是 JavaScript 中的一个特殊类型,用于表示一个不再指向任何内存空间地址的变量。null 值多用于释放 JavaScript 中的资源(变量、数组和函数等)。> **值得注意的是:** 使用 typeof 运算符计算 null 的话,返回的是 object。```javascript
var atguigu = null;console.log(atguigu);// 输出 null
```
### undefined 与 null- 共同点: 都是原始类型,保存在栈中。
- 不同点
- undefined: 表示变量声明但未被赋值,是所有未赋值变量的默认值。一般很少主动使用。
- null: 表示一个没有指向任何内存地址的变量,将来可能指向某个具体内存地址。一般用于主动释放资源。
## 类型转换
### 隐式类型转换
由于 JavaScript 是弱类型/松散类型的,在任何情况下都可以强制转换。
- 转换为字符串: 将一个值加上空字符串可以轻松转换为字符串类型。
```javascript
'' + 10 === '10'; // true
```
- 转换为数字: 使用一元的加号操作符,可以把字符串转换为数字。
```javascript
+'10' === 10; // true
```
- 转换为布尔值: 使用否操作符两次,可以把一个值转换为布尔型。
```javascript
!!'foo'; // true
```
### 显式类型转换
- 使用 JavaScript 的包装类型的构造函数进行类型转换。
| 构造函数 | 描述 |
| --- | --- |
| Number() | 将字符串或布尔值转换为数字,如果包含非法字符,则返回NaN。|
| String() | 将数字或布尔值转换为字符串。|
| Boolean() | 将字符串或数字转换为布尔值。|
- 使用数据类型的转换函数进行类型转换。
| 构造函数 | 描述 |
| --- | --- |
| toString() | 将数字或布尔值转换为字符串。|
| parseInt() | 将字符串或布尔值转换为整数类型。|
| parseFloat() | 将字符串或布尔值转换为浮点类型。|