为什么新的 javascript 数组有“未定义”条目?

2024-01-14

下面是一个示例,演示了一个数组,当您填充该数组时,它也会获取其中所有类型的未定义条目。

这是在 firefox 19.0/firebug 上发生的,不确定在其他浏览器上是否也会发生。

基本流程:

  1. 对象已初始化(最底层)
  2. 它调用“负载”
  3. 当ajax加载返回时,data.objects包含一个json对象数组。该数组上没有未定义的条目。
  4. setObjects 被调用,其中来自 ajax 调用的所有对象都被复制到 this.objects。
  5. 当它们被复制时我可以看到不明确的条目显示在 firebug 中,如果我没有再次传递数组并拼接出未定义的条目,那么在尝试访问模板中数组的元素时,它会破坏胡子。

为什么 javascript 会自动填充 this.objects 数组不明确的条目?

这是代码:

function MailerFromProfile( )
{
    // privileged
    this.objects = [];
    this.load( );
}

MailerFromProfile.prototype.setObjects = function( objects )
{
    for( var i in objects )
    {
        if( 'undefined' !== objects[ i ] )
        {
            this.objects[ objects[ i ].id ] = objects[ i ];
        }
    }
    // I should not have to do this:
    for( var i = 0; i < this.objects.length; i++ )
    {
        if( typeof this.objects[ i ] === 'undefined' )
        {
            this.objects.splice( i, 1 );
            i--;
        }
    }
}

MailerFromProfile.prototype.setTemplate = function( n, v )
{
    this.template[ n ] = v;
}

MailerFromProfile.prototype.load = function( )
{
    jQuery.post(
        MAILER_PATH,
        { session: MAILER_SESSION,
          object : 'from_profile',
          action : 'list'
        },
        function( data )
        {
            if( typeof data.objects !== 'undefined' )
            {
                g_mailer_from_profiles.setObjects( data.objects );
            }
        },
        'json' );
}

var g_mailer_from_profiles = new MailerFromProfile( );

为什么 javascript 会自动用未定义的条目填充 this.objects 数组?

事实并非如此,但看起来可能是这样。 :-)

关键是您要像这样设置数组条目:

this.objects[ objects[ i ].id ] = objects[ i ];

……显然,objects[ i ].id有时大于数组中的条目数。

标准 JavaScript 数组根本不是一个真正的数组 http://blog.niftysnippets.org/2011/01/myth-of-arrays.html(除非由 JavaScript 引擎优化),1 它是一个对一些事情进行特殊处理的对象。

让我们举一个更简单的例子:

var a = [];            // An empty array
console.log(a.length); // 0
a[3] = "foo";          // Puts an entry at index 3
console.log(a.length); // 4

正如您所看到的,如果您写入超出数组末尾的数组条目,则length数组的索引被调整为比您写入的索引高1。

但是 JavaScript 不会用以下命令“填充”数组undefined;该数组是sparse https://en.wikipedia.org/wiki/Sparse_matrix。条目位于a[0], a[1], and a[2] 不存在:

console.log(1 in a);   // false

但是如果你向数组询问不存在的条目,你会得到undefined:

console.log(a[1]);     // undefined

...就像您在请求不存在的属性时对任何其他 JavaScript 对象所做的那样(因为数组“元素”实际上是对象属性,而数组“索引”实际上是属性名称)。

That's 不同的来自实际存在的具有该值的条目undefined,这也是可能的:

a[1] = undefined;
console.log(1 in a);   // true
console.log(a[1]);     // undefined

所以 Mustache 正在循环遍历数组0 to length - 1并询问条目,其中一些条目不存在,导致undefined.

这是上面各种代码片段的可运行版本:

var a = [];            // An empty array
console.log(a.length); // 0
a[3] = "foo";          // Puts an entry at index 3
console.log(a.length); // 4

console.log(1 in a);   // false

console.log(a[1]);     // undefined

a[1] = undefined;
console.log(1 in a);   // true
console.log(a[1]);     // undefined

