2

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

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

令我困惑的i是没有在任何地方定义,那么它怎么知道i是什么?如果我在块内
打印出来,它会列出我的每个对象。iforoption

我已经阅读了 MDN 关于in操作符的文章,但它没有解释这种对未定义变量的处理。

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);
  }
}
4

3 回答 3

2

有两种不同的“入”:

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

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

注意:除非您之前在该函数范围内,否则您通过在循环中省略关键字var i来声明全局变量。您很可能想要:ivar

for(var i in options){
于 2013-04-14T06:46:45.553 回答
2

这不是for ... in运营商的具体结果。

每当您尝试分配给未定义的变量时,它都会创建该名称的全局变量。全局变量是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);
  }
}
于 2013-04-14T06:47:49.337 回答
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>)

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

于 2013-04-14T06:46:07.047 回答