您可以使用用户定义的对象派生出Array.isArray()吗?

Can you fake out Array.isArray() with a user-defined object?

本文关键字:isArray Array 派生 可以使 用户 定义 对象      更新时间:2023-09-26

我很好奇是否有办法用用户定义的对象伪造出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()(尽管如果您可以的话,这显然是非常棒的!)。

仅当您将内部[[Class]]属性设置为"Array"时,这是不可能的。来自规范:

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

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

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

如果你想淘气

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