关于 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 条回复
shintendo
2020-04-24 10:14:44 +08:00
list 是局部变量,你在函数里给 list 赋值毫无意义。这应该是编程常识吧,跟 js 没什么关系
max21
2020-04-24 10:16:56 +08:00
function test(list) { return list.slice(1) }
hewelzei
2020-04-24 10:22:24 +08:00
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
slice() 是返回新的数组,不改变原来的数组,应该仔细看看 MDN 文档,补充一下基础知识
mc201319
2020-04-24 10:23:54 +08:00
你这里是把 a 的值当做参数穿进去的,list 只是和 a 的值相同,他们的指针已经完全不同了
Vegetable
2020-04-24 10:23:58 +08:00
@shintendo #1 是因为这个?不是因为 slice 不是 in place 的?
slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括 end )。原始数组不会被改变。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

你这个需求应该是 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
Array.prototype.splice

```Javascript
function test(list) {
list.splice(0, 1)
}
const a = [0, 1, 2, 3, 4, 5]

test(a)
console.log(a)
//[ 1, 2, 3, 4, 5 ]
```
Vegetable
2020-04-24 10:24:23 +08:00
拜托,我只是一个后端,都知道这个,前边的大哥都在干什么?
Vegetable
2020-04-24 10:26:28 +08:00
@Vegetable #6 哦是我理解出现了偏差,楼上说的没错,楼主困惑的应该是为什么赋值没有生效

这我也不知道怎么解释了...
LyleRockkk
2020-04-24 10:27:08 +08:00
吃前端这碗饭一年多了...
maichael
2020-04-24 10:27:54 +08:00
@Vegetable #7 很好解释,js 函数传参都是值传递,外面的 a 和里面的 list 实际上处理值相同之外没什么关系。
wszgrcy
2020-04-24 10:29:54 +08:00
请加参数前面加& (滑稽)
LyleRockkk
2020-04-24 10:30:15 +08:00
LZ 应该是 想通过一个 function 改变 外部定义好的 a 的值,不过还是基础问题,不管在 function 内部,还是外部,都要有对 a 赋值的过程,才能改变 a
b821025551b
2020-04-24 10:31:21 +08:00
你这一年多的工作经历是切图么
leoskey
2020-04-24 10:31:46 +08:00
这里是 值传递,拷贝一份 a 传到 list,所以 a 和 list 是不同的。
TomVista
2020-04-24 10:32:58 +08:00
@Vegetable emm,上面讲的也有道理的,,另外 list = list.slice(1) 这个东西因为命名的原因语义并不太清楚,理解的不一样很正常
icebreaker12
2020-04-24 10:36:10 +08:00
其实利用浅拷贝把 a 改成对象就能实现了。

function test(list) { list.arr = list.arr.slice(1) }
var a = { arr:[0,1,2,3,4,5] };
test(a);
max21
2020-04-24 10:37:07 +08:00
@leoskey 对象都是引用传递的,这里没变化主要还是 slice 这个函数不改变原始值,所以 a 没变化,仅此而已
CharmanderS5
2020-04-24 10:37:35 +08:00
两个数组引用的地址不用 所以原数组不会被改变
ynohoahc
2020-04-24 10:38:18 +08:00
@LyleRockkk #8 哈哈哈 划水了一年多
ynohoahc
2020-04-24 10:39:17 +08:00
@b821025551b #12 哎 心灰意冷 实际上切图都不会切 都直接拿 UI 的
shintendo
2020-04-24 10:42:30 +08:00
@Vegetable 因为楼主写的是 list = list.slice(1)而不是 list.slice(1),所以我默认楼主知道这不是 in place 的

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

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

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

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

© 2021 V2EX