描述:
例子一:利用自己创建的swap函数
var mirrorTree = function(root) {
let queue = [root]
if(!root) return null
while(queue.length){
let node = queue.shift()
if(node.left) queue.push(node.left)
if(node.right) queue.push(node.right)
swap(node.left, node.right)//利用自己创建的swap函数
return root
};
const swap = (a,b) => {
let temp = a
a = b
b = temp
}
结果:
输入:
[4,2,7,1,3,6,9]
输出
[4,2,7,1,3,6,9]
预期结果
[4,7,2,9,6,3,1]
原因:
输出完全没有变化,这是因为在JavaScript中,复合值——对象(数组和封装对象)和函数总是通过引用拷贝的方式来赋值/传递。引用拷贝,swap函数传进去的是 root.left 和 root.right 的引用拷贝,所以不改变原来的指向,即原有的完全不变
例子二:直接利用temp交换
var mirrorTree = function(root) {
let queue = [root]
if(!root) return null
while(queue.length){
let node = queue.shift()
if(node.left) queue.push(node.left)
if(node.right) queue.push(node.right)
//
let temp = node.left
node.left = node.right
node.right = temp
}
return root
};
结果:
输入
[4,2,7,1,3,6,9]
输出
[4,7,2,9,6,3,1]
预期结果
[4,7,2,9,6,3,1]
原因:
输出正确,这里操作的是真正的 root.left 和 root.right
函数传参
function test(person){
person.age = 26
person = {
name : 'hzj',
age: 18
}
return person
}
const p1 = {
name: 'fyq',
age: 19
}
const p2 = test(p1)
console.log(p1)
console.log(p2)
结果:
p1: {name : 'fyq',age: 26}
p2: {name : 'hzj',age: 18}
原因:
ECMAscript中所有函数的参数都是按值传递的。这意味着函数外的值会被复制到函数内部的参数中,就想从一个变量复制到另一个变量一样。
- 如果是原始值,那么就和原始值复制一样。通过变量把一个原始值赋值到另一个变量时,原始值会被复制到新变量的位置。
let num1 = 5
let num2 = num1
此时num1、num2都为5,而且两个变量可以独立使用,互不干扰
- 如果是引用值,那么就和引用值复制一样。在把引用值从一个变量赋给另一个变量时,存储在变量中的值也会被复制到新变量所在的位置。区别在于,这里复制的值实际是一个指针,它指向存储在堆内存中的对象。操作完成后,两个变量实际指向同一个对象,因此一个对象上面的变化会在另一个对象上反映出来
let obj1 = new Object()
let obj2 = obj1
obj1.name = 'mike'
console.log(obj2.name)//'mike'
变量有按值访问和按引用访问,而参数传递只有按值访问
博客探讨了JavaScript中swap函数在处理值传递和引用传递时的行为。在使用swap函数时,由于JavaScript的对象和数组是通过引用拷贝,导致原始值未发生变化。而直接使用temp交换则能正确实现值交换。在函数传参方面,JavaScript总是按值传递,原始值直接复制,而引用值则是复制指针,指向同一堆内存中的对象,因此对象的改变会体现在所有引用该对象的变量上。

2914

被折叠的 条评论
为什么被折叠?



