关于 js 函数返回值的一个小问题

2020-04-24 09:58:55 +08:00
 ynohoahc

也算是吃前端这碗饭吃了一年多了, 但是今天遇到个基础问题解决不了, 很惭愧 因为公司网络,不能外网传文件(图片), 我就用伪代码稍微代替一下我的问题场景

function test(list) { list = list.slice(1) }

a = [0,1,2,3,4,5] test(a)

这样子我预想 a 应该是等于[1,2,3,4,5]了, 但实际上还是[0,1,2,3,4,5]

2860 次点击
所在节点    问与答
45 条回复
zhouS9
2020-04-24 15:14:00 +08:00
list 和 a 指向同一个地址,使用 splice 这种方法,就会同时改变两者,但是 slice 不行
AnnaXia
2020-04-24 17:56:33 +08:00
写了个解释希望有说清楚,v2ex 的回复不显示别人回答内容,看起来太累了。不 @楼上正确解答的朋友了

a = [0,1,2,3,4,5] // a 指向数组 [0,1,2,3,4,5]
function test(list) 并调用 test(a) // test 也指向数组 [0,1,2,3,4,5]
list.slice(1) // slice 方法不改变原数组,生成一个新的数组 [1,2,3,4,5]
list = list.slice(1) // list 指向改变,变为指向数组[1,2,3,4,5]
test(a)后 console.log(a) // a 指向未变,原数组也没变,所以依然是 [0,1,2,3,4,5]

楼里有人建议 splice 或 pop,这个方案可行是因为改变了原数组 [0,1,2,3,4,5],
a 指向未变,原数组改变为[1,2,3,4,5],所以可以得到想要的结果。
AnnaXia
2020-04-24 17:58:53 +08:00
@AnnaXia 啊,中间写错了,第 2 行是“list”也指向数组 [0,1,2,3,4,5]。

本来注释有空格保持些距离的,忘了 V2EX 编辑框不是所见即所得了,难受,也不能撤回再编辑
autoxbc
2020-04-24 18:58:03 +08:00
JS 里只讲原始值和对象值,不讲指针,内存地址,乱用概念只会造成歧义和误解
lewinlan
2020-04-25 00:28:15 +08:00
没遇到过用 slice 拷贝数组的写法吗?
特别是现在前端各种数据绑定设计,类似的拷贝用法应该很常见才对。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/665550

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX