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

Jos*_*ith 8 javascript

我很好奇是否有任何方法可以伪造出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
Run Code Online (Sandbox Code Playgroud)

那个对象显然失败了,但还有其他办法吗?这纯粹是好奇心,并不是因为我认为你可以用.isArray()普通的客户端代码搞定(尽管知道你是否可以,这显然很棒!).

Ray*_*nos 10

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

如果你想变得顽皮

Array.isArray.toString = function () { 
  return 'function () { [native code] }';
};
Run Code Online (Sandbox Code Playgroud)


Fel*_*ing 9

仅当您将内部[[Class]]属性设置为"Array",这是不可能的afaik.从规格:

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

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