首页 > 试题广场 >

var arr=[{a:1},{}];

[单选题]
var arr=[{a:1},{}];
arr.forEach(function(item,idx){
    item.b=idx;
});
上面代码执行后, arr 的值是:()
  • [{a:1},{}]
  • [{a:1,b:0},{b:1}]
  • [{a:1,b:1},{b:1}]
  • [{a:!,b:0},{b:0}]
var arr=[{a:1},{}];
    arr.forEach(function(item,idx){
        item.b=idx;
    });
    console.log(arr);

感觉答案是错的呀,这是chrome执行结果:
图片说明

发表于 2017-08-10 09:24:34 回复(5)
引用類型,儲存在堆內存,指向同一個地址
发表于 2021-04-07 20:46:52 回复(0)
arr中的成员是对象,因此每一个item都是浅拷贝
发表于 2017-09-02 18:46:56 回复(0)
啥玩意?这是is?
发表于 2017-04-10 20:53:12 回复(1)
这是什么意思 求
发表于 2017-02-23 10:14:37 回复(0)
Foreach里面值不会修改的,选A
编辑于 2017-08-10 10:13:25 回复(2)
应该选B。
forEach()方法是对数组中的每一项运行给定函数。
回调函数的参数item为数组当前项,idx为当前索引。
本题就是把数组每一项添加属性b,并且属性b的值为当前项的数组索引值。

另外,forEach()方法没有返回值,所以不能将 arr.foreach()像其他数组迭代方法那样赋值给某一个变量。
编辑于 2017-08-09 21:41:02 回复(3)
arr.forEach(a,b,c)
这个函数用于数组的遍历,其中三个参数abc意义如下
a代表arr[0]---arr[arr.length-1]
b代表0---arr.length-1
c代表arr
//参数c被省略了
所以第一次循环 a={a:1} , b=0;
执行a.b = 0 后,以为a是一个对象,即给对象啊添加一个b属性,值为0 得到[{a:1,b:0},{}]
第二次循环也是这个意思
发表于 2017-08-17 15:45:56 回复(2)
var arr = [{a:1}, {}];
arr.forEach (function (item, idx) {
    item.b = idx;
});
首先,forEach 没有返回值
第一次,item 值为 {a:1}
第一次运行后 item 值为 {a:1,b:0}
第二次,item 值为 {}
第二次运行后 item 值为 {b:1}

item的变化会影响 arr ,因为对象的浅拷贝
发表于 2018-10-11 20:44:54 回复(2)
其实这一题我一开始也迷惑,后来结合基本类型和引用类型值的传递和赋值和对象的深浅拷贝才算明白了。
MDN:
forEach 方法按升序为数组中含有效值的每一项执行一次callback 函数,那些已删除或者未初始化的项将被跳过(例如在稀疏数组上)。

callback 函数会被依次传入三个参数:

  • 数组当前项的值
  • 数组当前项的索引
  • 数组对象本身
就是说forEach里面的匿名函数传入了三个参数,此时这三个参数分别是Object、Number、Array类型。
<你不知道的javaScript中卷>----2.5值和引用
简单值(即标量基本类型值,scalar primitive)总是通过值复制的方式来赋值/ 传递,包括
null、undefined、字符串、数字、布尔和ES6 中的symbol。
复合值(compound value)——对象(包括数组和封装对象,参见第3 章)和函数,则总
是通过引用复制的方式来赋值/ 传递。
就是说如果对值和引用的赋值和传递(在这里是传参),对象是引用类型传参数时是传递的是引用,如果是基本类型时传递的是值,因为(函数中item)指向了{a:1},{},所以进行操作的时候会改变指向的值本身
而基本类型作为参数传递时,其实会创建一个值的副本给参数,这时候再改变参数就是改变这个副本,就影响不到数组本身了。
---------------------------------------------分割线-2020-8.31-----------------------------------------------------
由于这是刚学前端的时候回答的,可能啰里啰嗦的,但是最终学完回来都是想弄懂是什么道理。
1.引用类型和值类型在内存中的存在方式。
2.堆内存和栈内存的区别。
3.参数传递时如果是堆空间变量,两者都是指向同一个地址,比如let person = {name: '张三'};let person1= person; person1.name = '李四',这样person的name属性就发生变化了,因为两者person和person1指向的地址在堆内存当中是同一个。调用一个函数fn(person);给传递参数,等同于给函数的参数赋值。

编辑于 2020-08-31 18:42:17 回复(1)
foreach本身不改变数组,但执行item.b=idx;数组被改变,foreach本身并没有对数组进行排序赋值
发表于 2018-08-13 17:58:47 回复(0)
这么看 var aa={a:1}; var arr=[aa,{}]; foreach语句相当于给,aa对象和{}空对象添加一个属性b,值是当前索引! 这样答案就出来了
发表于 2018-10-12 22:43:24 回复(0)
发表于 2017-08-28 11:52:58 回复(0)
foreach()为数组的每一个元素调用一次方法并且返回一个新数组。在arr【】有俩个元素,{a:1}和{}。因为元素是对象,方法中相当于为对象添加一个b属性并且值为当前的索引,执行俩次。{a:1}.b=0就等于{a:1,b: 0}
发表于 2022-05-25 01:29:21 回复(0)
forEach() 被调用时,不会改变原数组,也就是调用它的数组(尽管 callback 函数在被调用时可能会改变原数组)。(译注:此处说法可能不够明确,具体可参考EMCA语言规范:'forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.',即 forEach 不会直接改变调用它的对象,但是那个对象可能会被 callback 函数改变。)
发表于 2021-12-22 16:00:18 回复(1)
//idx表示数组的索引,item.b=idx;表示给数组里面的每一个对象添加一个b属性,值为他的下标。
发表于 2019-07-19 14:01:22 回复(0)
本题forEach()就是把数组每一项添加属性b,并且属性b的值为当前项的数组索引值。
另外,forEach()方法没有返回值,所以不能将 arr.foreach()像其他数组迭代方法那样赋值给某一个变量。

编辑于 2024-03-12 12:53:45 回复(0)
这里的item表示的是对象(认为是数组的value值),而IDX其实就是我们熟知的index,为对象添加一个b属性并把对象所在数组中的index值作为b属性的值
发表于 2023-11-13 16:33:31 回复(0)
传入的参数类型: item:对象object 传引用 idx:索引num 传值 赋值时,对象在堆中的存储添加了b属性 注意,foreach本身并没有返回值,但是在这里arr自身发生了改变,也就是foreach中的callback允许数组改变 需要区分map,创建了一个新数组存储处理的数组并返回,原数组不受影响
发表于 2023-03-27 23:52:14 回复(0)
对数组元素进行浅拷贝
发表于 2022-11-14 20:52:04 回复(0)