事情是这样的,有一天,林逍遥同学在学js的时候,想要用js写一个swap函数,她是这么写的:
但是结果输出来之后,她发现事情并没有这么简单:a还是等于1,b还是等于2.
她赶紧翻了一下《Javascript高级程序设计》,发现里面有一段话:
- ECMAScript中所有函数的参数都是按值传递的。
- 传递基本类型的值时,被传递是值会被复制给一个局部变量(即命名参数)。
- 传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反应在函数的外部。
原来如此,已知a,b是两个基本类型的变量,当把a,b传入swap函数的时候,会生成两个新的局部变量,分别存储a,b的值,也相当于它们的副本,虽然值跟a,b是一样的,但在内存中的地址却是不同的,所以在swap函数里面做的改变并不会影响a,b的值,也就谈不上交换了。
综上所述,不可能写一个swap函数来交换两个基本类型的值。
综上所述,不可能写一个swap函数来交换两个基本类型的值。
不过对于引用类型的值(数组,对象),却是可以通过函数改变它们的值的。
当把person复制给xy时,同样也会把存储在person中的值复制一份给xy,不过,person存储的值并不是一个对象,而是这个对象的地址(也就是指针),因此复制的其实是地址值。复制操作结束后,person和xy将指向内存中的同一个地址。
所以在xy上做的改变。也会反映到person上面。
评论
发表评论