2011-12-29 18 views
8

我很好奇是否有任何方法可以用用户定义的对象虚拟出Array.isArray()你可以使用用户定义的对象来伪装Array.isArray()吗?

从书的JavaScript模式:

Array.isArray([]); // true 

// trying to fool the check 
// with an array-like object 
Array.isArray({ 
    length: 1, 
    "0": 1, 
    slice: function() {} 
}); // false 

该对象显然失败了,但是否有任何其他的方式做到这一点?这纯粹是好奇心,而不是因为我认为你可以在普通客户端代码中使用.isArray()(尽管知道你是否可以!显然是太棒了!)。

回答

9

仅当您将internal [[Class]] property设置为"Array"时,这是不可能的。从specification

isArray函数采用一个参数arg,并且如果该参数是一个对象,它的类的内部属性为“阵列”返回布尔值true;否则返回false

或者你走另一条路:创建一个正常的数组并明确地将每一个数组方法设置为undefined

+0

现在你已经促使我提出一个后续的问题:http://stackoverflow.com/questions/8672204/can- you-set-the-internal-class-property-of-ecmascript-object – 2011-12-29 19:10:57

10

Array.isArray = function() { return true; }

如果你想成为顽皮

Array.isArray.toString = function() { 
    return 'function() { [native code] }'; 
}; 
+0

这两个解决方案都很调皮。这是一个全球变化,可以打破网站/应用程序的其他部分。 – 2017-09-21 06:06:11

相关问题