美文网首页
【面经】typeof 与 instanceof 的区别

【面经】typeof 与 instanceof 的区别

作者: 付坤奇 | 来源:发表于2019-03-04 14:28 被阅读0次

继续耻辱面试的面经。被问到了如何辨别对象与数组(对象的类型),以及如何判断某个实例是否属于这个类,在面试的时候用了很愚蠢的方法的自杀式回答,回来之后痛定思痛,当时其实是想到这两个操作符了的,还是还不熟悉了。这回一次性搞清楚。

对象

1、typeof

我们的老朋友。typeof操作符返回一个字符串,表示未经计算的操作数的类型。主要有这几种结果:

类型 结果
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Symbol (ES 6 新增) "symbol"
函数对象 "function"
任何其他对象 "object"

比较需要注意的是,使用基本类型对应的构造函数构造出来的的实例的数据类型是 object:

typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String("abc") === 'object';

2、instanceof

instanceof 的语法如下,用来检测 constructor.prototype 是否存在于参数 obj 的原型链上。

obj instanceof constructor

简单地分辨数组与对象:

  let a = [1,2,3]
  let b = {name:"franko"}
  function judge(obj){
    if(obj instanceof Array) return "Array"
    if(obj instanceof Object) {
      return "Object"
    }else{
      return "Not an Object"
    }
  }  

更优雅的方法:

function judge2(obj){
  if(Array.isArray(obj)){
    return "Array"
  }else{
    return "Not an Array"
  }
}

但是这种方法并不能告诉我们对象的具体类型,如果我们要进行判断,就要一种一种地试。以及对象是否就是某个类的实例也不能判断,因为只要在 obj 的原型链上的构造函数都能够返回 true。

3、最终的答案

获取对象具体类型的方法是,使用 Object.prototype.toString.call 方法。具体操作如下:

console.log(Object.prototype.toString.call("jerry"));
//[object String]
console.log(Object.prototype.toString.call(12));
//[object Number]
console.log(Object.prototype.toString.call(true));
//[object Boolean]
console.log(Object.prototype.toString.call(undefined));
//[object Undefined]
console.log(Object.prototype.toString.call(null));
//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));
//[object Object]
console.log(Object.prototype.toString.call(function(){}));
//[object Function]
console.log(Object.prototype.toString.call([]));
//[object Array]
console.log(Object.prototype.toString.call(new Date));
//[object Date]
console.log(Object.prototype.toString.call(/\d/));
//[object RegExp]
function Person(){};
console.log(Object.prototype.toString.call(new Person));
//[object Object]

这种方法正好满足了我们判断对象类型的需要,正如我们所见的,这种方法不能用来判断实例所在的类,判断实例所在的类则可以使用 Object.getPrototypeOf(obj).constructor.name 的方法。Object.getPrototypeOf() 方法返回指定对象的原型。如:

var proto = {};
var obj = Object.create(proto);
Object.getPrototypeOf(obj) === proto; // true

var reg = /a/;
Object.getPrototypeOf(reg) === RegExp.prototype; // true

console.log(Object.getPrototypeOf(reg).constructor.name)
// "RegExp"

以上就是本篇博客中关于 typeof 和 instanceof 的所有内容。可见这些知识虽然细,但是在关键时候还是用得上的,希望我能记住吧。

对象

相关文章

  • JavaScript的类型检查与验证

    目录 一、 typeof 二、 instanceof 三、 typeof 与 instanceof 区别 四、 获...

  • 【面经】typeof 与 instanceof 的区别

    继续耻辱面试的面经。被问到了如何辨别对象与数组(对象的类型),以及如何判断某个实例是否属于这个类,在面试的时候用了...

  • js知识点整理

    typeof 与intanceof的区别 typeof和instanceof的区别是:typeof的返回值是一个字...

  • typeof与instanceof区别

    曾几何时,一个HR问我,typeof可以判断数据类型,但是无法判断array和object,如何解决,我天真的想到...

  • typeof与instanceof区别

    一、问题: instanceof 可以判断一个引用是否属于某构造函数; 另外,还可以在继承关系中用来判断一个实例是...

  • typeof 与 instanceof 区别

    一、typeof typeof 操作符返回一个字符串,表示未经计算的操作数的类型 使用方法如下: operand表...

  • typeof,instanceof,constructor它们的

    typeof和instanceof的区别 typeof和instanceof都可以用来判断变量,它们的用法有很大区...

  • typeof 与 instanceof的区别

    typeof 只能判断 基本类型的数据类型: 数值 Number 字符创 String 布尔值 Boolean u...

  • js零碎收集

    1.instanceof和typeof的区别typeof只能判断number,string,boolean,fun...

  • typeof 与 instanceof之间的区别

    JS中会使用typeof 和 instanceof来判断一个变量是否为空或者是什么类型的。 ES6规范中有7种数据...

网友评论

      本文标题:【面经】typeof 与 instanceof 的区别

      本文链接:https://www.haomeiwen.com/subject/arciuqtx.html