《JavaScript高级程序设计》读书笔记--ECMAScript中所有函数的参数都是按值传递的
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中所有函数的参数都是按值传递的的更多相关文章
- 学习笔记:JavaScript传参方式———ECMAScript中所有函数的参数都是按值传递
我们把命名参数(arguments)视为局部变量,在向参数传递基本类型值时,如同基本类型变量的复制一样,传递一个副本,参数在函数内部的改变不会影响外部的基本类型值.如: function add10( ...
- javascript高级程序设计读书笔记
第2章 在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...
- 《JavaScript高级程序设计》笔记(3):传递参数
待更新... 9.17更新: ECMAScript中所有函数的参数都是按值传递的.也就是说,把函数外部复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样.基本类型值的传递如同基本类型变量的复 ...
- javascript中所有函数的参数都是按值传递的
[javascript中所有函数的参数都是按值传递的] 参考:http://www.jb51.net/article/89297.htm
- javascript高级程序设计 读书笔记1
第二章 在HTML中使用JS 加载JS有三种:行内,head头部和外部链接JS 最好使用外部链接<script src="example.js" ></sc ...
- JavaScript高级程序设计-读书笔记(7)
第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...
- JavaScript高级程序设计-读书笔记(3)
第8章 BOM 1.window对象 (1)全局作用域 BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象既是通过JavaScript访问浏览器窗口的一个接口,又是E ...
- JavaScript高级程序设计-读书笔记(2)
第6章 面向对象的程序设计 创建对象 1.最简单方式创建Object的实例,如 var person = new Object(); person.name = “Greg”; person.age ...
- javascript高级程序设计读书笔记----引用类型
Array类型. ECMAScript数组的每一项可以保存任何类型的数据. 数组大小是可以动态调整的. 创建数组第一种基本方式方式: 使用Array构造函数 var colors = new ...
随机推荐
- MVC应用程序显示上传的图片(续)
上一篇<MVC应用程序显示上传的图片>http://www.cnblogs.com/insus/p/3597543.html 最后有提及没有实现用户点击图片,显示原图的功能.此篇Insus ...
- SQL Server T—SQL 基本编程
一 定义变量 declare @变量名 数据类型 例:declare @a int -- 变量名前必须有 @ 二 赋值 set @变量名 = 值 sele ...
- JavaSE Collections类 , Iterator迭代器 , 增强for循环
Collections 它是集合的工具类,为集合体系扩展了一些其他的方法.类中都是静态的方法,可以使用类名直接调用. 可变参数 在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类 ...
- java通过url在线预览Word、excel、ppt、pdf、txt文档
java通过url在线预览Word.excel.ppt.pdf.txt文档中的内容[只获得其中的文字] 在页面上显示各种文档中的内容.在servlet中的逻辑 word: BufferedInputS ...
- Android照片墙-多图加载
http://blog.csdn.net/guolin_blog/article/details/9526203 照片墙这种功能现在应该算是挺常见了,在很多应用中你都可以经常看到照片墙的身影.它的设计 ...
- Could not transfer artifact org.apache.maven.plugins:maven-resources-plugin:pom:2.6 from/to central
问题: maven安装完成,环境变量配置没有问题,cmd窗口运行mvn compile的时候报错如下: Plugin org.apache.maven.plugins:maven-resources- ...
- 悟空模式-java-建造者模式
[此是锻炼神冰铁,磨琢成工光皎洁.老君自己动钤锤,荧惑亲身添炭屑.五方五帝用心机,六丁六甲费周折.造成九齿玉垂牙,铸就双环金坠叶.身妆六曜排五星,体按四时依八节.短长上下定乾坤,左右阴阳分日月.六爻神 ...
- js的filter方法
filter()方法使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组. 基本语法: arr.filter(callback[, thisArg]) 参数介绍: 参数名 说明 cal ...
- Stylus基本使用
介绍 在学习一个 Vue.js 项目的过程中,注意到源码中样式的部分并没有用熟悉的 .css 样式文件,而是发现了代码长得和 CSS 相像的 .styl 文件.这个 .styl 以前没见过啊,你是谁? ...
- Android 优秀开源项目
以下是本人日常工作中收集的比较不错的Android开源项目 roottools: RootTools gives Rooted developers easy access to common roo ...