到目前为止,我依靠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/