JavaScript 中哪些对象具有 .length 属性? (又名为什么 Underscore _.each 将我的函数对象视为数组?)

2024-02-14

我的印象是只有Array对象有一个.length财产。但是,话又说回来,我也看到过提到“类似数组”的对象。我还没有研究过这个,现在看来我对 JS 中这个话题的无知可能让我很痛苦。例证:

我有以下代码:

var View = function(options) {
  // code
};

_.extend(View, Backbone.Events, {

    make_children: function(parent) {
      // code
    }

});

后来我就用这个View Function带有下划线的_.each,这决定了这个函数对象是一个数组,因为它有一个.length财产:

// Code from Underscore.js's `_.each`:
} else if (obj.length === +obj.length) { // This is true
  for (var i = 0, l = obj.length; i < l; i++) { // **So, execution goes here**
    if (iterator.call(context, obj[i], i, obj) === breaker) return
  }
} else {
  for (var key in obj) {
    if (_.has(obj, key)) { // **Execution does __not__ go here**
      if (iterator.call(context, obj[key], key, obj) === breaker) return;
    }
  }
}

这会导致代码不起作用,因为obj[i] where i是一个整数索引,实际上并未在我的上定义obj View。准确地说,在上面的代码中,obj[0] is undefined while obj.length === +obj.length is true and obj.length is 1。这里发生了什么?

Addendum

Underscore 的首席维护者在https://github.com/documentcloud/underscore/pull/510 https://github.com/documentcloud/underscore/pull/510:

简单地创建每个拒绝函数对象并没有真正的帮助。我们已经 有意识地决定使用数字长度属性来检测 类似数组的对象。

相反,不要将函数对象传递给each.

附录2

意识到因为我无法将函数对象传递给_.each,我可以将其“转换”为常规对象,如下所示:

var regular_obj = _.extend({}, View);

这里的问题是underscore.js, 很像jquery,两者都使用.length财产作为他们的旗帜each功能。当。。。的时候length属性存在,该函数假设传递的参数可以使用普通的 for 循环进行迭代。这个逻辑背后的原因是,当length定义了属性,然后就可以迭代参数in order这就是使用 for 循环的原因。

滥用的结果length本质上是名称冲突,会产生意想不到的结果。我建议改变length另一个同义词,例如size or capacity or totalViews, etc.


Edit

如果有没有其他选择供你使用,并且你必须有足够的长度,同时仍然保留_.each的功能,那么你可以稍微破解它。该插件适用于下划线版本 1.4.3 的缩小版

var s = Array.prototype.ForEach;
var r = {};
var myEach = function (n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length&&typeof(n[0])!="undefined"){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(_.has(n,a)&&t.call(e,n[a],a,n)===r)return};
_.each=myEach;

这是一个演示:http://jsfiddle.net/Xa5qq/ http://jsfiddle.net/Xa5qq/

基本上它的作用是使用forEach当。。。的时候length财产存在但typeof(yourObject[0]) == "undefined".

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 中哪些对象具有 .length 属性? (又名为什么 Underscore _.each 将我的函数对象视为数组?) 的相关文章

