1 数据类型转换
1.1 转换规则
① 其他类型转为 number 类型
string -> number
① 纯数字(也包括十六进制和科学计数法)可转为一个有效的number数字
② 空字符串转为 0
③ 其他形式的字符串转为NaN
注:字符串转换时会去掉两边的空格。
boolean -> number:
true 转为 1,false 转为 0
null -> number:
转为0
undefined -> number:
转为NaN
② 其他类型转为 string 类型
数据长啥样就转成啥样
③ 其他类型转为 boolean 类型
number -> boolean:
NaN 和 0 转为 false,其他都转为 true
string -> boolean:
空字符串转为 false,其他都转为 true(不会去掉空格,空格也转为true)
null、undefined -> boolean:
转为 false
1.2 强制类型转换(显式转换)
① 其他类型转为 number 类型
Number() 标准,自动转换的规则与之一致
parseInt() 提取字符串中的整型(直接舍去小数部分,可利用此特性取整)
parseFloat() 提取字符串中的浮点数
注:
- 纯数字(含十六进制,不含科学计数法)字符串、以数字开头的字符串可有效提取并转为number,其他字符串都转为NaN。
- 如果要转换的数据类型不是字符串,统统转为 NaN。
② 其他类型转为 string 类型
String()
③ 其他类型转为 boolean 类型
Boolean()
1.3 自动类型转换(隐式转换)
数据参与运算的时候,不符合该运算对数据类型的要求,数据会自动进行类型转换。
运算对数据类型的要求是由运算符决定
自动类型转换的规则与强制类型转换是一致的
1.4 NaN的特点:
- NaN 与任何数据进行任何运算,结果仍然是 NaN。
- NaN 与任何数据都不相等,包括自己。
1.5 isNaN() 的特点:
- isNaN() 用于判断一个数据是否是 NaN,是 NaN 返回
true
,否则返回false
。 - isNaN 也可以判断 number 类型以外的数据,如果该数据能够转为
NaN
,返回结果也是true
2 运算符
2.1 运算符和表达式
① 运算符
- 按需要的操作数个数分类:一目运算符、二目运算符、三目运算符
- 按运算符功能分类:算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、其他运算符
② 表达式
- 由运算符与数据组成的式子,称之为表达式; 表达式有一个计算结果,称为表达式的值。
- 最简单的表达式叫“原始表达式”,一个变量、一个直接量。
- 多个简单的表达式可以组成一个复杂的表达式。
- 有些表达式具有副作用,副作用指的是会改变参与运算的变量; 副作用由运算符决定。
2.2 运算符按功能分类
① 算数运算符
运算符 | 含义 | 操作数个数 | 操作数类型要求 | 组成表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
+ | 加号 | 2 | number | number | 无 |
- | 减号 | 2 | number | number | 无 |
* | 乘号 | 2 | number | number | 无 |
/ | 除号 | 2 | number | number | 无 |
% | 取余(模) | 2 | number | number | 无 |
+ | 正号 | 1 | number | number | 无 |
- | 负号 | 1 | number | number | 无 |
++ | 累加(符号不变) | 1 | number(变量形式) | number | 有 |
-- | 累减(符号取反) | 1 | number(变量形式) | number | 有 |
注:
根据数据类型自动转换的原理,可利用
+
正号来进行数据类型转换,把其他数据类型转为 number,作用类似Number()
函数。在实践中,可用于转换用户输入的字符串数据。-
++
和--
在操作数前或后,对操作数的累加或累减效果是一样的,不同的是表达式的值:n++/n--
:表达式的值为n累加或累减前的值;++n/--n
:表达式的值为n累加或累减后的值;
② 关系运算符
运算符 | 含义 | 操作数个数 | 操作数类型要求 | 组成表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
> | 大于 | 2 | number、string | boolean | 无 |
>= | 大于等于 | 2 | number、string | boolean | 无 |
< | 小于 | 2 | number、string | boolean | 无 |
<= | 小于等于 | 2 | number、string | boolean | 无 |
== | 等于 | 2 | number、string | boolean | 无 |
!= | 不等于 | 2 | number、string | boolean | 无 |
=== | 全等 | 2 | 没要求 | boolean | 无 |
!== | 不全等 | 2 | 没要求 | boolean | 无 |
注:
-
比较大小的规则如下:
- 如果两个操作数类型不一致,转为 number 之后才进行比较。
- NaN 与任何数据进行任何比较得到都是 false。
- 如果两个操作数都是字符串,会按照字符串的比较规则进行比较:取每个字符的unicode 编码按位比较大小。
-
判断相等(==) 和不相等(!==)的规则:
如果两个操作数类型不一致,转为 number 之后才进行比较。
NaN 与任何数据都不相等,包括自己。
如果两个操作数都是字符串,会使用字符串的比较规则进行比较:两个字符串完全一致就相等。
-
null 与其他类型的数据进行判断相等操作,具有自己的特殊规则:
null == ''; //空字符串,false null == false; //false null == 0; //false null == undefined; //true
-
判断全等(===)和不全等(!==)的规则:
- 如果两个操作数类型不一致,全等不成立,类型一致且值相同才成立。
- 与相等相比,不会发生数据类型的自动转换。
③ 逻辑运算符
运算符 | 含义 | 操作数个数 | 操作数类型要求 | 组成表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
&& | 逻辑与 | 2 | 没要求 | 取其中一个操作数的值 | 无 |
|| | 逻辑或 | 2 | 没要求 | 取其中一个操作数的值 | 无 |
! | 逻辑非 | 2 | boolean(不是则自动转换) | boolean | 无 |
注:
-
&& 组成的表达式的取值规则如下:
若第一个操作数成立,则取第二个操作数的值;
若第一个操作数不成立,则取第一个操作数的值,第二个操作数不再继续运算。
-
|| 组成的表达式的取值规则如下:
若第一个操作数成立,则取第一个操作数的值,第二个操作数不再继续运算。
若第一个操作数不成立,则取第二个操作数的值。
④ 赋值运算符
运算符 | 含义 | 操作数个数 | 操作数类型要求 | 组成表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
== | 赋值 | 2 | 无 | 变量赋值之后的值作为表达式的值,因此类型同赋值后的变量 | 有 |
+= | 求和赋值 | 2 | number | number | 有 |
-= | 求差赋值 | 2 | number | number | 有 |
*= | 求积赋值 | 2 | number | number | 有 |
/= | 求商赋值 | 2 | number | number | 有 |
%= | 求余赋值 | 2 | number | number | 有 |
+= | 字符串连接赋值 | 2 | string | string | 有 |
注意:操作数必须是变量的形式。
⑤ 位运算符
运算符 | 含义 | 操作数个数 | 组成表达式的值的类型 | 有无副作用 |
---|---|---|---|---|
& | 按位与 | 2 | integer | 无 |
| | 按位或 | 2 | integer | 无 |
^ | 按位异或 | 2 | integer | 无 |
⑥ 其他运算符
运算符 | 含义 | 操作数个数 | 操作数类型要求 | 组成表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
+ | 字符串连接符 | 2 | string | string | 无 |
typeof | 数据类型判断 | 1 | 无 | string | 无 |
, | 逗号运算符 | 2 | 无 | 无 | |
?: | 比较运算符(JS中唯一一个三目运算符 | 3 | 无 | 第一个操作数成立,则为第二个操作数值的类型,否则为第三个操作数值的类型 | 无 |
+号的总结:
- 如果只有一个操作数,则
+
号为正号;- 如果有两个操作数,至少有一个为字符串,则
+
号为字符串连接符;- 如果有两个操作数,且都不是字符串,+`号为相加;
2.3 运算符优先级
- 一元运算符:++、--、+、-、!、typeof等等
- 算数运算符:*、/、% 大于 +、-
- 关系运算符
- 逻辑运算符
- 三元运算符:?:
- 赋值运算符
- 逗号运算符