js基础问题

发布于 2022-09-17 23:18:49 字数 607 浏览 22 评论 0

想知道下面三种写法结果不同的原因,希望大佬能帮忙解答下

let arr=[
    {
        name:'小明',
        age:12
    }
]
let a= arr.map(item=>{
     item['sex']='男'
})
console.log(a)//[null]
///////////////////////////////////
let arr1=[
    {
        name:'小明',
        age:12
    }
]
arr1.map(item=>{
     item['sex']='男'
})
let a1= arr1
console.log(a1)//[{'name':'小明','age':12,'sex':'男'}]
//////////////////////////////////
let arr2=[
    {
        name:'小明',
        age:12
    }
]
let a2= arr2.map(item=>{
     item['sex']='男'
     return item
})
console.log(a2)//[{'name':'小明','age':12,'sex':'男'}]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

深巷少女 2022-09-24 23:18:49

实现一个简易的map函数

Array.prototype.myMap = function (callback, thisArg) {
    const newArr = [];
    for (let i = 0; i < this.length; i++) {
        newArr.push(callback.call(thisArg ?? window, this[i], i, this))
    }
    return newArr
}

这里我写了一个缩略版的map函数,核心功能就这些

map执行流程

  • 创建一个新数组
  • 循环原数组,逐个元素处理后push到新数组中
  • 返回这个新数组

问题解答

  1. 第一个在回调中没有返回值,新数组中push的是undefined
  2. 第二个同样也没有返回值,返回结果与第一个相同,但是原数组发生了变化,这是因为在callback.call()中的参数是对原数组的浅拷贝,操作的时候会改变原数组
  3. 第三个回调中有返回值,每次循环都会把操作后的结果push到新数组,数组在调用map会返回操作后的新数组赋值给a2
葬花如无物 2022-09-24 23:18:49

这里主要是考察map的用法,https://developer.mozilla.org..., array.map(fn)遍历array,返回值是一个数组,该数组的每个值都是array对应的值经过fn处理后的【返回的结果】
首先我们来看你的示例1,fn是处理了item,但是没有抛出任何返回值,所以a的结果是[undefined](我在浏览器里面打印的是这个,不是你示例中的[null])

let arr=[
    {
        name:'小明',
        age:12
    }
]
let a= arr.map(item=>{
     item['sex']='男' // 这里只是处理,但是没有返回,且arr本身是被改了的
})
console.log(a)//[null]

示例2,跟上例相同,fn处理了item,但是没有返回,且arr1被改动,此时你二次将arr1赋值给a1,a1自然改变了

let arr1=[
    {
        name:'小明',
        age:12
    }
]
arr1.map(item=>{
     item['sex']='男'
})
let a1= arr1
console.log(a1)//[{'name':'小明','age':12,'sex':'男'}]

示例3,就是map的标准用法,fn返回了item,被a2接收,所以可以正常打印值

三岁铭 2022-09-24 23:18:49

就值传递和函数返回的问题。

如果不是引用类型就不会改变。

https://zhuanlan.zhihu.com/p/...
引用类型Object: Array ,Function, Date, RegExp等

var arr = [1,1,1,1,2]
arr.map(item=>{
item=3;
})
console.log(arr);
 [1, 1, 1, 1, 2]

var arr = [[1],[1],[1],[1],[2]]
arr.map(item=>{
item[0]=3;
})
console.log(arr);
[[3],[3],[3],[3],[3]]

函数返回,如果你不return 值就是 undefined了。

温柔戏命师 2022-09-24 23:18:49

简单的说,map里面如果不return,他就是一个for循环;如果return,那就是把return的东西组成了一个新的数组。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文