ECMAScript中所有函数的参数都是按值传递的。也就是说把函数外部的值复制给函数内部的参数(内部参数的值的修改不影响实参的值)。

基本类型变量的复制:

基本类型变量的复制,仅仅是值复制,num1和num2的5是完全独立的。:

var num1 = 5;
var num2 = num1;

基本类型值(Undefined,Null,String,Number,Boolean)的传递如同基本类型变量的复制一样:

	function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
console.log(count); // 20,没有变化
console.log(result); // 30

引用类型变量的复制:

引用类型变量的复制,复制的值其实是一个指针,而这个指针指向存储在堆中的一个变量,所以复制后obj1和obj2指向同一个堆中的变量。

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "limengyi";
console.log(obj2.name); //"limengyi"

引用类型值(Undefined,Null,String,Number,Boolean)的传递如同引用类型变量的复制一样:

	function setName(obj){
obj.name= "limengyi";
}
var person = new Object();
setName(person);
console.log(person.name); // "limengyi"

在这个函数内部,obj和person引用的是同一个对象。

有很多开发人员错误地认为:在局部作用域中修改的对象会在全局作用域中反应出来,就说明参数是按引用传递的。

下面的例子可以证明对象是按值传递的:

1	function setName(obj){
2 obj.name= "limengyi";
3 obj = new Object();
4 obj.name = "lee";
5 }
6 var person = new Object();
7 setName(person);
8 console.log(person.name); // "limengyi" 而不是"lee"

实际上,当在函数内部重写obj时,这个变量(obj)引用的就是一个局部对象了。

(假设第6行的变量person和第2行的变量obj引用的是堆中的对象A,那第3行开始的变量obj引用的就是堆中的对象B了。)


更深一层

对象变量之间的赋值是传址赋值,例:

	var student1={"name":"张三"};
var student2=student1; //传!址!赋!值! student1和student2指向同一个对象
student2.name="李四";
console.log(student1.name); //"李四" 不再是"张三"
console.log(student2.name); //"李四"

而在ES6中新增的一个关键字const(用于声明常量,类似于关键字var),它声明的变量值不可变,例:

	var Name = "张三";
Name = "李四"; //报错,企图修改常量Name

而如果常量是一个对象的情况:

	const Student = {"name":"张三"};
Student.name = "李四";
Student.age = 21;
console.log(Student); //{name:"李四",age:21} 变!了!

这其实和上面的引用类型值的传递很像,在这里不可修改的是对象在内存中的地址,而不是对象本身。

综合引用类型值的传递和关键字const声明的对象变量的情况,可以说在很多情况下,能够帮助我们判断与对象相关的问题的是对象的地址的值,而不是对象的属性的值。

以上为个人见解,望指教。

《JavaScript高级程序设计》读书笔记--ECMAScript中所有函数的参数都是按值传递的的更多相关文章

  1. 学习笔记:JavaScript传参方式———ECMAScript中所有函数的参数都是按值传递

    我们把命名参数(arguments)视为局部变量,在向参数传递基本类型值时,如同基本类型变量的复制一样,传递一个副本,参数在函数内部的改变不会影响外部的基本类型值.如: function add10( ...

  2. javascript高级程序设计读书笔记

    第2章  在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...

  3. 《JavaScript高级程序设计》笔记(3):传递参数

    待更新... 9.17更新: ECMAScript中所有函数的参数都是按值传递的.也就是说,把函数外部复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样.基本类型值的传递如同基本类型变量的复 ...

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

    [javascript中所有函数的参数都是按值传递的] 参考:http://www.jb51.net/article/89297.htm

  5. javascript高级程序设计 读书笔记1

    第二章  在HTML中使用JS 加载JS有三种:行内,head头部和外部链接JS   最好使用外部链接<script src="example.js" ></sc ...

  6. JavaScript高级程序设计-读书笔记(7)

    第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...

  7. JavaScript高级程序设计-读书笔记(3)

    第8章 BOM 1.window对象 (1)全局作用域 BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象既是通过JavaScript访问浏览器窗口的一个接口,又是E ...

  8. JavaScript高级程序设计-读书笔记(2)

    第6章 面向对象的程序设计 创建对象 1.最简单方式创建Object的实例,如 var person = new Object(); person.name = “Greg”; person.age ...

  9. javascript高级程序设计读书笔记----引用类型

        Array类型. ECMAScript数组的每一项可以保存任何类型的数据. 数组大小是可以动态调整的. 创建数组第一种基本方式方式: 使用Array构造函数 var colors = new ...

随机推荐

  1. C#取整函数Math.Round、Math.Ceiling和Math.Floor 【非原创,用来收藏,分享】

    1.Math.Round:四舍六入五取偶 引用内容 Math.Round(0.0) //0Math.Round(0.1) //0Math.Round(0.2) //0Math.Round(0.3) / ...

  2. maven国内aliyun镜像

    打开maven安装目录下conf文件夹的settings.xml文件 配置本地仓库 <localRepository>D:/maven/repository</localReposi ...

  3. Thinkphp 图片上传

    案例:广告的增删改查 步骤: 1引用 js 2 填写 input type=" file" 的id 3 填写 url 4后台保存地址 5前台成功后的处理 广告添加页 <div ...

  4. [android] 优酷环形菜单-旋转动画

    获取房子,菜单图标ImageView对象,获取三个圆环RelativeLayout对象 给菜单图标(icon_menu)设置点击事件 定义一个成员变量isLevel3Show来存储第三级菜单是否显示 ...

  5. Java基础——ArrayList与LinkedList(二)

    今天练习ArrayList与LinkedList,在网上看到有关它俩应用效率的题型.觉得很有价值,保留一下. import java.util.ArrayList; import java.util. ...

  6. 了解java虚拟机---JVM的基本结构(1)

    1. JVM的基本结构 1.1. 类加载子系统 类加载子系统负责从文件或者网络中加载Class信息,加载的类信息存放于方法区的内存空间.方法区中可能还会存放运行时常量信息,包括字符串与数字常量.(这部 ...

  7. 面向对象设计模式_生成器模式解读(Builder Pattern)

    首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...

  8. 自定义MVC框架之工具类-模型类

    截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理 ...

  9. BZOJ3884(SummerTrainingDay04-C 欧拉定理)

    上帝与集合的正确用法 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天,  上帝创造了一个世界的基本元素,称做“元”. 第二天,  上帝创造了一个新的元素,称作“α”.“α”被定义为“元 ...

  10. 数组无法使用 forEach() 方法 - 分号的重要性

    问题描述: 函数的结构如上图所示,在调用该函数的时候,浏览器报错: 分析原因: 在 js 的语法中,如果语句独占一行,通常可以省略句末的分号 但实际上 js 解析代码的时候,只有在句末缺少分号就无法正 ...