javaScript基础面试题:typeof 与 instanceof 区别

48 阅读1分钟

一,typeof
typeof 操作符返回一个字符串,表示未经计算的操作数的类型.
typeof 一般是用来判断变量是否存在,返回他的类型,其中基本数据类型 null 返回的是一个 object,但 null 不属于引用数据类型,typeof 除了判断 function 函数会识别,其他的引用类型输出为 object。

<script>
  console.log(typeof 1);
  console.log(typeof '1');
  console.log(typeof undefined);
  console.log(typeof true);
  console.log(typeof Symbol());
  console.log(typeof null);
  console.log(typeof []);
  console.log(typeof {});
  console.log(typeof console);
  console.log(typeof console.log);
</script>

如上代码:控制台打印结果看下图

image.png 二,instanceof
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上,构造函数通过new可以实例对象,instanceof能判断这个对象是否是之前那个构造函数生成的对象
instanceof 一般是用来判断引用数据类型,但不能正确判断基本数据类型,根据在原型链中查找判断当前数据的原型对象是否存在返回布尔类型
区别
(1),typeof会返回一个变量的基本类型,instanceof返回的是一个布尔值
(2),instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型
typeof 也存在弊端,它虽然可以判断基础数据类型(null 除外),但是引用数据类型中,除了function 类型以外,其他的也无法判断
推荐:采用Object.prototype.toString,调用该方法,统一返回格式“[object Xxx]”的字符串,

<script>
  console.log(Object.prototype.toString({}))
  console.log(Object.prototype.toString.call({}))
  console.log(Object.prototype.toString.call(1))
  console.log(Object.prototype.toString.call('1'))
  console.log(Object.prototype.toString.call(true))
  console.log(Object.prototype.toString.call(function () { }))
  console.log(Object.prototype.toString.call(null))
  console.log(Object.prototype.toString.call(undefined))
  console.log(Object.prototype.toString.call(/123/g))
  console.log(Object.prototype.toString.call(new Date()))
  console.log(Object.prototype.toString.call([]))
  console.log(Object.prototype.toString.call(document))
  console.log(Object.prototype.toString.call(window))
</script>

如上代码:控制台打印结果看下图

image.png