js基础升级打怪(一数据类型+运算符)

168 阅读4分钟

一、数据类型

  • 基本数据类型 String Number NaN Boolean undefined Null
  • 引用数据类型 Array Function Object Date Regep
  • 基本类型存储方式: 栈
  • 引用类型存储方式: 堆
  • 声明过的变量,变量重新赋值时, 每次都开辟新空间,而不是修改原来空间的数据;原来空间的数据仍然存在;

二、错误

1、 错误

  • 语法错误: js代码全部不执行;
  • 通用错误: js代码遇到错误就中断;包含引用错误等;

三、运算符

1、算术运算 + - * / % ++ --

鞋子 (1).png 演练
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

书本.png 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
鞋子 (1).png 演练
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
书本.png summary
  • -运算后的结果,只能是Number 或 NaN
  • 自左向右,遇到-,-左右两侧数据都转化为Number类型
  • Number('1') ==> 1
  • Number('str') ==> NaN
鞋子 (1).png 演练
/*----  *  ----*/
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
书本.png summary
  • *运算符左右两侧数据都转化为Number类型
  • /运算符左右两侧数据都转化为Number类型
  • %运算符左右两侧数据都转化为Number类型
  • 任何数除以0,结果都是Infinity
鞋子 (1).png 演练
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
书本.png summary
  • a++, 先取值,再运算;
  • ++a, 先运算,再取值;

2、逻辑运算 || && ! == != > <

鞋子 (1).png 演练
/*----  ! ----*/
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
/*----  === ----*/
书本.png 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; 其次再比较;
鞋子 (1).png 演练
/*----  &&   ||   ----*/
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
书本.png summary
  • && 一假则假,自左向右,遇假返假,否则返回最后一个真;
  • || 一真则真,自左向右,遇真返真,否则返回最后一个假;
  • &&遇假之后,运算终止;
  • ||遇真之后,运算终止;