类型判断

2021/11/1

# falsy

假值

  • 假值:
    1. false
    2. undefined
    3. NaN
    4. null
    5. ''
    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

只能识别出这些类型

  1. undefined
  2. boolean
  3. string
  4. number
  5. "object" 对象 或 null
  6. "function"
  7. symbol
  • 注:typeof 会把 null 和 object 和 Array类型都判断为 object,所以 深浅拷贝函数需要再次判断类型

# 全等===

  • 原生的 '==' 符号有一些缺陷,所以引入了全等 '==='

== 和 === 区别

  1. boolean、string、number ==会自动转换类型再判断,不是精准比较

  2. undefined == null; // true
    undefined === null; // false

  3. NaN == NaN // false
    NaN === NaN // false
    isNaN(NaN) // true

# instanceof

  • instanceof 本质上是从原型链上面去找对象
  • 类的继承的本质就是在 prototype 对象加上一个__proto__属性,指向父类的prototype
  • 而instanceof的本质就是查看本对象的_ _ proto _ _链上有没有目标函数的prototype

# 阻止函数式调用

阻止类的函数式调用

  • 一般我们定义一个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
  • 那么一个function怎样只允许他new调用呢?
function B() {

    // 注:! 优先级比 instanceof 高,所以要加括号
    if (!(this instanceof B)) {
        throw Error('只能用new关键字调用');
    }
}

B(); // 抛出Error
1
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

# 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

# 可选链

  • 表达式取值:左边有才继续取值,左边没有就直接返回undefined
const o = {}
console.log(o.a?.name); // undefined

if (!o.a?.name) {
    console.log('没有名字'); // 没有名字
}
1
2
3
4
5
6

取代写法

const o = {}
const name = o.a && o.a.name;
const name2 = o.a?.name;
1
2
3

# 空值判断

# 判断数组

# 判断对象

上次更新: 9/17/2024