首先说下,在js中有两大类数据类型: 基本类型和引用类型. 其次,基本类型有5种: Undefined,Null,Boolean,Number、String, 引用类型有一种: Object(Function 和 Array都属于对象,在js中,一切皆对象);

  基础类型的赋值

var a = 1;
var b = a;
b = 2;
console.log(a); //

  分析以上代码,初始化变量a为1,然后将a赋值给变量b,再将2赋值给变量b,变量a和变量b属于简单类型,存储在桟中,分别存着1和2,相互之间没有影响.

  引用类型的赋值

var a = [1,2,3];
var b = a;
b.push(4,5,6);
console.log(a); // [1,2,3,4,5,6]

  分析以上代码,初始化变量a为[1,2,3],然后将a赋值给变量b,变量a和变量b属于引用类型,存储在堆中,他们存着相同的值(0x****),他们的值其实一个指针地址(指向堆中存放的[1,2,3]),  然后将[4,5,6]添加到变量b,b所指的那个对象现在变为[1,2,3,4,5,6],因为a和b指向同一个对象,因此a的值也为[1,2,3,4,5,6]

函数按值传参

function setName(obj){
obj.name="nick";
obj=new Object();
obj.name="greg";
} var person=new Object();
setName(person);
alert(person.name); //"nick"

  书中给的例子是以上代码.用反证法证明,假设person是按引用传递的参数,则在函数中name属性已经被赋值“greg”,所以结果应该为greg才对.

  正是因为person是按值传递,才出现以上结果.person传进函数的是指向person对象的地址(0x****),将这个地址值赋值给形参obj(函数实参和形参都指向同一个对象), obj.name="nick"; 执行完后形参和实参person所指的那个对象中的name属性被修改为nick,此操作会影响到全局的person,obj=new Object();执行完后形参指向一个新的堆内存地址,跟实参没有任何关系了,也就跟全局的person所指向的对象没有任何关系了,obj.name="greg";将形参所指的局部对象的name属性修改为greg,此操作对全局的person对象不会再有影响,形参所指向的对象在函数执行完被销毁.全局打印person.name为nick.

  

js 函数参数为什么是按值传递?的更多相关文章

  1. (转)js函数参数设置默认值

    原文:http://www.cnblogs.com/RightDear/archive/2013/06/26/3156652.html js函数参数设置默认值   php有个很方便的用法是在定义函数时 ...

  2. javascript中所有函数参数都是按值传递

    在看<JavaScript高级程序设计>(第三版)的时候,传递参数这一节,里面提到 ECMAScript中所有函数的参数都是按值传递的 它自己的解释是, 把函数外部的值复制给函数内部的参数 ...

  3. js函数参数设置默认值

    php有个很方便的用法是在定义函数时可以直接给参数设默认值,如: function simue ($a=1,$b=2){  return $a+$b;}echo simue(); //输出3echo ...

  4. js 函数参数形式

    1. var a = function(b,c){ console.log(arguments);}a("1","cc"); ->  ["1&q ...

  5. JS 函数参数

    1.简单的无参函数调用 function Test1(Func) { Func(); } function Test2() { alert("我要被作为函数参数啦!"); } // ...

  6. JS函数参数

    1.js不是面向对象,不可以重载函数.如果两个函数方法名相同,参数不同,那么js加载时后面的函数会覆盖前面的函数. 所以调用函数时只会调用后面的方法. 2.js设置可变参数时,可以用arguments ...

  7. js 函数参数 arguments[0]

    function box() {            return arguments[0] + '|' + arguments[1];                    }        al ...

  8. js函数参数理解

    eg: function setName(obj){ obj.name = "Nicholas"; obj = new Object(); obj.name = "Gre ...

  9. 关于 js 函数参数的this

    先看一道面试题: var number = 10; function fn() { console.log(this.number); } var obj = { number: 2, show: f ...

随机推荐

  1. python3.7 contextvars在asyncio使用的

    from contextvars import ContextVar import asyncio import random cv = ContextVar('cv') async def wait ...

  2. Python os.access() 方法

    概述 os.access() 方法使用当前的uid/gid尝试访问路径.大部分操作使用有效的 uid/gid, 因此运行环境可以在 suid/sgid 环境尝试. 语法 access()方法语法格式如 ...

  3. css3 - 旋转的木马

    参考资料: 张鑫旭  : http://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-trans ...

  4. Mysql 通过frm&ibd 恢复数据

    mysql存储在磁盘中,各种天灾人祸都会导致数据丢失.大公司的时候我们常常需要做好数据冷热备,对于小公司来说要做好所有数据备份需要支出大量的成本,很多公司也是不现实的.万一还没有做好备份,数据被误删除 ...

  5. Spring Cloud Sleuth超详细实战

    为什么需要Spring Cloud Sleuth 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元.由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去 ...

  6. 36)django-jsonp跨域

    一:什么是JSONP JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 serve ...

  7. TeamLab安装及使用

    http://blog.csdn.net/crazin/article/details/9529061 最近想装个项目管理管理系统方便项目管理,调研了下这方面开源的软件还是比较多的,国内的有禅道,试用 ...

  8. js数组的实例方法sort() 排序方法的运用,不再只是.sort()

    1, sort() 不传回调函数的话,默认按照字母顺序(字符编码)的顺序进行排序. 2, sort() 通过传回调函数来控制从小到大的排序还是从大到小的排序: var arr = [1,23,5,6, ...

  9. MONGODB数据基础与命令

  10. linux和windows下,C/C++开发的延时函数,sleep函数

    简介: 函数名: sleep   功 能: 执行挂起一段时间   用 法: unsigned sleep(unsigned seconds);   在VC中使用带上头文件   #include < ...