函数式的编程语言(一些简称: 剪枝, 特判)
1. 变量 作用域(全局 和局部, 局部又分(块级和函数))
2. 运算符 = 赋值 - * / %(求模) ++ -- || && ! 单算比逻三 (单目 算数 比较 逻辑 三目)
3. +-*/ % 都可以搭配 = (a+=1 和 ++a 一样的)
4. 位运算符: & | ~ ^ << >> 与或非 异或 左移右移
5. a !== b 和 a != b 的区别
6. ++a a++区别?
7. delete是用来删除对象属性的 可以用来删数组吗? 不能还是用 splice 比较好
判断数据类型
基本类型用typeof 数组用Array.isArray
Object.prototype.toString.call(x).slice(8,-1) // 比较强大, String, Number....
typeof 的返回值类型: string boolean number null undefined symbol bigint object function 9种
x instanceof Object/Array
引用数据类型/对象/派生数据类型: object array function map set
Number.isInteger(1) 判断是不是整数
Number.isNaN()
真/假值
false: “” 0 undefined null NaN
其他都是true(对象都是true)
相等运算符 === 和 ==
所以用 === 或者 Object.is()比较好, 没有隐式的类型转换, 比较原始数据类型比较的是值, 比较对象数据类型,比较的是地址.
隐式转换真的烦, 糟粕!!!
null == undefined // 特例!!!
null > -1 // true
Number(null) // 0
Number(undefined) // NaN
'' == 0 // Number('') 0 数字和字符串比较会隐式转换字符串;
'1' == 1 // Number('1') 1
true == 1 // Number(true) 1 布尔值和其他类型比较会隐式转换boolean
false == 0 // Number(false) 0
[123] == '123' // [123].toString() toPrimitive()
let obj = {}; obj == '[object Object]'
Object.is(a, b) 和 === 不同之处只有两个:一是+0不等于-0,二是NaN等于自身。
NaN == NaN // false === 也是 false
'a' ? 1 : 2 // 1
'c' > 'b' // 字符串相比, 比的是ASCII码
false == 'a' // false 因为 Number(false)是 0 Number('') 是 NaN
true == 'a' // false
true < 2// true > false
true == 1
true > 0
控制结构
条件语句(分支)
let a = 2
switch (a){
case 1: { // 括号可不加, === 匹配
break; // 不写break就有穿透,执行下一个case了,当然也可以利用这个穿透, 少些一些代码; 如下
}
case 2:
case 3:
case 4
console.log('2或3或4啊')
default:{
// 前面的case都没匹配才会走到这里来
}
}
if / else if /else
if(a===1)
console.log(1) // 一句代码的可省略括号
else if(a===2)
console.log(2)
else console.log(3)
循环
递增 递减 for 循环
比如想通过循环把数组清掉
for(let i = 0;i < arr.length; i++){
arr.pop() // 注意改变了数组, 上面的i值还用到了数组的方法,就有问题
}
上面是标准写法, 下面这样也行, 但看着不如while循环顺眼了.
let index = 0;
for (; index <10; ) {
console.log(index);
index++
}
while(index < 20){
console.log(index)
index++
}
console.log(index);
do{
} while() // 几乎不用