当数组定义为3时,Javascript-forth值的神秘工作不会返回异常

当数组定义为3时,Javascript-forth值的神秘工作不会返回异常,javascript,Javascript,下面的代码在javascript中运行良好 var items = [1,2,5] for (var i = 0, item; item = items[i]; i++) { console.log(item = items[i]); } OUTPUT : 1 2 5 我不确定这个计划是如何成功运作的 第四项未定义,在最后一次迭代中将发生什么 我们能用Java创建类似的函数吗 最后的项目[3]在上述功能中如何处理 首先要做两件关键的事情: 首先,在JavaScript中,每当您尝试检索不

下面的代码在javascript中运行良好

var items = [1,2,5]
for (var i = 0, item; item = items[i]; i++) {
  console.log(item = items[i]);
}

OUTPUT : 1 2 5
  • 我不确定这个计划是如何成功运作的

  • 第四项未定义,在最后一次迭代中将发生什么

  • 我们能用Java创建类似的函数吗

  • 最后的项目[3]在上述功能中如何处理


  • 首先要做两件关键的事情:

    首先,在JavaScript中,每当您尝试检索不存在的对象属性(包括数组条目)的值时,检索的结果就是值
    未定义

    第二,当您使用一个像标志这样的值时,比如在
    if
    语句中,或者在
    for
    (或任何其他循环)的
    的“test”部分中,JavaScript会使用“强制”来表示您过去使用的布尔值。[这不同于(比如)Java,它要求您只使用
    布尔
    变量作为这类标志。]因为JavaScript会这样做,而且会出现很多问题,所以我们使用术语“truthy”(强制为
    )和“false”(强制为
    )对值进行分类。“falsey”值是
    0
    NaN
    null
    未定义,当然还有
    false
    ;所有其他价值观都是真实的

    好的,有了这些信息,让我们看看你的循环:

    1. i = 0; item = 1; i = 1;
    2. item = 2; i = 2;
    3. item = 5; i = 3;
    4. item = undefined; --> breaks the loop
    
    第四项未定义,在最后一次迭代中将发生什么

    只有三次迭代。
    语句的
    由三个用
    分隔的表达式组成,以及循环体。表达式包括初始化、测试和增量:

    循环的计算方式如下:

  • 进行初始化
  • 做测试
  • 如果测试为假,则终止
  • 做身体检查
  • 做增量
  • 返回步骤2
  • 循环的
    的“测试”部分是
    item=items[i]
    ,这是一个赋值。赋值表达式的值就是要赋值的值。因此,当
    i
    3
    时,该赋值为
    item=items[3]
    ,这实际上是
    item=undefined
    。该赋值的值
    未定义
    ,这是一个错误的值,因此循环体不会第四次运行

    我们能用Java创建类似的函数吗

    是的,除了Java之外,它看起来几乎相同,您使用了一个带有变量的类型,并且您不能(仅仅)使用
    item=items[i]
    作为
    for
    的“测试”部分(出于同样的原因,您会在下面得到一个异常)

    项目[3]
    最后,在上述功能中如何处理

    你的问题没有任何作用。在循环之后,在JavaScript中,访问
    项[3]
    会得到
    未定义的
    (见上文)。在Java中,它会导致一个
    ArrayIndexOutOfBoundsException


    旁注:此行中的
    =
    是一个赋值,而不是一个比较:

    console.log(item = items[i]);
    
    如果要比较它们,请执行以下操作:

    console.log(item == items[i]);
    
    …这将为您提供输出

    true true true 符合事实的 符合事实的
    正确首先要做两件关键事情:

    首先,在JavaScript中,每当您尝试检索不存在的对象属性(包括数组条目)的值时,检索的结果就是值
    未定义

    第二,当您使用一个像标志这样的值时,比如在
    if
    语句中,或者在
    for
    (或任何其他循环)的
    的“test”部分中,JavaScript会使用“强制”来表示您过去使用的布尔值。[这不同于(比如)Java,它要求您只使用
    布尔
    变量作为这类标志。]因为JavaScript会这样做,而且会出现很多问题,所以我们使用术语“truthy”(强制为
    )和“false”(强制为
    )对值进行分类。“falsey”值是
    0
    NaN
    null
    未定义,当然还有
    false
    ;所有其他价值观都是真实的

    好的,有了这些信息,让我们看看你的循环:

    1. i = 0; item = 1; i = 1;
    2. item = 2; i = 2;
    3. item = 5; i = 3;
    4. item = undefined; --> breaks the loop
    
    第四项未定义,在最后一次迭代中将发生什么

    只有三次迭代。
    语句的
    由三个用
    分隔的表达式组成,以及循环体。表达式包括初始化、测试和增量:

    循环的计算方式如下:

  • 进行初始化
  • 做测试
  • 如果测试为假,则终止
  • 做身体检查
  • 做增量
  • 返回步骤2
  • 循环的
    的“测试”部分是
    item=items[i]
    ,这是一个赋值。赋值表达式的值就是要赋值的值。因此,当
    i
    3
    时,该赋值为
    item=items[3]
    ,这实际上是
    item=undefined
    。该赋值的值
    未定义
    ,这是一个错误的值,因此循环体不会第四次运行

    我们能用Java创建类似的函数吗

    是的,除了Java之外,它看起来几乎相同,您使用了一个带有变量的类型,并且您不能(仅仅)使用
    item=items[i]
    作为
    for
    的“测试”部分(出于同样的原因,您会在下面得到一个异常)

    项目[3]
    最后,在上述功能中如何处理

    你的问题没有任何作用。在循环之后,在JavaScript中,访问
    项[3]
    会得到
    未定义的
    (见上文)。在Java中,它会导致一个
    ArrayIndexOutOfBoundsException


    旁注:此行中的
    =
    是一个赋值,而不是一个比较:

    console.log(item = items[i]);
    
    如果要比较它们,请执行以下操作:

    console.log(item == items[i]);
    
    …这会给你