首先说下,在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. Session、LocalStorage、SessionStorage、Cache-Ctrol比较

    1.Session Session是什么? 服务器通过 Set-Cookie给用户一个sessionIdsessionId对应 服务器 内的一小块内存每次用户访问服务器的时候,服务器就听过Sessio ...

  2. WINDOWS系统中常用网络命令及命令实例详解

    一.查询DNS.IP,mac地址及DHCP服务的情况 二.查看ARP表:MAC地址与IP地址的映射表 三.查看共享资源 四.查看局域网内的主机名 五.查看用户列表  六.路由跟踪命令 七.查看共享资源 ...

  3. iptables防火墙端口操作

    1.将开放的端口写入iptables中,在终端中输入命令: /sbin/iptables -I INPUT -p tcp --dport -j ACCEPT 2.保存上一步的修改内容,输入命令: /e ...

  4. 遇到一个json解码失败的问题

    今日批量导入游戏, 从别人接口拉去的字符串json_decode总是失败, 但是把log里面记录的解码失败的字符串copy出来单独解析,却可以成功. 排除了是字符编码的问题后, 还是不行, 百思不得其 ...

  5. canvas - 简单画板

    截图: Demo:Demo 上代码:. <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  6. 003_crlf注入漏洞

    一. (1) 线上收到一个crlf 注入的漏洞. 同时启用80和443才会暴露,配置如下: server { listen 80; listen 443 ssl; server_name www.jy ...

  7. MybatisGenerator生成的mapper 少了识别主键的方法 byPrimaryKey()

    生成的文件缺少红线标注的类似方法 添加 <property name="useInformationSchema" value="true"/>即可 ...

  8. Ubuntu升级GCC到gcc4.8

    http://www.qtcn.org/bbs/apps.php?q=diary&a=detail&did=1456&uid=139371Ubuntu最新gcc版本在ppa:u ...

  9. Java替换中使用正则表达式实现中间模糊匹配

    使用“.+?”实现中间模糊匹配的代码: public class Test { public static void main(String[] args) { String str="总会 ...

  10. 小白6步搞定vue脚手架创建项目

    1.安装node及npm node -v (测试node是否安装成功)npm -v(测试npm是否安装成功) 2.安装cnpm npm install -g cnpm --registry=http: ...