这是一个很长的说法,您可能需要将该行更改为:

this.objects.push(objects[ i ]);

1 这是我乏味的旧博客上的一篇文章。

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

为什么新的 javascript 数组有“未定义”条目? 的相关文章

  • JavaScript 对输入的循环创建一个对象数组

    我正在尝试循环 div 中的输入元素 以创建对象数组 div div
  • 使用通过 (document.getElementById('ID')) 添加到数组的元素

    为什么这段代码不起作用 var all obj element new Array all obj element 0 document getElementById Img3 alert all obj element 0 style w
  • 如果列表中的某个字符位于该字符之前,请选择该字符

    我有这个正则表达式 a z s gmi 该正则表达式选择 从我的文字中 sme a eliezovce 2015 Spolo ne pre Eur pu Osl vili aj 940 但我只想选择 没有 如果列表中的某些字符 a z 之前
  • WebPack 源映射令人困惑(重复文件)

    我决定在我今天正在启动的一个新项目上尝试 WebPack 并且我从源映射中得到了非常奇怪的行为 我在文档中找不到任何相关信息 在浏览 StackOverflow 时也找不到其他人遇到此问题 我目前正在查看由以下公司制作的 HelloWorl
  • JavaScript 原型继承和 html canvas

    我是一名 Ruby 开发人员 最终决定认真学习 JavaScript 所以我买了一些书 开始深入研究 但当我试图理解原型继承时 我很快就陷入了困境 这本书的例子之一如下 给定一个 Shape 其原型有一个绘制方法 以及两个子形状 一个 Tr
  • AngularJS 和 Apiary.IO - 无法读取任何响应标头?

    我使用 Apiary io 模拟我的 API 但不知怎的 我无法使用 angularJS 从响应对象中读取任何标头 我确信我至少通过检查 firebug 正确设置了 Content Type application json Angular
  • 动态添加jinja模板

    我有一个 jinja 模板 它是一组 div 标签内的唯一内容 div include temppage html div 当我按下按钮时 我想用其他内容替换标签之间的所有内容 我希望用另一个 jinja 模板 include realpa
  • 移动浏览器上的 Javascript / jQuery 页面更改事件

    我正在设计一个移动网站 同时考虑所有领先的浏览器 Safari Chrome Dolphin Opera 我想显示一个 正在加载 元素页面导航 更改 请求新页面 我无法在锚标签上使用点击事件 因为有很多锚标签存在preventDefault
  • Firebase 模拟器无法促进/运行新功能

    我有三个云功能 其中两个已部署到我的 firebase 项目中 其中一个是我刚刚添加的 我希望在部署之前在本地测试新的功能 但是当我尝试使用它时却无法使用 并且只有两个已部署的功能可用 Firebase 模拟器在端口上运行良好5001 像往
  • 如何使用 CSS 或 javascript 创建圆角

    复制 使用 CSS 创建圆角的最佳方法是什么 https stackoverflow com questions 7089 what is the best way to create rounded corners using css 7
  • 匹配 JavaScript RegEx 中的不可见字符

    我有一些包含不可见字符的字符串 但它们位于可预测的位置 通常 围绕我想要提取的文本片段 然后在第二次出现之后我想保留文本的其余部分 我似乎不知道如何关闭隐形字符 and将它们从我的结果中排除 为了匹配隐形 我一直在使用这个正则表达式 xA0
  • 如何在 JavaScript 中检查未定义的变量

    我想检查变量是否已定义 例如 以下内容会引发未定义的错误 alert x 我怎样才能捕获这个错误 在 JavaScript 中 null是一个对象 不存在的事物还有另一种价值 undefined DOM 返回null对于几乎所有无法在文档中
  • 如何在正则表达式中区分数字和ip地址?

    例如 如果我们查看 5 56 和 183 55 0 144 基本上 当你做这样的事情时 d d 它匹配 5 56 189 55 和 0 144 有没有办法通过正则表达式仅匹配数字而不匹配 ip 地址的部分 我尝试使用前瞻 但我不知道它应该是
  • 如何使用 ui-router 中的 ui-sref 将参数传递给控制器

    我需要传递和接收两个参数到我想要转换到的状态ui srefui router 的 例如使用下面的链接将状态转换为home with foo and bar参数 a Go to home state with foo and bar para
  • Firefox CSS 旋转与 Chrome 旋转不同

    我想制作一个 3D 矩形 平行六面体 用户可以用箭头移动它 它在 Chrome 中工作得很好 但在 Firefox 中 一些转换 实际上很多 与 Chrome 不同 看着this https jsfiddle net 7273yur9 2
  • ExpressJS - 提供通用 Nuxt 应用程序和 AngularJS SPA

    我有一个具有以下结构的博客项目 服务器 用 Node Express 编写 管理员 AngularJS SPA public AngularJS SPA 目前 管理部分和公共部分具有相同的域 但管理部分使用不同的子域 这允许我在 Expre
  • 谷歌浏览器不显示一个网站的alert()弹出窗口

    我正在开发一个 javascript 循环 该循环会随着循环的进行而提醒每个键值 为了加快速度 我选中了 阻止此页面创建其他对话框 框 通常这只会抑制一个例程的弹出窗口 但它们还没有回来 在 Google Chrome 中 alert 消息
  • 如何使用正则表达式解析 OCC 选项符号?

    OCC 选项符号由 4 部分组成 标的股票或 ETF 的根代码 用空格填充至 6 个字符 到期日期 6 位数字 格式为 yymmdd 期权类型 P 或 C 用于看跌或看涨期权 执行价格 为价格 x 1000 前面填充 0 至 8 位数字 举
  • angularjs 将 ngModel 从包装器指令传递到包装器指令

    我是 Angular 的新手 但仍然痛苦地纠结于自定义指令 我想重用这段 HTML
  • 如何连接/组合两个数组以连接成一个数组?

    我正在尝试将 JavaScript 中的 2 个数组合并为一个 var lines new Array a b c lines new Array d e f 这是一个简单的例子 我希望能够将它们组合起来 这样当读取第二行时 数组中的第四个

