【问题标题】:Can you fake out Array.isArray() with a user-defined object?你能用用户定义的对象伪造 Array.isArray() 吗?
【发布时间】:2011-12-29 18:48:40
【问题描述】:

我很好奇是否有任何方法可以使用用户定义的对象来伪造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()(尽管知道是否可以这样做显然很棒!)。

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案2】:

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

    如果你想调皮

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

    【讨论】:

      猜你喜欢
      • 2020-06-02
      • 1970-01-01
      • 2023-03-27
      • 2021-10-14
      • 1970-01-01
      • 2021-04-19
      • 2011-02-05
      • 1970-01-01
      • 2014-04-14
      相关资源
      最近更新 更多