资讯专栏INFORMATION COLUMN

js 函数、参数传递、引用类型与基本类型

Lavender / 1246人阅读

摘要:基本类型和引用类型用操作符定义的变量将成为作用域中的局部变量。在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量即命名参数。结果依旧是在调用函数初时,与引用的是同一对象,所以首次的属性赋值会对有所影响。

函数 参数

1.js函数不介意传递进来多少个参数,也不在乎传递进来参数是什么类型。
2.arguments对象:类数组
arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的参数(命名参数)个数决定的。
没有传递值的命名参数自动被赋予undefined值。

基本类型和引用类型

用var操作符定义的变量将成为作用域中的局部变量。就是说函数中 使用var定义一个变量,这个变量在函数退出后就会被销毁。

基本类型:存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
引用类型:存储在堆中的对象,也就是说,存储在变量处的值是一个指针,指向堆中的对象。

传递参数

所有函数的参数都是按值传递的。

在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量,即命名参数。
只是把变量里的值传递给参数,之后参数和这个变量互不影响。

在向参数传递引用类型的值时,会把 这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心! 对于数组和对象等是将对象(数组)的变量的值传递给了函数参数,这个变量保存的指向对象(数组)的地址。

当函数改变这个地址指向的对象(数组)的内容时,同时也改变了函数外部变量指向的对象(数组)的内容;
当函数改变的是变量的地址时,实际就与函数外部的变量失去了联系,变成了完全不同的对象了,不会对函数外部对象造成改变。

来看书里两个经典的例子:

        function setName(obj){
            obj.name = "xiaoxiaozi";
        }
        var person = new Object();
        setName(person);
        alert(person.name); // 返回 xiaoxiaozi

在调用函数setName()时,person 被复制给了 obj 。因此在函数内部 obj 与 person 引用的是同一个对象,或者说是对同一个对象的引用。所以在给 obj 引用对象加上 name 属性时,person 引用的对象也有了 name 属性,因为虽然 obj 与 person 不同,但是二者引用的对象是同一个。

    function setName(obj){
        obj.name = "xiaoxiaozi";
        obj = new Object();
        obj.name = "admin";
    }
    var person = new Object();
    setName(person);
    alert(person.name); // 结果依旧是 xiaoxiaozi

在调用 setName() 函数初时,obj 与 person 引用的是同一对象,所以首次的 name 属性赋值会对 person 有所影响。但是当 obj 被重新定义时,其引用的对象已经与 person 不同,所以后面设置的 name 属性,不会对 person 引用的对象有任何影响。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/50027.html

相关文章

  • js 函数参数传递引用类型基本类型

    摘要:基本类型和引用类型用操作符定义的变量将成为作用域中的局部变量。在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量即命名参数。结果依旧是在调用函数初时,与引用的是同一对象,所以首次的属性赋值会对有所影响。 函数 参数 1.js函数不介意传递进来多少个参数,也不在乎传递进来参数是什么类型。2.arguments对象:类数组 arguments对象的长度是由传入的参数个数决定的,...

    Bowman_han 评论0 收藏0
  • js中的值类型引用类型、堆、栈、函数参数传递方式、连续赋值等概念的学习

    摘要:值类型基本类型和栈内存值类型也称为原始数据或原始值这类值存储在栈内存中基本类型的值不可以修改。目前中的基本类型一共有六种。堆的使用规则当创建数组时,就会在堆内存中创建一个数组对象,并且在栈内存中创建一个对数组的引用。 值类型(基本类型)和栈内存 值类型也称为原始数据或原始值(primitive value).这类值存储在栈(stack)内存中, 基本类型的值不可以修改。每当我们定义一个...

    hizengzeng 评论0 收藏0
  • js基本数据类型引用数据类型

    摘要:熟悉的同学都知道,它的数据类型一般分为基本数据类型和引用数据类型复杂数据类型。基本数据类型基本数据类型有种新增。动态的属性基本数据类型的值是没有办法添加属性和方法的。类型检测根据它的原型链来识别引用类型。 熟悉js的同学都知道,它的数据类型一般分为基本数据类型和引用数据类型(复杂数据类型)。那么他们之间到底有什么不同?从下面这个例子入手: var a = 1; ...

    kgbook 评论0 收藏0
  • JS函数参数传递引用传递

    摘要:学习中函数参数值传递和引用传递的学习中函数参数值传递和引用传递在红宝书中说到,中所有函数的参数都是按值传递的。 学习JS中函数参数值传递和引用传递的学习 JS中函数参数值传递和引用传递 在JavaScript红宝书中说到,ECMAScript中所有函数的参数都是按值传递的。理解这个概念先要从JS的堆内存和栈内存说起:栈内存为自动分配的内存空间,它由系统自动释放;堆内存则是动态分配的内存...

    ZHAO_ 评论0 收藏0
  • 分析 JavaScript 的数据类型变量

    摘要:基本数据类型在中,基本数据类型有种,即数值字符串布尔值。两个布尔值转为数值进行比较。对于对象和布尔值,调用它们的方法得到对应的字符串值,然后进行字符串相加。减法对于字符串布尔值或者,自动调用,转换结果若为,那么最终结果为。 这篇文章,来聊聊 JS 中的数据类型与变量。这是在学习 JS 时最基础的一类问题,但却很重要。希望我的分享有帮助到你。 文章开头,我先提几个面试中遇到的问题: 比如...

    Mike617 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<