JavaScript - 类型检测

65 阅读1分钟

1、typeof( 基本类型 )

  • 主要用于判基本类型
  • 数组、对象、null 都会被判断为 object
console.log(typeof "str"); // string
console.log(typeof 2); // number
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined

console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object

console.log(typeof function () {}); // function

2、instanceof( 实例 )

  • 判断对象类型,不能判断基本数据类型
  • 内部的机制是通过判断在其 原型链( proto )中能否找到该类型的原型
// 手写实现
function instance_of(L, R) {
  let O = R.prototype;
  L = L.__proto__;
  while (true) {
    if (L == null) return false;
    if (O === L) return true;
    L = L.__proto__;
  }
}
instance_of([2], Array);

// [Number、String、Boolean]  instanceof [Number、String、Boolean] 为false
console.log(2 instanceof Number); // false
console.log(true instanceof Boolean); // false
console.log("str" instanceof String); // false

//true [].__proto__ == Array.prototype
console.log([] instanceof Array); // true
console.log(function () {} instanceof Function); // true
console.log({} instanceof Object);

3、constructor ( 构造函数 )

  • 判断数据的类型
  • 对象实例通过 constrcutor 对象访问它的构造函数
  • 如果创建一个对象来改变它的原型,constructor就不能用来判断数据类型了
console.log((2).constructor === Number); // true
console.log(true.constructor === Boolean); // true
console.log("str".constructor === String); // true

console.log([].constructor === Array); // true
console.log(function () {}.constructor === Function); // true
console.log({}.constructor === Object); // true

function Fn() {}
Fn.prototype = new Array();
var f = new Fn();

console.log(f.constructor === Fn); // false
console.log(f.constructor === Array); // true

4、Object.prototype.toString.call()

  • Object.prototype.toString.call()
  • slice(8,-1)
var a = Object.prototype.toString;
// a.call( type ).slice(8,-1)   "[object Number]"===> Number

console.log(a.call(2)); // Number
console.log(a.call(true)); // Boolean
console.log(a.call("str"));
console.log(a.call([]));
console.log(a.call(function () {}));
console.log(a.call({}));
console.log(a.call(undefined));
console.log(a.call(null));