你能用用户定义的对象伪造Array.isArray()吗?

时间:2011-12-29 18:48:40

标签: javascript

我很想知道是否有办法用用户定义的对象伪造Array.isArray()

从JavaScript Patterns:

一书中
Array.isArray([]); // true

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

该对象明显失败,但还有其他办法吗?这纯粹是好奇心,而不是因为我认为你可以在常规客户端代码中使用.isArray()(尽管知道你是否可以做到这一点显然很棒!)。

2 个答案:

答案 0 :(得分:10)

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

如果你想变得顽皮

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

答案 1 :(得分:9)

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

  

isArray函数接受一个参数arg,如果参数是类内部属性为“Array”的对象,则返回布尔值true;否则返回false

或者你反过来:创建一个普通数组并将每个数组方法显式设置为undefined