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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值