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

  基础类型的赋值

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

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

  引用类型的赋值

  1. var a = [1,2,3];
  2. var b = a;
  3. b.push(4,5,6);
  4. 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]

函数按值传参

  1. function setName(obj){
  2. obj.name="nick";
  3. obj=new Object();
  4. obj.name="greg";
  5. }
  6.  
  7. var person=new Object();
  8. setName(person);
  9. 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. mysql使用group_by

    GROUP BY必须得配合聚合函数来用,分组之后你可以计数(COUNT),求和(SUM),求平均数(AVG)等 常用聚合函数 count() 计数 sum() 求和 avg() 平均数 max() 最 ...

  2. host, nslookup, dig、whois

    一.host命令:DNS 查找使用程序 选项与参数: -a :代表列出该主机所有的相关信息,包括 IP.TTL 与除错讯息等等 -l :若后面接的那个 domain 设定允许 allow-transf ...

  3. 006_理解inode

    inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念 ...

  4. 简单的三级联动demo

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. Thread Synchronization Queue with Boost

    介绍:当开发一个多线程程序时,同步是一个很大的问题.如果你的程序需要数据流包,那么用队列是个好办法. 你可以在 http://www.boost.org/ 发现 boost 库和文档,从它的网站可以看 ...

  6. php如何实现图片点击下载,并保存本地?-----本例子为二维码的生成图片,并支持点击下载

    ### 今天因为工作需要,完成了一个二维码的生成图片,并支持点击下载的 ### 控制器文件,相关代码 // 生成二维码 $url = action('Apih5\\VersionController@ ...

  7. JMS消息队列之ActiveMQ简单示例

      废话不多说,在进入主题前先看一张图,对ActiveMQ有个大体的了解:   下面进入主题:   1.添加需要的maven依赖 <!-- active mq begin --> < ...

  8. Linux学习之CentOS(二)--初识linux的一些常用命令

    Linux学习之CentOS(二)--初识linux的一些常用命令 在VM上安装完了CentOS6.4以后,看着linux系统成功跑起来,心里小激动了一把......但是前方学习的道路还很遥远... ...

  9. 不能够连接到主机(名称为localhost)上的MySQL服务”

    不能够连接到主机(名称为localhost)上的MySQL服务” -如果是服务未启动.那么就右键‘计算机’---->管理--->服务和应用程序---->服务,在右侧的栏目中找到名称为 ...

  10. Confluence 6 的系统配置信息的示例

    awt.toolkit sun.awt.X11.XToolkit file.encoding.pkg sun.io java.specification.version 1.8 sun.cpu.isa ...