到目前为止,我依靠Object.prototype.toString.call(x)来区分Javascript中的不同本机对象类型,尤其是数组。

如果子类化数组,则会出现一些奇怪的行为:

function Ctor() {}
Ctor.prototype = Object.create(Array.prototype);
var x = new Ctor();
x.push(1);

Object.prototype.toString.call(x); // [object Object]


ES5规范中可能记录了这一点(不再是ES6中的问题),但是我认为这是该语言当前版本的怪癖。我调整了相应的功能,如下所示:

function objTypeOf(deep, type) {
  return function _objTypeOf(x) {
    do {
      if (Object.prototype.toString.call(x).slice(8, -1).toLowerCase() === type) return true;
      x = Object.getPrototypeOf(x);
    } while(deep && x !== null);

    return false;
  };
}

var arr = objTypeOf(false, "array"),
 arrP = objTypeOf(true, "array"); // array prototype

console.log(arr(x)); // false
console.log(arrP(x)); // true


objTypeOf检查当前对象和整个原型链,直到存在类型匹配为止。即使只有一个原型与期望的类型匹配,它也会接受对象。 objTypeOf不是基于原型身份,而是基于字符串(缺少身份)。

我想知道使用Object.prototype.toString时是否还有其他边缘情况需要特殊处理?

最佳答案

好吧,您的问题不在于Object.prototype.toString,而是您尝试了subclass arrays。只是不起作用,并且toString正确告诉您创建数组失败。它只是在其原型链中包含Array.prototype的对象(如果您要照管的话,请使用instanceof Array)。

无论如何,要回答您的标题问题:


  使用Object.prototype.toString时有哪些极端情况?


主机对象。并非本地JS对象的所有对象,尽管看起来像一个对象,但都可能返回您没有想到的任何[[Class]]值。甚至在某些已知情况下,可调用对象不报告Function

关于javascript - 使用Object.prototype.toString时有哪些极端情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34353967/

10-12 00:03
查看更多