【问题标题】:NodeJS [].forEach undefinedNodeJS [].forEach 未定义
【发布时间】:2016-05-07 11:12:06
【问题描述】:

我在 NodeJS 中遇到了 [].forEach 的奇怪问题。

(使用 NodeJs v5.4.1)

将这段代码放在函数中

function _buildUserQuestionsForDisplay(question,callback){
    var res = {}
    ["is_open","created","deleted","_id"].forEach(function(v){
        res[v] = question[v]
    })
   ...
   ...
}

抛出错误:

["is_open","created","deleted","_id"].forEach(function(v){

TypeError: 无法读取未定义的属性“forEach”

如果我将代码更改为

var arr = ["is_open","created","deleted","_id"];
arr.forEach(function(v){
    res[v] = question[v]
})

我在Chrome.console 上测试了相同的功能,第一种方法有效。
我知道两者都使用V8 JS 引擎,这是一个错误还是我在 Javascript 规则中缺少的东西?

谢谢!

【问题讨论】:

  • Node 是否也会因该代码的独立最小版本而失败?您是否正在使用任何可能会更改 Array.prototypeObject.prototype 的模块?
  • 如果你在var res = {}后面加一个分号,那么它会起作用吗?
  • @Andy 你是对的,我觉得有点愚蠢,如果我换行,Javascript 编译器应该原谅这一点,不是吗?
  • @robertklep 好吧,这是事实,添加分号确实解决了它。顺便说一句,使用 VisualStudio for mac(太棒了!),也许那里有 newLine 字符
  • @DanielKrom 我删除了我的评论,因为 Node 在没有分号的情况下确实失败了,这对我来说是相当意外的(并且使我的评论无效=)

标签: javascript node.js v8


【解决方案1】:

如果您在此行之后没有分号,则您的代码会中断:

var res = {}

为了尽量减少这些问题,一个好主意是使用 linter(如果您不使用 linter)。 JSHintESLint 都可以作为开发插件添加到您的代码编辑器(我使用 ESLint 和 SubmlimeText 中的 Airbnb 样式表),也可以使用 Gulp 或 Grunt 添加到您的工作流程中,以便在您之前捕获这些类型的错误提交代码。

如果您选择在可能的情况下省略分号,我的建议是在任何以这些标记之一开头的语句或任何以算术运算符标记之一开头的语句中的左括号或方括号之前插入它们“/ "、"+" 或 "-",如果你碰巧写了这样的语句。 - blog entry by Michaeljohn Clement 2010

【讨论】:

  • 谢谢!顺便说一句,我正在使用 Visual Studio for mac 编辑器(Mac 的伟大 NodeJS 编辑器,优于 9000% CPU NetBeans)但也许微软在换行符上做错了,编译器不喜欢
  • 我认为“某种原因”是没有分号的代码正在尝试访问空对象的“_id”属性,这当然是未定义的并且没有forEach() 方法。
  • @nnnnnn 据我所知;我的代码正在做下一件事(例如){a:5}["a"] //5{a:5}["b"] //undefined,然后我正在做 forEach,这正是你为 _id 键所描述的
  • 是的,这与错误的换行符或 Node 作为环境无关。相反:这是 ASI 在 JS 中的预期行为。 var res = {}[ indexer ].forEach(...) 是语法上有效的表达式,因此没有插入分号来打破它。
猜你喜欢
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2018-06-06
  • 2019-01-02
相关资源
最近更新 更多