JavaScript中swap()传值、传引用与函数传参

博客探讨了JavaScript中swap函数在处理值传递和引用传递时的行为。在使用swap函数时,由于JavaScript的对象和数组是通过引用拷贝,导致原始值未发生变化。而直接使用temp交换则能正确实现值交换。在函数传参方面,JavaScript总是按值传递,原始值直接复制,而引用值则是复制指针,指向同一堆内存中的对象,因此对象的改变会体现在所有引用该对象的变量上。

描述:

在二叉树的镜像输出中,利用队列交换左右子树

例子一:利用自己创建的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.leftroot.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.leftroot.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'

变量有按值访问和按引用访问,而参数传递只有按值访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值