一、数据类型
- 基本数据类型 String Number NaN Boolean undefined Null
- 引用数据类型 Array Function Object Date Regep
- 基本类型存储方式: 栈
- 引用类型存储方式: 堆
- 声明过的变量,变量重新赋值时, 每次都开辟新空间,而不是修改原来空间的数据;原来空间的数据仍然存在;
二、错误
1、 错误
- 语法错误: js代码全部不执行;
- 通用错误: js代码遇到错误就中断;包含引用错误等;
三、运算符
1、算术运算 + - * / % ++ --
演练
var a = 1, b = 2;
let r1 = a + b
let r2 = 'str' + a + b
let r3 = a + b + 'str'
let r4 = a + true
let r5 = 'str' + a + true
let r6 = a + false
let r7 = 'str' + a + false
let r8 = a + NaN
let r9 = 'str' + a + NaN
let r10 = a + undefined
let r11 = 'str' + a + undefined
let r12 = a + null
let r13 = 'str' + a + null
// 结果
r1: 3
r2: str12
r3: 3str
r4: 2
r5: str1true
r6: 1
r7: str1false
r8: NaN
r9: str1NaN
r10: NaN
r11: str1undefined
r12: 1
r13: str1null
summary
- +,可以用于Number类型数据运算,也可用于字符串拼接;
- +运算后的结果,只能是 String Number 或 Nan
- 运算中,自左向右,只要+右边String类型,运算结果就变成String;
- 非Number非String类型,先转Number类型,再运算;
- Number(true) ==> 1
- Number(false) ==> 0
- Number(undefined) ==> NaN
- Number(null) ==> 0
- Number(NaN) ==> NaN
演练
var a = 1,
b = 2;
let r1 = a - b
let r2 = a - 'str'
let r3 = 'str' - a
let r4 = '3' - a
let r5 = a - '3'
let r6 = '3' + '1' - a + '3'
let r7 = a - false
let r8 = a - true
let r9 = a - NaN
let r10 = a - undefined
let r11 = a - null
//结果
r1: -1
r2: NaN
r3: NaN
r4: 2
r5: -2
r6: 303 typeof: string
r7: 1
r8: 0
r9: NaN
r10: NaN
r11: 1
summary
- -运算后的结果,只能是Number 或 NaN
- 自左向右,遇到-,-左右两侧数据都转化为Number类型
- Number('1') ==> 1
- Number('str') ==> NaN
演练
/*---- * ----*/
var a = 1;
let r1 = a * b
let r2 = a * 'str'
let r3 = a * false
let r4 = a * true
let r5 = a * null
let r6 = a * undefined
let r7 = a * NaN
//结果
r1: 2
r2: NaN
r3: 0
r4: 1
r5: 0
r6: NaN
r7: NaN
/*---- / ----*/
var a = 1;
let r1 = a / b
let r2 = a / 'str'
let r3 = a / 0
let r4 = a / -0
let r5 = a / false
let r6 = a / true
let r7 = a / null
let r8 = a / NaN
let r9 = a / undefined
//结果
r1: 0.5
r2: NaN
r3: Infinity
r4: -Infinity
r5: Infinity
r6: 1
r7: Infinity
r8: NaN
r9: NaN
summary
- *运算符左右两侧数据都转化为Number类型
- /运算符左右两侧数据都转化为Number类型
- %运算符左右两侧数据都转化为Number类型
- 任何数除以0,结果都是Infinity
演练
var a = 4;
/*---- ++ -- ----*/
let r1 = a++ //r1: 4 a: 5
let r2 = ++a //r2: 5 a: 5
let r3 = a++ + ++a //r3: 10 a: 6
let r4 = ++a + a++ //r4: 10 a: 6
let r5 = a-- + a++ //r5: 7 a: 4
let r6 = a-- + ++a //r6: 8 a: 4
let r7 = --a + ++a //r7: 7 a: 4
let r8 = --a + a++ //r8: 6 a: 4
summary
- a++, 先取值,再运算;
- ++a, 先运算,再取值;
2、逻辑运算 || && ! == != > <
演练
/*---- ! ----*/
let r1 = !'str' //r1: false
let r2 = !false //r2: true
let r3 = !true //r3: false
let r4 = !1 //r4: false
let r5 = !0 //r5: true
let r6 = !'' //r6: true
let r7 = !' ' //r7: false
let r8 = !null //r8: true
let r9 = !NaN //r9: true
let r10 = !undefined //r10: true
/*---- == ----*/
let r1 = 1 == 1 //r1: true
let r2 = 1 == '1' //r2: true
let r3 = 1 == true //r3: true
let r4 = 0 == false //r4: true
let r5 = 'str' == 'str' //r5: true
let r6 = 0 == null //r6: false
let r7 = 0 == undefined //r7: false
let r8 = 0 == NaN //r8: false
let r9 = null == null //r9: true
let r10 = undefined == undefined //r10: true
let r11 = NaN == NaN //r11: false
let r12 = Infinity == Infinity //r12: true
let r13 = {} == {} //r13: false
let r14 = [] == [] //r14: false
let r15 = (()=>{}) == (() =>{}) //r15: false
let r16 = '' == {} //r16: false
let r17 = 0 == {} //r17: false
let r18 = 0 == [] //r18: true
let r19 = '' == [] //r19: true
let r20 = 1 == [1] //r20: true
let r21 = '1' == [1] //r21: true
/*---- === ----*/
summary
- 除 false 0 null NaN undefined '' "" 之外的所有数据转Boolean都是真;
- ==相等包含隐式类型转换,===全等没有类型转换;
- 基本类型相等比较==,==左右只有0个或1个String时,先将左右两侧数据转为Number再比较;
- 基本类型相等比较==,==左右两侧都是数据类型时,依次比较ASCII码;
- 基本类型和引用类型相等比较==,先将引用类型转换为原始值(toString和valueOf),即字符类型,再比较;
- 引用类型相等比较==,比较的是存储地址,除本身外不会和任何值相等;
- 除了0==false,null==undefined之外, 0、false、 null、 undefined、NaN之间互相不等;
- 没有和NaN相等的数据,包括它本身;
- 全等===,先比较类型,类型不等则为false; 其次再比较;
演练
/*---- && || ----*/
let r1 = 1 && 1
let r2 = 1 && '1'
let r3 = 1 && true && '1' && [] && {}
let r4 = 0 && '1'
let r5 = undefined && '1'
let r6 = null && '1'
let r7 = NaN && '1'
let r8 = [] && '1'
let r9 = 0 && false && undefined && null && NaN
let r10 = 1 && true && '1' && [] && {} && (() => {})
let r11 = 0 || '1'
let r12 = undefined || '1'
let r13 = null || '1'
let r14 = NaN || '1' //r14: false
let r15 = 0 || false || undefined || null || NaN
let r16 = 1 || true || '1' || [] || {} || (() => {})
//结果
r1: 1
r2: 1
r3: {}
r4: 0
r5: undefined
r6: null
r7: NaN
r8: 1
r9: 0
r10: [Function (anonymous)]
r11: 1
r12: 1
r13: 1
r14: 1
r15: NaN
r16: 1
summary
- && 一假则假,自左向右,遇假返假,否则返回最后一个真;
- || 一真则真,自左向右,遇真返真,否则返回最后一个假;
- &&遇假之后,运算终止;
- ||遇真之后,运算终止;