1.forEach和map的相同点
都是数组的方法
都是用来遍历数组
两个函数都有4个参数:匿名函数中可传3个参数item(当前项),index(当前项的索引),arr(原数组),还有一个可选参数this
匿名函数中的this默认是指向window的
对空数组不会调用回调函数
不会改变原数组(某些情况下可改变)
2.forEach
(1)没有返回值
var a=[1,2,3,4,5]
var b=a.forEach((item)=>{
item=item*2
})
console.log(b)//undefined
(2)可改变原数组的情况
var a=[1,2,3,4,5]
a.forEach(item)=>{
item=item*2
}
console.log(a)//[1,2,3,4,5]
这里的原数组并没有发生改变
var a=[1,'1',{num:1},true]
a.forEach((item,index,arr)=>{
item=2
})
console.log(a)//[1,'1',{num:1},true]
这里修改item值,依然没有修改原数组
var a=[1,'1',{num:1},true]
a.forEach((item,index,arr)=>{
item.num=2
item=2
})
console.log(a)//[1,'1',{num:2},true]
当修改数组中的对象的某个属性时,发现属性改变了。
为什么会这样呢?
这里就要引入栈(stack)内存和堆(heap)内存的概念了,对于JS中的基本数据类型,如String,Number,Boolean,Undefined,Null是存在于栈内存中的,在栈内存中储存变量名及相应的值。而Object,Array,Function存在于堆内存中,在堆内存中储存变量名及引用位置。
在第一个例子中,为什么直接修改item无法修改原数组呢,因为item的值并不是相应的原数组中的值,而是重新建立的一个新变量,值和原数组相同。
在第二个例子中,数组中的对象的值也没有改变,是因为新创建的变量和原数组中的对象虽然指向同一个地址,但改变的是新变量的值,即新对象的值为2,原数组中的对象还是{num:1}。
在第三个例子中,由于对象是引用类型,新对象和旧对象指向的都是同一个地址,所以新对象把num变成了2,原数组中的对象也改变了。
想要修改原数组
var
a = [1,2,3,4,5]
a.forEach((item, index, arr) => {
arr[index] = item * 2
})
console.log(a)
// [2,4,6,8,10]
在回调函数里改变arr的值,原数组改变了。
这个例子和例三其实同理,参数中的arr也只是原数组的一个拷贝,如果修改数组中的某一项则原数组也改变因为指向同一引用地址,而如果给参数arr赋其他值,则原数组不变。
其实想要知道参数中的item和arr是不是重新创建的变量,在回调函数中打印就知道了。
(3)vue中的应用
在处理数据中,因为数组的传递已json格式,经常会收到数组中包含许多对象的数据,而后端传给我的数据有时候需要处理。例如把事件戳格式化为正常事件,代码如下:
//utils.js
const formatTime = date => {
var
newDate =
new
Date();
newDate.setTime(date * 1000);
const year = newDate.getFullYear()
const month = newDate.getMonth() + 1
const day = newDate.getDate()
const hour = newDate.getHours()
const minute = newDate.getMinutes()
const second = newDate.getSeconds()
return
[year, month, day].map(formatNumber).join(
'-'
) +
' '
+ [hour, minute, second].map(formatNumber).join(
':'
)
}
const formatNumber = n => {
n = n.toString()
return
n[1] ? n :
'0'
+ n
}
export {
formatTime
}
// 得到的数据格式
[
{add_time: 1541495677, balance: 14, bn:
"300708"
, cprice:
"12.39"
}
]
// index.vue
import axios from
'axios'
import { formatTime } from
'@/lib/utils'
export
default
{
data() {
dataList: []
},
methods: {
getData() {
axios.get(
'/user?ID=12345'
)
.then(
function
(res) {
if
(res.code == 200) {
res.data.forEach((item) => {
item.add_time = formatTime(item.add_time)
}
this
.dataList = res.data
}
})
.
catch
(
function
(err) {
console.log(err);
});
}
}
}
export
default
{
data() {
moneyList: [1000,2000,5000,10000,20000,50000]
},
computed: {
moneyList_new() {
return
this
.moneyList.map((item) => {
const random = Math.random() > 0.5 ? 1 : -1;
return
Math.floor(Math.random()*100) * random + item;
})
}
}
}