JavaScript中的对象功能如何工作?

时间:2013-04-14 06:42:47

标签: javascript

我正在学习JavaScript,目前我无法理解的是下面这个例子。使用in检查右侧对象中是否存在项目。

此代码会将用户选项合并为默认选项。

令我感到困惑的是i未在任何地方定义,那么它如何知道i是什么?
如果我在i块内打印出for,则会列出我对象的每个option

我已阅读MDN's article about the in operator,但它没有解释这种未定义变量的处理。

var i;
for(i in options) {
  if(i in this.options) {
    this.options[i] = options[i];
  } else {
    throw new Error("Notice doesn't support option: " + i);
  }
}

3 个答案:

答案 0 :(得分:2)

有两种不同的“in”:

代码中的第一个in不是in运算符。它是一个For ... in循环,它遍历一个对象的键,将每个键分配给变量,在本例中为i

您的代码中的第二个in是您已经阅读过文档的oner。返回true或false的运算符。

注意:除非您在该函数范围中有var i,否则您要在循环中省略i关键字来声明全局变量var。你最想要的是:

for(var i in options){

答案 1 :(得分:2)

这不是for ... in运算符特有的结果。

每次尝试分配给未定义的变量时,都会creates a global variable of that name。全局变量是window对象的属性,因此您可以按如下方式观察此行为:

for (i in [0]) {
    alert(window.i); // displays "0"
}
i = 0
alert(window.i); // displays "0"

然而,这被认为是语言中令人遗憾和令人困惑的错误特征;大多数情况下,您不需要或不需要全局变量。强烈建议不要依赖此行为,并且'use strict'var i作为函数脚本的第一行,它甚至无法正常工作。

在第一次分配变量之前或之后,您应始终使用for(var i in options) { if(i in this.options) { this.options[i] = options[i]; } else { throw new Error("Notice doesn't support option: " + i); } } 来声明变量。

{{1}}

答案 2 :(得分:1)

  

让我感到困惑的是i没有在任何地方定义,所以如何定义   它知道i是什么?

你可以做这样的事情

for(var i in options) {
  if(i in this.options) {
    this.options[i] = options[i];
  } else {
    throw new Error("Notice doesn't support option: " + i);
  }
}

现在正在定义。

进一步解释

for(<variable to hold the value on every loop> in <collection>)

JavaScript for/in statement 循环遍历对象的属性