随机推荐

  • SQL Server DATE 作为字符串检索到 pandas 中

    当我将 日期 变量从 SQL Server 拉入 Python Pandas 时 它作为 对象 出现 我已经安装并尝试了多个驱动程序 代码中显示了尝试过的注释驱动程序 每次都有相同的结果 import pandas as pd import
  • 如何将位图纹理的每个像素渲染到 macOS 上屏幕的每个本机物理像素?

    由于现代 macOS 设备默认选择使用缩放后的 HiDPI 分辨率 位图图像在屏幕上会变得模糊 有没有办法将位图逐像素渲染到显示屏的真实本机物理像素 任何 CoreGraphics OpenGL 或 Metal API 都可以在不改变屏幕显
  • 更改位图的色调,同时保留整体亮度

    我正在尝试编写一个函数 让我可以对位图进行红移或蓝移 同时保留图像的整体亮度 基本上 完全红移的位图将具有与原始亮度相同的亮度 但完全呈红色 即所有像素的 G 和 B 值都相等 蓝色着色相同 但 R 和 G 相等 频谱偏移的程度需要在 0
  • 绝对定位和CSS粘性页脚

    这是我的问题 我使用的布局具有粘性页脚 使用 cssstickyfooter com 方法 在我的容器 div 中 我有一个内容 div 其中包含其他四个 div 像这样 div class container div class cont
  • 何时使用.NET BufferedStream 类?

    The MSDN 网站 http msdn microsoft com en us library system io bufferedstream aspx states 缓冲区是内存中的一个字节块 用于缓存数据 从而减少 拨打运营商电话
  • iBeacon 广告 ID 是否唯一?

    我们正在讨论在跨国多个地点使用 iBeaons 进行大规模部署方案 有人提出的问题是 iBeacons 宣传其存在的 ID 是否是唯一的 因为我们的客户希望真正确保应用程序仅响应特定的 iBeacons 而不响应冒充相同 ID 的其他内容
  • 反转字符串中每个单词中的字母

    我有一个包含空格分隔单词的字符串 我想颠倒每个单词中的字母而不颠倒单词的顺序 我想my string成为ym gnirts 这应该有效 words explode string words array map strrev words ec
  • 在大型数据集上改变窗口大小的滚动平均值

    我想计算向量的滚动平均值 其中窗口随着向量中的每个条目而增长 基本上 我想要所有元素的平均值i th i 1 th i 2 th 依此类推 为了使它更清楚 我将提供一个示例和一个适用于较小数据集但不能很好扩展的解决方案 library zo
  • 来自 application.html.erb 的 Rails 渲染实例变量

    我正在关注 Agile Web Development with Rails 4 这本书 我对渲染的部分感到有点困惑 问题的简单版本是 在 application html erb 文件中它说 render cart 这很令人困惑 因为我认
  • Redis 概念:在内存中还是在数据库中?

    基于http redis io topics faq http redis io topics faq Redis 是一个内存中但持久在磁盘上的数据库 那么我可以知道redis将键 值保存在内存中还是磁盘中 或两者 Redis写入值时 同时
  • 影子根 getElementsByClassName

    我正在使用 LitElement 创建自定义 Web 组件 我对此相当陌生 决定尝试制作图像幻灯片 我用了W3Schools 幻灯片作为参考 https www w3schools com howto howto js slideshow
  • 拟合 Keras 顺序模型给出 ValueError: Failed to conversion a NumPy array to a Tensor (Unsupported object type numpy.ndarray)

    我有以下列表数组 每部电影的演员 partial x train actors array list b victor mclaglen b jon hall b frances farmer b olympe bradna b gene
  • 从多个线程修改休眠实体

    我在理解线程安全的细节时遇到问题Hibernate 我知道Hibernate Sessions它们本身并不是线程安全的 因此我不会从多个线程访问它们 但是 我找不到任何有关 Hibernate 实体的线程安全性的信息 我可以在多个线程中修改
  • 使用@PreAuthorize的多个角色

    检查多个角色是否具有方法级别访问权限 我已经使用 PreAuthorize注释来检查角色 PreAuthorize hasRole AuthoritiesConstants USER 如何使用 PreAuthorize注解检查多个角色 Pr
  • 用于从列表中的根域中删除子域的正则表达式 - Notepad++ 或 Gvim

    我有一个存储在 txt 文件中的 URL 列表 我使用的是 Windows 7 URL 的格式是这样的 somesite1 com somesite2 com somesite3 com sub1 somesite3 com sub2 so
  • IEEE - 754 - 查找符号位、指数、分形、归一化等

    我将 8 位十六进制数作为 IEEE 754 位浮点数 我想打印有关该数字的信息 signbit expbits fractbits 标准化 非规格化 无穷大 零 NAN 浮点应该是单个 我读了位移位 我想这就是我应该做的事情 然而 我并不
  • MvvmCross vnext:与 monodroid 合并插件

    我正在尝试将插件库项目合并为一个项目 例如 Location PhoneCallTask 它与 wp7 完美配合 但我在使用 monodroid 时遇到未处理的异常 无法加载文件或程序集 Cirrious MvvmCross Plugins
  • 无法通过mongo shell连接到mongodb atlas

    我检查过其他类似的帖子 但没有一个适合我的情况 在连接到 MongoDB Atlas 之前 我升级了 mongo shell 从中创建了一个免费的沙箱数据库 我使用以下内容进行连接 这是由 atlas 提供的 mongo mongodb s
  • 使用 awk 命令左外连接多个文件数据

    我有基本文件和多个具有基于基本文件第一个字段的通用数据的文件 我需要包含所有数据的输出文件 由于文件大小需要花费很多时间来输出 我尝试了很多命令 很多次 awk 帮助了我 但我对 awk 数组编程一无所知 例子 基础文件 aa ab ac
  • JavaScript 中哪些对象具有 .length 属性? (又名为什么 Underscore _.each 将我的函数对象视为数组?)

    我的印象是只有Array对象有一个 length财产 但是 话又说回来 我也看到过提到 类似数组 的对象 我还没有研究过这个 现在看来我对 JS 中这个话题的无知可能让我很痛苦 例证 我有以下代码 var View function opt