• JS基本类型和引用类型


    ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。

    基本类型值指的是简单数据类型的值,比如:Undefined, Null, Number, Boolean, String类型。

    引用类型值指那些可能由多个值构成的对象,比如:Object类型。

    如何判断一个变量是否为引用类型呢?

    可以通过instanceof方法:

    if (variable instanceof Object == true) {
      // variable是引用类型
    }

    下面从三个方面说明基本类型及引用类型的用法及区别。

    1, 动态属性
    不能给基本类型的值动态添加属性,例如:

    var name = "Jack";
    name.age = 27;
    console.log(name.age); // undefined


    可以给引用类型的值动态添加属性,例如:

    var person = {};
    person.name = "Jack";
    console.log(person.name); // "Jack" 


    2, 复制变量值
    基本类型的复制会创建一个新的值,例如:

    var str1 = "a";
    var str2 = str1;
    str1 = "b";
    console.log(str2); // "a"

    由此可见,str2只是str1的一个副本,两个变量之间可以参与任何操作而不会互相影响。

    引用类型的复制则不同,新的变量与原来的变量指向内存中的一个对象,复制操作结束后,两个变量实际上将引用同一个对象。

    因此,改变其中一个变量的值,将影响另一个变量。例如:

    var obj1 = {};
    var obj2 = obj1;
    obj1.name = "Jack";
    console.log(obj2.name); // "Jack"


    3, 传递参数
    可以将函数的参数理解为局部变量。基本类型值的传递如同基本类型变量的复制一样,引用类型值的传递如同引用类型变量的复制一样。例如:
    基本类型参数:

    function add(val) {
        val += 10;
        return val;
    }
    var num = 20;
    var result = add(num);
    console.log(num); // 20
    console.log(result); // 30

    引用类型参数:

    function setName(obj) {
        obj.name = "Mark";
    }
    var person = {};
    person.name = "Jack";
    setName(person);
    console.log(person.name); // "Mark"

    总结:
    ・基本类型值在内存中占据固定大小的空间,因此保存在栈内存中;
    ・从一个变量向另一个变量复制基本类型值,会创建这个值的一个副本;
    ・引用类型的值是对象,保存在堆内存中;
    ・包含引用类型值的变量,实际上包含的并不是对象本身,而是一个指向该对象的指针;
    ・从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;
    ・判断一个值是哪种基本类型可以使用typeof操作符,而判断一个值是哪种引用类型可以使用instanceof操作符;

  • 相关阅读:
    #333 Div2 Problem B Approximating a Constant Range(尺取法)
    苦逼的单身狗(玄乎的尺取大法)
    欧拉项目第四题之三位数之积数的最大回数
    欧拉项目第三题之最大质数因子
    关于尺取法的认识与简单例题
    codeforces 980B Marlin
    康托展开和逆康托展开
    Chrome控制台中Network的Preview与Response区别
    配置Express中间件
    Express中间件简介
  • 原文地址:https://www.cnblogs.com/lidgblogs/p/7117564.html
Copyright © 2020-2023  润新知