从JS的变量复制看JS的参数传递

变量的复制:

基本类型:从一个变量向另一变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新的变量分配的位置上

 1 console.log(" 基本类型:");
 2 var num1=1;
 3 var num2=num1; //此时num1=1,num2=1,这是两个完全独立的变量,互不影响,只是值相等而已
 4
 5 console.log("   before copy --> num1:"+num1+" , num2:"+num2);
 6 //输出 before copy --> num1:1 , num2:1
 7
 8 num1="change"; // 改变 num1 的值
 9
10 console.log("   after copy --> num1:"+num1+" , num2:"+num2);
11 //输出 after copy --> num1:change , num2:1

解析:独立变量 互不影响

引用类型:从一个变量向另一变量复制引用类型的值,会在变量对象上,创建一个新值,然后把该值复制到为新的变量分配的位置上,

     不同的是,这个副本和原来的变量都是一个指针,指向堆内存中同一个对象

1 console.log(" 引用类型:");
2 var obj1=new Object();
3 var obj2=obj1; // 此时 obj1 和 obj2 是两个独立的引用,只是指向同一个地方而已
4
5 obj1.name="Guang Zai";// 改变 name 的值
6
7 console.log("   obj2.name:"+obj2.name);
8 //输出: obj2.name:Guang Zai

解析: 更改 obj1.name 的值,即更改 obj1 指向的那个地方的 name 属性的值,obj2 也指向同一个地方,因此读取 obj2 的 name 必然是更改后的结果

函数的参数传递:

在js中,所有函数的参数都是按照值传递的,也就是说:把函数外部的值复制给函数内部的参数,

就和把值从一个变量复制到另一个变量一样,复制过程按照基本类型和引用类型对应的变量复制过程,

按值传递 按值传递 按值传递 按值传递 按值传递 按值传递 按值传递 按值传递 按值传递 按值传递 按值传递 按值传递 按值传递 按值传递 按值传递 按值传递

基本类型:

 1 function changeString(str){
 2     str+=": add something in the function"
 3     return str;
 4 }
 5
 6 console.log(" 基本类型:");
 7 var str="str";
 8 var str_return=changeString(str);
 9 console.log("   str_return:"+str_return+" , str:"+str);
10 // 输出:str_return:str: add something in the function , str:str

解析:基本类型按值传递,传进去的参数与外面的变量互相独立,互不影响

引用类型:

1 console.log(" 引用类型:");
2 function setName(obj){
3     obj.name="Guang Zai";
4     obj=new Object();
5     obj.name="guang";
6 }
7 var person=new Object();
8 setName(person);
9 console.log("   person.name:"+person.name);//输出: "Guang Zai"

// 解析:函数外部创建一个对象person,然后调用setName函数传递参数

// 此时按照传递参数的过程,把person的值复制一份后传递给参数obj

// 使得obj的引用与person指向同一个对象

/*

other -----> {其他对象}

obj -----》 【对】

person -----》 【象】

*/

// 然后进入函数内部:

// obj.name="Guang Zai"; person.name也等于"Guang Zai" 因为此时 obj 的引用与 person 指向同一个对象

// obj=new Object(); 此时obj指向另一个对象,person依然指向原来的对象

// 因此obj之后的修改对person无影响,所以函数外部person.name="Gaung Zai"

// setName函数执行完成后,obj对象会被立即销毁

// 拓展分割线:----------------------------------------------------------------------

// js中引用类型作为参数传递和java不一样

// java中引用类型作为参数传递时,传递的是该对象的引用

// 传递的是引用 传递的是引用 传递的是引用 传递的是引用 传递的是引用 传递的是引用 传递的是引用 传递的是引用 传递的是引用 传递的是引用 传递的是引用

// 那上面的例子来说,参数传递后应该是下面这样:

/*

other -----> {其他对象}

【对】

obj,person -----》 【象】

*/

// 然后进入函数内部:

// obj.name="Guang Zai"; person.name也等于"Guang Zai"

// obj=new Object(); 此时obj指向另一个新的对象,person也指向那个新的对象

// 因为他们的引用是同意引用,因此对obj的修改就是对person的修改

// setName函数执行完成后,obj对象和person的name属性都是 “guang”,而不是原来的 ”Guang Zai“

原文地址:https://www.cnblogs.com/go4it/p/9678352.html

时间: 2024-10-15 17:41:45

从JS的变量复制看JS的参数传递的相关文章

PHP和JS中变量作用域

