类型判断

87 阅读1分钟

类型判断

typeof

只能判断原始类型且除了 null,typeof可以判断 function

let str = 'awei'
console.log(typeof str);

instanceof

只能判断引用类型,不能判断原始类型,返回的是布尔值

// 不能判断
// console.log(str instanceof String);
// console.log(num instanceof Number);
// console.log(flag instanceof Boolean);
// console.log(n instanceof Null);
// console.log(u instanceof undefined);

// 能判断
console.log(obj instanceof Object);
console.log(arr instanceof Array); 
//也能判定成对象object,因为insranceof是按照原型链往上找,下同,例外:object.create(null)没有原型object
console.log(fn instanceof Function);
console.log(date instanceof Date);
console.log(reg instanceof RegExp);

内部机制

function instance_of(L, R) {
  let O = R.prototype
  L = L.__proto__

  while (L !== null) {
    if (L === O) return true
    L = L.__proto__
  }
  return false
}

console.log(instance_of(arr, Object));

Object.prototype.toString.call()

最佳,返回一个字符串

call表示把作用域指到谁身上

  • 如果this值是undefined,就会返回 [object Undefined]
  • 如果this值是null,就会返回 [object Null]
let str = 'hello' //可改为undefined和null
console.log(Object.prototype.toString.call(str)); 
// '[object String]'

如果()内的值不为undefined和null,则执行接下来的步骤:

  • 生成变量O,让O成为ToObject(this)的结果(即成为一个对象)
  • 让class成为O的内部属性 [[class]]的值
  • 最后返回由 "[object" 和 class 和 "]" 三个部分组成的字符串(class为识别对象类型的关键)
let O = {
  [[class]]: String
}

例题:切割结果,判断是否为string类型

if (Object.prototype.toString.call(str).slice(8, -1) === 'String') { // -1表示倒着数第一个
  console.log('yes');
}

Array.isArray()

数组独有的方法