04. JavaScript基础——原始值和引用值

定义

  1. 原始值
    1. primitive value,就是最简单的数据
    2. Undefined,Null,Boolean,Number,String,Symbol都是原始值
    3. 保存原始值的变量是按值访问的,因为我们操作的是存储在变量中的实际值
  2. 引用值
    1. reference value,由多个值构成的对象
    2. JS不能直接访问内存位置,所以不能直接操作对象所在的内存空间
    3. 在操作对象的时候,实际上操作的是对该对象的引用,所以保存引用值的变量是按引用访问的
  3. 在把一个值赋给变量的时候,JS的引擎必须确定这个值是原始值还是引用值

动态属性

  1. 对于引用值,在变量保存了某个值之后,可以随时添加,修改,删除其属性和方法

    let person = new Object();
    person.name = "小明";
    console.log(person);  // {name: '小明'}
    
  2. 原始值不能有属性,但是给原始值添加属性不会报错,会返回undefined

  3. 原始类型的初始化可以只使用原始字面量形式,如果使用了new关键字,那么JS会创建一个Object类型的实例

    let name1 = "小明";
    let name2 = new String("小刚");
    name1.age = 18;
    name2.age = 19;
    console.log(name1.age);  // undefined
    console.log(name2.age);  // 19
    console.log(typeof name1);  // string
    console.log(typeof name2);  // object
    

复制值

  1. 在通过变量把一个原始值赋值到另一个变量的时候,原始值会被复制到新变量的位置

    let n1 = 5;
    let n2 = n1;
    
    • 此时,n2会得到数值5,这个数字和存储在n1中的5是互相独立的,互不干扰
  2. 在把引用值从一个变量赋给另一个变量的时候

    1. 存储在变量中的值也会被复制到新变量所在的位置,但是这里复制的值实际上是一个指针,它指向了存储在堆内存中的对象

    2. 复制完成之后,两个变量实际上指向同一个对象,所以一个对象上的变化会在另一个对象上反映出来

      let obj1 = new Object();
      obj1.name = "小明";
      let obj2 = obj1;
      console.log(obj2.name); // 小明
      

确定类型

  1. typeof对引用值的用处不大,当需要知道一个值是什么类型的时候,可以还有instanceof操作符

  2. 语法格式:result = variable instanceof constructor

    1. 如果变量是给定的引用类型的实例,就返回true
  3. 例子

    let person = new Object();
    person.name = "小明";
    console.log(person instanceof Object);  // 返回true
    console.log(person instanceof Array);  // 返回false
    
  4. 所有引用值都是Object的实例,所以使用instanceof检测任何引用值和Object构造函数都会返回true

  5. 如果用instanceof检测原始值,那么会返回false,因为原始值不是对象

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容