一,PHP中变量作用域 对于大多数PHP的变量只有一个作用域.在用户自定义函数里采用局部变量作用域.所有的函数内使用的变量被设置为局部变量.例如: <?php $a=1; function test() { echo $a; } test(); ?> 这段程序不会输出任何的东西因为echo语句要输出局部变量 $a ,而函数内的 $a 从未被赋过值.你可能注意到和C语言有点小小的区别,C中全局变量可以直接在函数内引用,除非它被一个局部变量所覆盖.因为这使得人们可能不注意修改了全局变量的值.在PH

js 对象深复制,创建对象和继承

js 对象深复制,创建对象和继承.主要参考高级编程第三版,总结网上部分资料和自己的代码测试心得.每走一小步,就做一个小结. 1.对象/数组深复制 一般的=号传递的都是对象/数组的引用,如在控制台输入 var a=[1,2,3], b=a; b[0]=0; a[0] 此时显示的结果为0,也就是说a和b指向的是同一个数组,只是名字不一样罢了. 单层深复制: 1.js的slice函数: 返回一个新的数组,包含下标从 start 到 end (不包括该元素,此参数可选)的元素. 控制台输入: var a

js中变量名提升和函数名提升

首先,js中变量没有块级作用域,但是有函数作用域,即只有函数可以约数变量的作用域. 并且,函数的实质也是一个变量,所以可以改变它的值,即赋值.所以变量名提升和函数名提升非常相像. 1.变量名的提升发生在函数内部.看下面的例子.说明:第一个因为弹出undefined,相当于在上面定义了var num;因为函数内部,定义了var num=20:就相当于在一开始定义了var num;这就是变量名的提升. var num = 10; function func() { alert(num); //und

笔记——JS的对象复制

JS的对象复制-- Js的Number类型和String类型都不是地址引用,而是重新创建对象复制值:var a = 1;var b = a;b = 2;alert(a);结果:1 var c = "abc";var d = c;d = "def";alert(c);结果:abc 只有对象类型才是地址引用的:var a = {x:1};var b = a;b.x = 2;alert(a.x);结果:2 所以复制对象不要用"=",而是遍历对象复制对象

JS 点击复制Copy插件--Zero Clipboard

写博客就是一周工作中遇到哪些问题,一个好处就是可以进行一个总结,另外一个好处就是下次遇到同样的问题即使那你记不住,也可以翻看你的博客解决了.同样也可以帮到别人遇到与你一样问题的人.或者别人有比你更好的解决办法,可以一起讨论,分析出更好的解决方法.所以这是个好习惯.既然是好习惯,那就得坚持. 但是想写好一篇博客好像不是那么容易的,因为你得有问题,不然你写什么,手放在键盘上不知道敲啥.或者是你自己主动学习了,对你的学习进行了总结.然后你得有得写. 这周公司同事分享的<贝叶斯方法>对我的感触挺大的.

关于JS中变量提升的规则和原理的一点理解

????关于变量提升,以前在一些教程和书籍上都听到过,平时开发中也知道有这个规律,但是今天突然在一个公开课中听到时,第一反应时一脸懵逼,然后一百度,瞬间觉得好熟悉啊,差点被这个概念给唬住了,不信我给你看个栗子,你也会恍然大悟的: (function(){ console.log(v); var v = 'I love you'; console.log(v); })() // undefined I love you ????这就是一个典型的变量提升的例子了,规则是怎样的呢,我的理解是在一个作用

04 js的变量以及变量的运算

js的变量声明和数据类型 1.js中所有的变量都是用var来声明 js中的变量名是区分大小写的 js中的字符串可以使用双引号和单引号 js不会报错的,所以要仔细排除哪里写错了,尤其是中英文标点问题 js中可以声名同名变量,后面的会将前面的值覆盖 2.js中变量的数据类型 number型 String型 boolean型 true为1 false为0可以用来进行运算 null :它实际上是object型,用来赋值给变量声明其应该用来专门接受对象 object型 undefined型 :没有赋值的变

js的变量,变量作用域,作用域链

变量声明: 使用var关键字声明,如果使用没有声明的变量,则JS会自动声明此变量根据变量作用域.如果变量只声明为赋值,则此时值是undefined.重复声明变量,在JS不会报错,会依据最后一次的声明来处理变量. 变量作用域: 一个变量的作用域是,程序代码定义这个变量的区域,全局变量在程序代码内任何地方都可以访问. 包括在{}函数,对象内的变量(属性)成为局部变量. 在函数体内定义的变量成为局部变量,作用域也是局部,函数参数也是局部变量. 他们只在函数体内有意义. 在函数体内,局部变量优先于全局变

JS基础变量、运算符和分支结构

[使用JS的三种方式]   1.HTML标签中内嵌JS(不提倡使用):   <button onclick="javascript:alert('小婊子,真点啊!')">有本事点我呀</button>   2.HTML页面中直接使用JS:   <script type="text/javascript">   //JS代码  </script>   3.引用外部JS文件:   <script language=&