zoukankan      html  css  js  c++  java
  • JavaScript是按值传递还是按引用传递?

    JavaScript是按值传递的,但是要分情况才知道传递之后原来的值会不会变,不然会出现你想都想不出来的bug

    一、按值传递--元类型输入
    tip:元类型( number, string, boolean, null, undefined ) 传入的参数,无论函数内部怎样对其操作,调用传入的变量都不会受影响。
    例如:

    var arr = [1, 2, 3, 4]
    var str = '1234'
    
    function guangboticao7 (input) {
    input = input + '5678'
    console.log('时代在召(zhaò)唤', input)
    return input;
    }
    
    console.log('第七套广播体操', guangboticao7(str), str);

    输出值为 时代在召(zhaò)唤 12345678

    二、按值传递--引用类型输入
    又要分两种情况
    1.当函数内部对其property(属性)做修改时,调用传入的变量会受影响,被改变!!!如下面代码的第八套广播体操,push(在末尾添加数组,返回索引号)传入的arr数组,arr会被改变。

    2.当函数内部对arr为其重新赋值,即newValue!==oldValue(完全不相等),传入外部变量不会受影响,即不会被改变!!!如下面代码的第九套广播体操,arr为[1, 2, 3, 4, [5, 6, 7, 8]]时,函数内部重新赋值了,arr不会被改变,仍然输出[1, 2, 3, 4, [5, 6, 7, 8]]。且concat拼接数组,返回一个新数组。

    例子代码:

    var arr = [1, 2, 3, 4]
    
    function guangboticao8 (input) {
    return input.push([5, 6, 7, 8])
    }
    
    function guangboticao9 (input) {
    input = '2234'
    return [input].concat([5, 6, 7, 8])
    }
    
    console.log('第八套广播体操', guangboticao8(arr), arr)
    //输出 "第八套广播体操" 5 [1, 2, 3, 4, [5, 6, 7, 8]]
    
    console.log('第九套广播体操', guangboticao9(arr), arr)
    // "第九套广播体操" ["2234", 5, 6, 7, 8] [1, 2, 3, 4, [5, 6, 7, 8]]

    总结:js是按值传递,但是以防混淆,通常分为三种情况
    1.元数据类型为传递值时,当当内部函数对传递值做了任何的修改,都不会改变其外部的传递值。
    2.引用数据类型为传递值时,当内部函数对传递值做了属性修改,即push(),unshift(),concat(),pop(),shift(),splice(),slice(),reverse(),sort()就会使得传递值改变。
    3.引用数据类型为传递值时,当内部函数对传递值重新赋值,即使得newValue!==oldValue(完全不相等),传递值不会被改变。

    练习题:

    var liLei = { name: 'Li Lei'}
    var hanMeimei = { name: 'Han Meimei'}
    var jim = {name: 'Jim' }

    var students = [ liLei, hanMeimei ]

    function change (s) {
    s[0] = jim;
    s[1].name = 'Lucy'
    }

    change(students);

    console.log(students)
    console.log(liLei)
    console.log(hanMeimei)
    console.log(jim)

    结果是??!!!!

     
    作业结果

    参照知乎:https://zhuanlan.zhihu.com/p/24080761

  • 相关阅读:
    GO语言网络编程
    GO语言测试
    GO语言反射
    GO语言strconv包的使用
    GO语言并发
    Centos7 开启swap分区
    设计模式 之 命令模式
    设计模式 之 代理模式
    设计模式 之 工厂模式
    设计模式 之 观察者模式
  • 原文地址:https://www.cnblogs.com/echo-hui/p/9217207.html
Copyright © 2011-2022 走看看