空数组在以下三种遍历中均不可更改:forEach、map和for...in

首先,我们要知道对于forEach、map和for...in三种遍历,在不是空数组的情况下,要想实现更改原数组的方法,代码如下:

    var list  = [1,2,3,4];
    var list1 = [1,2,3,4];
    var list2 = [1,2,3,4];
    
    list = list.map(function(item){
        return item+1;
    })
    
    list1.forEach(function(item,index,arr){
        arr[index] = item+1
    })
    
    for (var p in list2) {
        list2[p] = 1
    }
    
    console.log(list);  //[2,3,4,5]
    console.log(list1)  //[2,3,4,5]
    console.log(list2); //[1,1,1,1]

对于空数组,我们做同样的处理,看看结果如何;

    var list  = [];
    var list1 = [];
    var list2 = [];
    
    list.length  = 4;
    list1.length = 4;
    list2.length = 4;
    
    list = list.map(function(item){
        return item+1;
    })
    
    list1.forEach(function(item,index,arr){
        arr[index] = item+1
    })
    
    for (var p in list2) {
        list2[p] = 1
    }
    
    console.log(list);  //Array [ <4 empty slots> ]
    console.log(list1)  //Array [ <4 empty slots> ]
    console.log(list2); //Array [ <4 empty slots> ]

在火狐浏览器中,我们可以清楚看到结果:Array [ <4 empty slots> ],可以发现空数组是无法用同样的方法更改原数组的数据的。在菜鸟教程中我们可以找到以下的结论:

1、 map() 不会对空数组进行检测

2、 forEach() 对于空数组是不会执行回调函数的

对于for...in循环为什么不能更改空数组,我们试试以下代码:

    var list  = [];
    list.length  = 4;
    
    for (var p in list) {
        console.log(list[p])
    }

在谷歌火狐等浏览器控制台中,我们无法看到任何数据输出,这是因为for...in无法对空数组进行遍历。

3、通过实践,我们发现for...in循环无法对空数组进行遍历

转载于:https://www.cnblogs.com/hrlin/p/8353550.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 中使用 Map.forEach 在循环中,需要使用 final 修饰的常量数组是因为 forEach 方法使用的是内部迭代器,该迭代器使用了闭包的概念,闭包中可能会引用到外部的变量。如果不使用 final 修饰,则外部的变量可能会被修改,而在闭包中使用的这个变量的值可能会发生变化,这会导致结果的不确定性。因此,为了保证结果的可预测性和程序的正确性,Java 中的 forEach 方法要求使用 final 修饰的常量数组。 ### 回答2: 在Java中使用map.forEach时,循环体内的变量和参数必须是final修饰的常量数组,而不能使用基本类型和包装类型的原因如下: 1. map.forEach方法使用了Lambda表达式,Lambda表达式的特点是闭包,它可以捕获外部的变量。在循环体内部,Lambda表达式可能对外部的变量进行修改,因此外部的变量必须是不可变的,即final修饰的常量。 2. 对于基本类型和包装类型的值,赋值操作实际上是将新值赋给了一个新的变量,而原来的变量仍然指向原来的值。在循环体内部对基本类型和包装类型的变量进行修改操作,相当于修改了新变量的值,而不是原来的变量指向的值。因此,如果在循环体内部修改基本类型和包装类型的值,循环体外部的值不会受到影响。 3. Java中的基本类型和包装类型都是值传递,而不是引用传递。在循环体内部对基本类型和包装类型的变量进行修改,并不会影响到循环体外部的值。因此,为了保证循环体内部对变量的修改能够生效,必须使用final修饰的常量,以保证循环体内外的变量引用的是同一个对象。 综上所述,为了确保在使用map.forEach时,循环体内部对变量的修改生效,仅能使用final修饰的常量数组。这样可以保证循环体内外的变量引用的是同一个对象,从而使得循环体内部对变量的修改能够影响到循环体外部的值。 ### 回答3: 在Java中,当我们在forEach循环内部使用局部变量时,该变量必须是final修饰的常量数组,而不能是基本类型或包装类型。 这是因为forEach循环是通过迭代器来遍历集合,而迭代器在循环中是一个匿名内部类实现的。正常情况下,局部变量在栈上分配内存,当调用方法结束后,栈帧被销毁,局部变量也随之销毁。但是对于匿名内部类来说,它可能会在循环过程中被多次使用,而不像普通局部变量那样只有一次。所以,为了保证在匿名内部类中能够访问到局部变量,Java要求我们将局部变量声明为final,这样在内部类中就能够正确访问了。 但基本类型和包装类型在Java中有一个特点,即它们是值传递。这意味着,当我们将基本类型或包装类型作为参数传递给方法时,实际上传递的是其值的一个副本,而不是对原始值的引用。因此,在forEach循环内部使用final修饰的基本类型或包装类型并没有太大的实际意义,因为它们在循环中使用的是它们的副本,而不是原始值。 综上所述,为了在forEach循环中能够正确访问局部变量,我们需要将其声明为final修饰的常量数组。这样,在循环中我们使用的是该常量数组的引用,而不是对它的拷贝,这样就确保了匿名内部类能够正确访问到这个数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值