zoukankan      html  css  js  c++  java
  • S1 : 传递参数

    ECMAScript 中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。有不少开发人员在这一点上可能会感到困惑,因为访问变量有按值和按引用两种方式,而参数只能按值传递。在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript 的概念来说,就是arguments 对象中的一个元素);在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部

    function setName(obj) {
      obj.name = "Nicholas";
    }
    var person = {};
    setName(person);
    alert(person.name); //"Nicholas"

    以上代码中创建一个对象,并将其保存在了变量person 中。然后,这个变量被传递到setName()函数中之后就被复制给了obj。在这个函数内部,obj 和person 引用的是同一个对象。换句话说,即使这个变量是按值传递的,obj 也会按引用来访问同一个对象。于是,当在函数内部为obj 添加name属性后,函数外部的person 也将有所反映;因为person 指向的对象在堆内存中只有一个,而且是全局对象。有很多开发人员错误地认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的。为了证明对象是按值传递的,我们再看一看下面这个经过修改的例子:

    function setName(obj) {
      obj.name = "Nicholas";
      obj = {};
      obj.name = "Greg";
    }
    var person = {};
    setName(person);
    alert(person.name); //"Nicholas"

    这个例子与前一个例子的唯一区别,就是在setName()函数中添加了两行代码:一行代码为obj重新定义了一个对象,另一行代码为该对象定义了一个带有不同值的name 属性。在把person 传递给setName()后,其name 属性被设置为"Nicholas"。然后,又将一个新对象赋给变量obj,同时将其name属性设置为"Greg"。如果person 是按引用传递的,那么person 就会自动被修改为指向其name 属性值为"Greg"的新对象。但是,当接下来再访问person.name 时,显示的值仍然是"Nicholas"。这说明即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写obj 时,个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。

    小结
    JavaScript 变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型的值源自以下5种基本数据类型:Undefined、Null、Boolean、Number 和String。基本类型值和引用类型值具有以下特点:
    1、 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
    2、 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;
    3、 引用类型的值是对象,保存在堆内存中;
    4、 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
    5、 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;

    6、 确定一个值是哪种基本类型可以使用typeof 操作符,而确定一个值是哪种引用类型可以使用instanceof 操作符。


    作者:狂流
    出处:http://www.cnblogs.com/kuangliu/
    欢迎转载,分享快乐! 如果觉得这篇文章对你有用,请抖抖小手,推荐一下!

  • 相关阅读:
    测试websocket
    goreplay-测试app的真实流量
    apache -ab
    微信公众平台开发(69)百度地图导航
    微信公众平台开发(70)经济指标财经大事
    微信公众平台开发(68)苹果IMEI查询
    微信公众平台开发(67)百度百科
    微信公众平台开发(66)人品计算
    微信公众平台开发(65) 微博树洞
    微信公众平台开发(64)航班动态
  • 原文地址:https://www.cnblogs.com/kuangliu/p/3953867.html
Copyright © 2011-2022 走看看