zoukankan      html  css  js  c++  java
  • JavaScript中函数参数的值传递和引用传递

    结论:对于数字、字符串等是将它们的值传递给了函数参数,函数参数的改变不会影响函数外部的变量。

            对于数组和对象等是将对象(数组)的变量的值传递给了函数参数,这个变量保存的指向对象(数组)的地址。当函数改变这个地址指向的对象(数组)的内容时,同时也改变了函数外部变量指向的对象(数组)的内容;当函数改变的是变量的地址时,实际就与函数外部的变量失去了联系,变成了完全不同的对象了,不会对函数外部对象造成改变。

     

    很多人认为 JS 中参数有两种传递方式:数字、字符串等按值传递;数组、对象等按地址(引用)传递。其实都是一种值传递。下面的例子很好的说明了这一点。

    var v1 = []
    var v2 = {};
    var v3 = {};
    function foo(v1, v2, v3)
    {
        v1 = [1];
        v2 = [2];
        v3 = {a:3}
    }

    foo(v1, v2, v3);
    alert (v1); // 空白 
    alert (v2); // [object Object] 
    alert (v3.a); // undefined

    由此可见:v1、v2、v3 都没有被改变,v1 仍然是零个元素的数组,v2、v3 仍然是空白的对象。

    但是,数组、对象等按值传递,是指变量地址的值。

    数组、对象等的按值传递与数字、字符串还是有所不同的。数字、字符串是把值直接复制进去了,而数组、对象是把变量地址复制进去的。

    前面我们让 v1、v2、v3 作为参数进入函数后,就有了地址副本,这些地址副本的指向和外面的 v1、v2、v3 的地址指向是相同的。但我们为 v1、v2、v3 赋了值,也就是说我们把地址副本的指向改变了,指向了新的数组和对象。这样内部的 v1、v2、v3 和外部的 v1、v2、v3 就完全断了。

    如果我们不赋新值,而是直接操作它,那么,它操作到的,仍然是和外面的 v1、v2、v3 指向的同一块数组或对象。

    var v1 = []
    var v2 = {};
    var v3 = {a:0};
    function foo(v1, v2, v3)
    {
        v1.push (1);
        v2.a = 2;
        v3.a = 3;
    }

    foo(v1, v2, v3);
    alert (v1); // 1 
    alert (v2.a); // 2 
    alert (v3.a); // 3
  • 相关阅读:
    10 种保护 Spring Boot 应用的绝佳方法
    Redis 如何分析慢查询操作?
    Spring Boot 主类及目录结构介绍
    Redis 再牛逼,也得设置密码!!
    Spring Data Redis 详解及实战一文搞定
    Spring Boot Redis Cluster 实战干货
    超详细的 Redis Cluster 官方集群搭建指南
    Redis Linux 安装运行实战全记录
    hdu 4790 Just Random (思路+分类计算+数学)
    poj 1328 Radar Installation(贪心)
  • 原文地址:https://www.cnblogs.com/Magiccwl/p/7053976.html
Copyright © 2011-2022 走看看