Day02 笔记
1 数据类型转换
1.1 数据类型转换的规则
① 其他类型转为 number 类型
1、string 转为 number 类型的规则:
① 纯数字字符串会转为对应的数字,十六进制表示以及科学计数法表示的数字都是纯数字。
② 空字符串转为数字 0 。
③ 其他字符串转为 NaN 。
注: string 类型数据转为 number 类型数据的时候会自动去掉两端的空格,剩下部分按照以上规则转换。
2、boolean 转为 number 类型的规则:
true -> 1
false -> 0
3、null 转为 number 类型的规则:
null -> 0
4、undefined 转为 number 类型的规则:
undefined -> NaN
② 其他类型转为 string 类型
数据什么样就转为什么样的字符串
③ 其他类型转为 boolean 类型
1、number 转为 boolean 类型的规则:
0 和 NaN 转为 false ,其他数字转为 true 。
2、string 转为 Boolean 类型的规则:
空字符串转为 false,其他字符串转为true 。
3、null 转为 Boolean 类型的规则:
null -> false
4、undefined 转为 Boolean 类型规则:
undefined -> false
注意:
0、NaN、空字符串、null、undefined 转为布尔值会转为 false ,
其他数据转为布尔值都是 true。
1.2 强制类型转换(显式转换)
① 强制把其他类型转换为number 类型的函数
Number()
parseInt()
parseFloat()
parseInt()、parseFloat() 和 Number() 的区别:
1、parseInt() 和 parseFloat() 用于提取字符串的数字,所有非字符串类型得到的都是 NaN 。
2、纯数字字符串转为对应的数字; 以数字开头的字符串转为开头的数字;
其他字符串都是NaN (空字符串也是NaN )
注意:
1、Number() 的转换规则 是标准的转换规则。
2、可以使用 parseInt() 来对某个数字进行取整(会把小数部分舍去)
② 强制把其他类型转换为 string 类型的函数
String()
③ 强制把其他类型转换为Boolean 类型的函数
Boolean()
1.3 自动类型转换(隐式转换)
1、JavaScript 作为弱类型编程语言,支持数据类型自动转换。
2、数据参与运算,数据不符合运算所要求的类型,数据会根据运算要求的类型自动运算。
3、运算所要求的的数据类型由运算符决定。
4、自动类型转换的规则与强制类型(Number、String、Boolean)转换的规则是一样的。
2 运算符
2.1 运算符和表达式
① 运算符
运算符就是参与运算的符号,像+
、-
、*
、/
等。
与运算符一起运算的变量、直接量、表达式称之为操作数。
② 表达式
1、表达式是变量或者直接量与运算符组成的式子,表达式会有一个计算结果,称之为表达式的值,即表达式是有值的。
2、最简单的表达式是“原始表达式”,如 直接量、变量名、关键字等。
3、复杂表达式由简单表达式组成,运算符可以将简单表达式组合成复杂表达式。
4、注意带有副作用的表达式,这样的表达式除了有表达式的计算结果之外,还会对表达式中的变量产生影响。
2.2 运算符的分类
① 按照运算符的需要的操作的个数
一元运算符 / (一目运算符)
二元运算符 / (二目运算符)
三元运算符 / (三目运算符)
② 按照运算符的功能
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
其他运算符
2.3 运算符(按照功能)
① 算术运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有/无副作用 |
---|---|---|---|---|---|
+ | 加号 | 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 类型,利用运算符自动类型转换。
累加运算符:
累加和累减都是一元运算符,操作数必须以变量的形式表示,具有副作用。
累加和累减的符号可以在操作数前面也可以在操作数后面,对操作数产生的副作用是一样的,但是所组成的表达式的值不同。
运算符在操作数前面:表达式取操作数累加或累减之后的值作为表达式的值。
**运算符在操作数后面:**表达式取操作数累加或累减之前的值作为表达式的值。
② 关系运算符(比较运算符)
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有/无副作用 |
---|---|---|---|---|---|
> | 大于 | 2 | number、string | boolean | 无 |
<= | 大于等于 | 2 | number、string | boolean | 无 |
< | 小于 | 2 | number、string | boolean | 无 |
<= | 小于等于 | 2 | number、string | boolean | 无 |
== | 等于 | 2 | number、其他类型 | boolean | 无 |
!= | 不等于 | 2 | number、其他类型 | boolean | 无 |
=== | 全等 | 2 | 所有类型 | boolean | 无 |
!== | 不全等 | 2 | 所有类型 | boolean | 无 |
两个操作数比较大下的规则:
1、如果两个操作数的类型不一样,各自自动转换为 number 类型进行比较。
2、如果两个操作数都是 string 类型,按照string类型比较大小的规则进行比较。
string 类型的数据比较大小的规则:
1、比较的是字符对应的 unicode 编码,unicode 编码是数字,可以比较大小。
2、字符串比较是按一位一位的比较,如果一个操作数第一位的字符比另一个操作第一位字符的unicode 编码大, 该操作整体都大。
相等和不相等的判断规则:
1、如果两个操作数类型不一致,自动转为 number 之后进行比较。
2、如果两个操作数类型一致,直接看是不是一样的。
全等和不全等的判断规则:
1、如果两个操作数类型不一致,直接返回false,不会进行自动类型转换的。
2、如果两个操作数类型一致,比较是否一样。
null 进行相等(==)判断的时候,非常特殊:
console.log(null == null); // true console.log(null == 0); // false console.log(null == false); // false console.log(null == ''); // false console.log(null == undefined); // true
③ 逻辑运算符
运算符 | 含义 | 操作数的个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有/无副作用 |
---|---|---|---|---|---|
&& | 逻辑与 | 2 | 任何类型 | 取其中一个操作数作为表达式的值 | 无 |
|| | 逻辑或 | 2 | 任何类型 | 取其中一个操作数作为表达式的值 | 无 |
! | 逻辑非 | 1 | boolean | boolean | 无 |
逻辑与组成的表达式的值的计算规则:
1、如果第一个操作数不成立,取第一个操作数作为表达式的值。
2、如果第一个操作数成立,取第二个操作数作为表达式的值。
逻辑或组成的表达式的值的计算规则:
1、如果第一个操作数不成立, 取第二个操作数作为表达式的值。
2、如果第一个操作数成立,取第一个操作数作为表达式的值。
④ 赋值运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有/无副作用 |
---|---|---|---|---|---|
= | 赋值 | 2 | 无要求。左边的操作数必须是变量 | 变量(左边操作数)的值作为表达式的值 | 有 |
+= | 赋值求和 | 2 | 无要求。左边的操作数必须是变量 | 变量(左边操作数)的值作为表达式的值 | 有 |
-= | 赋值求差 | 2 | 无要求。左边的操作数必须是变量 | 变量(左边操作数)的值作为表达式的值 | 有 |
*= | 赋值求积 | 2 | 无要求。左边的操作数必须是变量 | 变量(左边操作数)的值作为表达式的值 | 有 |
/= | 赋值求商 | 2 | 无要求。左边的操作数必须是变量 | 变量(左边操作数)的值作为表达式的值 | 有 |
%= | 赋值求余 | 2 | 无要求。左边的操作数必须是变量 | 变量(左边操作数)的值作为表达式的值 | 有 |
+= | 赋值连接 | 2 | string, 左边的操作数必须是变量。 | 变量(左边操作数)的值作为表达式的值 | 有 |
总结:
1、赋值运算符要求左边的操作数必须是变量,右边的操作数变量、直接量、表达式都可以。
2、赋值运算符都有副作用,使用的就是赋值运算符的副作用,左边操作数会被修改。
3、赋值运算符组成的表达式以左边操作数位置(修改过后的)。
⑤ 其他运算符
运算符 | 含义 | 操作数个数 | 操作数的类型 | 组成的表达式的值的类型 | 有/无副作用 |
---|---|---|---|---|---|
typeof | 判断数据的类型 | 1 | 任意类型 | string | 无 |
, | 逗号 | 2 | 无 | ||
+ | 字符串连接符 | 2 | string | string | 无 |
?: | 比较运算符 | 3 | 任意类型 | 取第二个操作数或者第三个操作数作为表达式的值 | 无 |
+ 符合具有3个含义:
- 如果操作数只有一个,+ 表示正号运算符。
- 如果操作数两个,且没有任何一个操作数是字符串,+ 表示加号。
- 如果操作数两个,只要有一个操作数是字符串,+ 表示字符串连接符。
?:三元运算符组成的表示的值的规则:
- 如果第一个操作数成立,取第二个操作数作为表达式的值。
- 如果第一个操作数不成立,取第三个操作数作为表达式的值。
2.4 运算符优先级
1、 一元运算符: ++ -- ! typeof
2、 乘除取余、加减
3、 关系运算符
4、 逻辑运算符
5、 赋值运算符 (&& 优先级 > || 优先级)
6、 ?:
注意: 使用 () 可以提高优先级。
扩展 (ASCII)
a的ASCII码数值是97,A的ASCII码数值是65。
ASCII码值中,大小写字母码的关系是对应的大写字母与小写字母之间相差32,大写字母码<小写字母码。