数据类型转换-运算符
1 回顾
1.1 JavaScript 基本语法
1. JS 在 HTML 中的使用方式
行内式
内嵌式
外链式
2. JS 中的注释
//
/**/
3. JS 严格区分大小写
4. JS 语句结束符: 分号或者是换行
1.2 变量
1. 数据、直接量、变量
数据:计算机计算的就是数据,所有的信息通过数据来表示
直接量:直接使用数据就是直接量
变量:给数据取个名字,通过名字使用数据
2. 变量的意义
方便多次重复使用某个数据
变量可以把数据存储下来,保证下次使用的还是之前的数据
3. 变量的语法
创建新的变量使用var
可以只创建变量不赋值,也可以同时创建变量并赋值
变量的值可以修改
同时声明多个变量
4. 变量名的命名规范
1.3 数据类型
1. 分类:
原始类型: number string boolean null undefined
对象类型:
2. number 数值类型
2.1 整型 十进制表示、八进制表示、十六进制表示
2.2 浮点型 科学计数法 浮点型的计算存在精度问题
2.3 NaN isNaN()
2.4 数值的有效范围 Infinity -Infinity isFinite()
3. string 字符串类型
3.1 使用单引号或者双引号表示字符
3.2 转义字符 \n \\ \' \"
4. boolean 布尔类型
true
false
5. null 和 undefined
undefined 表示没有定义
null 表示定义了值是空
2 数据类型转换
2.1 数据类型转换的规则
① 其他类型转为 number 类型
1. string 转为 number 类型的规则:
① 纯数字字符串会转为对应的数字,十六进制表示以及科学计数法表示的数字都是纯数字。
② 空字符串转为数字 0。
③ 其他字符串转为 NaN。
注意: string 类型数据在转为 number 类型数据的时候会自动去掉两端的空格,剩下部分按照以上规则进行转换
2. boolean 转为 number 类型的规则:
true -> 1
false -> 0
3. null 转为 number 类型的规则:
null -> 0
4. undefeind 转为 number 类型的规则:
undefined -> NaN
// 字符串转为 number 类型 使用 Number();
var n1 = Number('hello');
var n2 = Number('89.34');
var n3 = Number('89abc');
var n4 = Number('89.43e4');
var n5 = Number('0x11');
var n6 = Number('');
var n7 = Number(' ');
var n8 = Number(' 101 ');
var n9 = Number(' 10 1 ');
console.log(n1, typeof(n1)); // NaN number
console.log(n2, typeof(n2)); //89.34
console.log(n3, typeof(n3)); // NaN
console.log(n4, typeof(n4)); //89.43e4
console.log(n5, typeof(n5)); //17
console.log(n6, typeof(n6)); // 0
console.log(n7, typeof(n7)); // 0
console.log(n8, typeof(n8)); // 101
console.log(n9, typeof(n9)); // NaN
// boolean 转为 number
var v1 = Number(true);
var v2 = Number(false);
console.log(v1, typeof(v1)); // 1
console.log(v2, typeof(v2)); // 0
// null 转为 number
var v3 = Number(null);
console.log(v3, typeof(v3)); // 0
// undefined 转为 number
var v4 = Number(undefined);
console.log(v4, typeof(v4)); // NaN
② 其他类型转为 string 类型
数据长什么样就转为什么样的字符串
var s1 = String(34.67);
var s2 = String(true);
var s3 = String(null);
var s4 = String(undefined);
console.log(s1, typeof(s1)); //34.67
console.log(s2, typeof(s2)); //true
console.log(s3, typeof(s3)); //null
console.log(s4, typeof(s4)); //undefinded
③ 其他类型转为 boolean 类型
1. number 转为 boolean 类型的规则:
0 和 NaN 转为 false,其他数字都转为 true
2. string 转为 boolean 类型的规则:
空字符串转为 false,其他字符串都转为 true
3. null 转为 boolean 类型的规则:
null -> false
4. undefeind 转为 boolean 类型的规则:
undefiend -> false
总结: 0、NaN、空字符串、null、undefined 转为布尔值会转为 false,其他数据转为布尔值都是 true。
0、NaN、空字符串、null、undefined 转为 false,其他数据转为 true。 console.log(Boolean(0)); //false console.log(Boolean(NaN)); //false console.log(Boolean('')); //false console.log(Boolean(null)); // false console.log(Boolean(undefined)); // false
2.2 强制类型转换(显示转换)
① 强制把其他类型转为 number 类型的函数
Number()
parseInt()
parseFloat()
parsentInt()、parsentFloat 与 Number 的区别:
- parseInt() 和 parentFloat() 用于提取字符串的数字,所有非字符串类型得到的都是 NaN
- 纯数字字符串转为对应的数字;以数字开头的字符串转为开头的数字;其他字符串都是 NaN(空字符也是NaN)
console.log(parseInt('123.34abc')); //123 console.log(parseFloat('123.34abc')); //123.34 console.log(parseInt('')); // NaN
parseInt() 和 parsentFloat() 的区别:
- parseInt() 只能提取字符串中的整数部分。
- parentFloat() 可以提取字符串中的小数部分.
console.log(parseInt('123.34abc')); //123
console.log(parseFloat('123.34abc')); //123.34
注意:
- Number() 的转换规则此时标准的转换规则。
- 可以使用 parsetInt() 来对某个数字进行取整(会把小数部分舍去)。
② 强制把其他类型转为 string 类型的函数
String()
③ 强制把其他类型转为 boolean 类型的函数
Boolean()
2.3 自动类型转换(隐式转换)
-
JavaScript 作为弱类型编程语言,支持数据类型自动转换。
-
数据参与运算,数据不符合运算所要求的类型,数据会根据运算要求的类型自动转换。
-
运算所要求的数据类型由运算符绝对。
-
自动类型转换的规则与强制类型(Number、String、Boolean)转换的规则是一样的。
'100' + 20 10020
false * 20 0
undefined + 100 NaN
‘100’ == 100 true
false === 0 false
null == undefined true
200 !== 300 true
'abc' < 'b' true
100 > 20 && 1000 1000
+'hello' NaN
3 运算符
3.1 运算符和表达式
① 运算符
运算符就是参与运算的符号,像+
、-
、*
、/
等。
与运算符一起运算的变量、直接量、表达式称之为操作数。
② 表达式
-
表达式是变量或者直接量与运算符组成的式子,表达式会有一个计算结果,称之为表达式的值,也就是说表达式是有值的。
-
最简单的表达式是"原始表达式", 如 直接量、 变量名、 关键字等。
-
复杂表达式由简单表达式组成, 运算符何以将简单表达式组合成复杂表达式。
-
注意带有副作用的表达式,这样的表达式除了有表达式的计算结果之外,还会对表达式中的变量产生影响。
3.2 运算符的分类
① 按照运算符需要的操作数的个数
一元运算符/一目运算符
二元运算符/二目运算符
三元运算符/三目运算符
② 按照运算符的功能
算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、其他运算符
3.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 类型,利用运算符自动类型转换。
var msg = 'hello'; console.log(+msg); //NaN console.log(msg); //hello
累加运算符和累减运算符:
累加和累减都是一元运算符,操作数必须以变量的形式表示,具有副作用。
累加和累减的符号可以在操作数的前面也可以在操作数的后面,对操作数产生的副作用是一样的,但是所组成的表达式的值不同。
运算符在操作前面: 表单式取操作数累加或累减之后的值作为表达式的值。
运算符在操作数后面:表达式取操作数累加或累减之前的值作为表达式的值。
var num = 20;
var res = (num ++) - (++ num) + (num --) - (++ num) + (num --);
console.log(res); // 20
console.log(num); // 21
// 定义变量
var num = 20;
// 20 num = 21
// -
// 22 num = 22
// +
// 22 num = 21
// -
// 22 num = 22
// +
// 22 num = 21
var a = 20
var res = (++ a ) - (a ++) || (a --) - (--a)
console.log(res) // 2
console.log(a) // 20
② 关系运算符(比较运算符)
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
> | 大于 | 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 | 无 |
两个操作数比较大小的规则:
- 如果两个操作的类型不一致,各自自动转为 number 类型进行比较。
- 如果两个操作数都是 string 类型,按照 string 类型比较大小的规则进行比较。
console.log('a' < 'b'); // true
console.log('A' > 'a'); // false
在unicode 编码中,a=97,b=98,依次向上。A=65,B=66,依次向上
string 类型的数据比较大小的规则:
- 比较的是字符对应的 unicode 编码,unicode 编码是数字,可以比较大小。
- 字符串比较是按位一位一位的比较,如果一个操作数第一位的字符比另外一个操作第一位字符的unicode编码大,该操作整体都大。
相等和不相等的判断规则:
- 如果两个操作数类型不一致,自动转为 number 之后进行比较。
- 如果两个操作数类型一致,直接看是不是一样的。
console.log(0 == false); //true
console.log('' == false); //ture
console.log(undefined == undefined); // true
console.log('hello' == 'hello'); // true
全等和不全等的判断规则:
- 如果两个操作数类型不一致,直接返回 false,不会进行自动类型转换的。
- 如果两个操作数类型一致,比较是否一样。
console.log(true == 1); // true
console.log(true === 1); // false
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 | 无 |
逻辑与组成的表达式的值的计算规则:
- 如果第一个操作数不成立,取第一个操作数作为表达式的值。
- 如果第一个操作数成立,取第二个操作数作为表达式的值。
逻辑或组成的表达式的值的计算规则:
- 如果第一个操作数不成立,取第二个操作数作为表达式的值。
- 如果第一个操作数成立,取第一个操作数作为表达式的值。
var n = 10;
var res = n ++ || -- n;
console.log(res); // 10
console.log(n); // 11
console.log(!true); //false
console.log(!false); //ture
console.log(!0); //ture
④ 赋值运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
= | 赋值 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数)的值作为表达式的值 | 有 |
+= | 赋值求和 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
-= | 赋值求差 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
*= | 赋值求积 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
/= | 赋值求商 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
%= | 赋值求余 | 2 | 无要求,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
+= | 赋值连接 | 2 | string,左边的操作数必须是变量 | 变量(左边操作数的值作为表达式的值 | 有 |
总结:
- 赋值运算符要求左边的操作数必须是变量,右边的操作数变量、直接量、表达式都可以。
- 赋值运算符都有副作用,使用的就是赋值运算符的副作用,左边操作数会被修改。
- 赋值运算符组成的表达式以左边操作数为值(修改过后的)。
// 声明变量
var num = 100;
var age = 10;
// 修改变量的值
num = 200;
num = 100 + 90;
var res = (num = age);
console.log(num); //10
console.log(res); //10
console.log('');
console.log('');
num += 90; // num = num + 90
console.log(num); // 100
num -= 10; // num = num - 10
console.log(num); // 90
num *= 2; // num = num * 2
console.log(num); // 180
num /= 3; // num = num / 3
console.log(num); // 60
num %= 9; // num = num % 9
console.log(num); // 6
⑤ 其他运算符
运算符 | 含义 | 操作数个数 | 操作数的类型要求 | 组成的表达式的值的类型 | 有无副作用 |
---|---|---|---|---|---|
typeof | 判断数据的类型 | 1 | 任意类型 | string | 无 |
, | 逗号 | 2 | 无 | ||
+ | 字符串连接符 | 2 | string | string | 无 |
?: | 比较运算符 | 3 | 任意类型 | 取第二个操作数或者第三个操作数作为表达式的值 | 无 |
+ 符合具有3个含义:
- 如果操作数只有一个,+ 表示正号运算符.
- 如果操作数两个,且没有任何一个操作数是字符串,+ 表示加号。
- 如果操作数连个,只要有一个操作数是字符串,+ 表示字符串连接符。
console.log( 100 + 23); //123
console.log( 100 + '12'); //10012
console.log( '100' + '12'); //10012
console.log( true + false); //1
console.log('');
console.log('');
?:三元运算符组成的表示的值的规则:
- 如果第一个操作数成立,取第二个操作数作为表达式的值。
- 如果第一个操作数不成立,取第三个操作数作为表达式的值。
var res = 100 ? 20 : 10;
console.log(res); //20
var res1 = null ? 100 : 200;
console.log(res1); //200
2.4 运算符优先级
1、 一元运算符: ++ -- ! typeof
2、 乘除取余、加减
3、 关系运算符
4、 逻辑运算符
5、 赋值运算符
6、 ?:
注意: 使用 () 可以提高优先级。
var n = 100;
console.log(n ++ && n --); 101
console.log(n); 100
console.log(-- n || n ++); 99
console.log(n); 99