博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《JavaScript高级程序设计》读书笔记--ECMAScript中所有函数的参数都是按值传递的...
阅读量:5229 次
发布时间:2019-06-14

本文共 1859 字,大约阅读时间需要 6 分钟。

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声明的对象变量的情况,可以说在很多情况下,能够帮助我们判断与对象相关的问题的是对象的地址的值,而不是对象的属性的值。

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

转载于:https://www.cnblogs.com/limengyi/p/6171457.html

你可能感兴趣的文章
SQL Server中的Recovery Interval
查看>>
legend2---开发日志1(legend的数据库整体设计思路是什么)
查看>>
Gym 101480I Ice Igloos(思维乱搞)题解
查看>>
将数组转换成list
查看>>
XML工具——xmlbeans的使用
查看>>
ElasticSearchRepository和ElasticSearchTemplate的使用
查看>>
【leetcode】Freedom trail
查看>>
win8下C盘不能读写的解决方案[zz]
查看>>
使用RStudio远程连接MySQL
查看>>
Linux 在一个命令行上执行多个命令
查看>>
移动APP项目优化
查看>>
springMVC项目访问URL链接时遇到某一段然后忽略后面的部分
查看>>
nginx配置返回文本或json
查看>>
魔方阵
查看>>
交换两个变量的值
查看>>
常见 Dos命令
查看>>
Java爬虫(二)
查看>>
【IDEA】设置类头注释和方法注释
查看>>
使用JSON语法创建JS对象(重要)
查看>>
ajax提交表单
查看>>