# falsy
假值
- 假值:
- false
- undefined
- NaN
- null
- ''
console.log(!!(false || undefined || NaN || null || '')); // false
1 - 除了假值都是真值
// 对象包裹 也是真值 const a = new Boolean(false); const b = new String(''); const c = new Number(0); console.log(!!(a && b && c)); // true
1
2
3
4
5
# typeof
typeof
只能识别出这些类型
- undefined
- boolean
- string
- number
- "object" 对象 或 null
- "function"
- symbol
- 注:typeof 会把 null 和 object 和 Array类型都判断为 object,所以 深浅拷贝函数需要再次判断类型
# 全等===
- 原生的 '==' 符号有一些缺陷,所以引入了全等 '==='
== 和 === 区别
boolean、string、number ==会自动转换类型再判断,不是精准比较
undefined == null; // true
undefined === null; // falseNaN == NaN // false
NaN === NaN // false
isNaN(NaN) // true
# instanceof
- instanceof 本质上是从原型链上面去找对象
- 类的继承的本质就是在 prototype 对象加上一个__proto__属性,指向父类的prototype
- 而instanceof的本质就是查看本对象的_ _ proto _ _链上有没有目标函数的prototype
# 阻止函数式调用
- 根据instanceof的特性,和new关键字的特性,可以推导出阻止类的函数式调用的方法
- 另外,也可以通过new.target判断
阻止类的函数式调用
- 一般我们定义一个class就是一个function,只是阻止了函数直接调用
class A {}
function B() {}
// 类式调用
let a = new A();
let b = new B();
// 函数式调用
A(); // Error
B(); // 正确运行,但是不期望这么做,因为本身目的是让它作为一个类
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 那么一个function怎样只允许他new调用呢?
function B() {
// 注:! 优先级比 instanceof 高,所以要加括号
if (!(this instanceof B)) {
throw Error('只能用new关键字调用');
}
}
B(); // 抛出Error
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# Object.is
# 与===/==的区别
Object.is(NaN, NaN); // true
NaN === NaN; // false
NaN == NaN; // false
Object.is(+0, -0); // false
+0 == -0; // true
+0 === -0; // true
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# in
- 判断某个属性在不在对象的原型链上
type fish = {
swiming: () => void;
}
type dog = {
run: () => void;
}
function fn(a: fish | dog) {
if ('swiming' in a) {
a.swiming();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 可选链
- 表达式取值:左边有才继续取值,左边没有就直接返回undefined
const o = {}
console.log(o.a?.name); // undefined
if (!o.a?.name) {
console.log('没有名字'); // 没有名字
}
1
2
3
4
5
6
2
3
4
5
6
取代写法
const o = {}
const name = o.a && o.a.name;
const name2 = o.a?.name;
1
2
3
2
3