随机推荐

  • 使用 IntentService 进行线程同步

    我正在尝试创建一个通过意图服务发出 HTTP 请求的应用程序 我需要应用程序等待服务完成其运行 即 让请求返回一些数据 然后再继续其操作 因为其操作涉及对我希望从 HTTP 请求接收的数据的操作 我已经尝试了多种方法 Semaphore C
  • iPhone 开发中的 Objective-C 属性

    Objective C 中属性和实例变量有什么区别 我需要用 OOP 术语来理解这一点 属性声明只是一个用于访问实例变量的便利包装器 在实现中使用 synthesize 吗 thanks 代码牛仔 属性和 ivars 是两个完全不同的东西
  • 在 Datagridview 中显示数据库搜索结果

    我在 Windows 窗体应用程序 c 中使用 Visual Studio 2013 和 SQL Server 2012 作为数据库 我想在一个中显示我的查询搜索结果DataGridView public void customerSear
  • 从命令行远程运行 Jmeter

    是否可以在本地计算机上没有 Jmeter 客户端的情况下在远程服务器上运行 Jmeter 我的意思是我可以从命令提示符在远程计算机上运行 jmeter bat 吗 这样它就可以在远程服务器上运行测试并将结果存储在那边的listener jt
  • Swift:使用闭包的枚举?

    我正在创建一个应用程序 可以将无限数量的规则应用于无限数量的节点 我计划使用核心数据作为数据存储 并在节点和规则之间创建简单的一对多关系 在 Objective C 中 我可能会为每个规则创建类并让它们符合协议 NSArray ruleCl
  • 覆盖主题 bootstrap 4 中的默认 $border-radius-lg 变量

    我在我的项目中使用 bootstrap 4 框架 我通过覆盖核心变量来主题化 如果我调整网格变量 它们会起作用 但是如果我尝试更新 border radius lgvar 没有发生任何改变 默认的 border radius lg尺寸仍在使
  • 在 asyncData Nuxt.js 中传递数据

    我是 nuxt js 的新手 我想问是否有任何方法可以在 asyncData 中传递数据 这是代码
  • 在 MVC 剃刀回发后保持下拉菜单选择状态?

    在 MVC 4 Web 中 我有包含以下示例代码的下拉列表 Html DropDownList Condition2 new SelectList Model Makes CCultureId CTitle All new class sp
  • 项目错误:QT 中的未知模块:多媒体

    我正在尝试编译qGo https github com pzorin qgo 安装后qt5 git clone https github com pzorin qgo git cd qgo qmake make sudo make inst
  • NumPy - 删除包含相同元素的子数组

    假设我有以下 4 x 3 x 3 数组 array 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 71 1 1 1 71 1 52 2 2 2 2 2 2 2 2 2 我想按以下标准过滤此类数组 将每个 3
  • 从 mediawiki api ios 过滤数据

    我使用 action query prop revisions rvprop content keywords format json redirects API 来获取有关 Anil Ambani 的详细信息 作为回应 我得到了以下内容字
  • 从 SQL Server 全文索引中获取前 n 个最新条目

    我在 SQL Server 2008 R2 数据库中有一个表 Article Id art text Id 是主键 art text 有全文索引 我搜索包含 house 一词的最新文章 如下所示 SELECT TOP 100 Id art
  • 如何使用 ViewPropertyAnimator 将 Width 设置为特定值

    如何使用 ViewPropertyAnimator 设置视图宽度 我可以缩放或平移 见下文 但无法设置为特定宽度 frame 1 animate scaleX 5 scaleY 5 start 但没有 frame 1 animate wid
  • 有没有办法在node.js客户端将字节数组转换为blob对象

    有没有办法从字节数组客户端获取 blob 对象而无需实际下载文件 我想传递 blob 对象的客户端 gt request get api get video blob d1 d2 d3 end err res gt if err conso
  • ASP.NET MVC 3 用户身份验证

    进行简单用户验证 帐户登录 的常用方法有哪些 另外 每个区域可以有不同的身份验证方案吗 Edit 我正在创建一个电子商务网站 需要为每个用户提供受保护的操作 那么我们该如何去做呢 它需要能够只允许经过身份验证的用户访问他们的信息 在 MVC
  • 如何获取URL中最后一个斜杠之前和倒数第二个斜杠之后的字符串[重复]

    这个问题在这里已经有答案了 如果我有一个如下所示的 URL http www example test1 test2 test3 http wwww example test1 test2 test3 我怎样才能检索字符串test3从上面的
  • JNI Hello World 不满意链接错误

    这是我第一次尝试 JNI 我的最终目标是让当前在计算机上运行的所有任务 但需要运行一个简单的示例 当我尝试执行主程序时 我不断收到此错误 我已经提供了我的简单 Java 主程序 生成的头文件和错误 我不知道这个DLL可能依赖什么 它最初引用
  • 使用自定义库运行 Robot Framework 测试用例时,如何解决“NameError:全局名称 'x' 未定义”错误?

    在 Robot Framework 中运行测试用例时 我看到 NameError 全局名称 x 未定义 错误 以下是我的自定义库文件 根据 Bryan Oakley 的评论进行修改 import re def pass fail crite
  • 如何 grep 查找包含斜杠的字符串?

    我应该如何 grep 查找包含正斜杠的字符串 例如 正斜杠在 grep 中不是特殊字符 但可能在 sed Ruby 或 Perl 等工具中出现 不过 您可能想逃避字面上的句点 而且逃避斜杠也没有什么坏处 这应该适用于所有情况
  • 为什么新的 javascript 数组有“未定义”条目?

    下面是一个示例 演示了一个数组 当您填充该数组时 它也会获取其中所有类型的未定义条目 这是在 firefox 19 0 firebug 上发生的 不确定在其他浏览器上是否也会发生 基本流程 对象已初始化 最底层 它调用 负载 当ajax加载