原始值与引用值(ES6学习笔记)

原始值,表示单一的数据,如10,“abc”,true等。
  • ES设计了6种原始值:Undefined、Null、Boolean、Number、String、Symbol。

  • 保存原始值的变量是按值访问,操作存储在变量内存中的实际值。

  • 原始值是不可以改变的。

  • 原始值不能有属性。

    // 原始值
    {
        let one1 = 'Tom';
        console.log(one1,one1.age);  //Tom undefined  它的属性值是不会被打印出来的
    }
    
  • 原始值可以包装类型

    1、为了方便操作原始值,ES6提供了3种特殊的引用类型:Boolean、Number、String。
    2、每当用到原始值的方法和属性时,后台会创建一个临时的包装类型对象,从而得以使用原始值的各种方法。

    // 原始值包装类型
    {
        let s1 = "hello world";
        let s2 = s1.substr(0,5);
        console.log(s1,s2);   //hello world       hello
    }
    

    后台执行的步骤:
    a) 创建一个包含原始值的String类型临时实例;
    b) 调用该临时实例的特定方法;
    c) 销毁该临时实例;

    typeof检查原始值可得出其具体类型,但检查对象都是object。

    {
        let value = '200';
        console.log(typeof value);   // string 
        let number = Number(value);   // Number()强制转换函数
        console.log(typeof number);   // number  
    }
    {
        let value = '200';
        let number = new Number(value);   // new Number()构造函数
        console.log(typeof number);   // object
    }
    {
        let n1 = 100;
        let n2 = new Number(n1);
        console.log(typeof n2);   // object   所有对象的类型都是object
        console.log(typeof n2.valueOf());   // number   valueof()把包装对象的原始值取出来了。
    
        console.log(n1 + n2);  // 200
        console.log(n1 + n2.valueOf());   // 200
    }
    
引用值,表示有多个值(原始值或其他引用值)构成的对象。
  • ES不允许直接访问对象的内存空间。

  • 实际操作对象时,访问的是保存对象的内存地址,即该对象的引用。

  • 引用值(对象)可以随时添加、修改和删除其属性和方法。

    // 引用值
    {
        let person = new Object();
        person.name = 'John';
        person.showMe = function(){
            console.log("Hi,I'm " + this.name);   
        }
        person.showMe();   //Hi,I'm John
    }
    
原始值与引用值传递区别
  • 本质上无区别,都是将一个变量中保存的信息赋值给另一个变量。

  • 但对象变量中保存的是地址,所以它传递的是地址,改变其中一个变量的值,另一个变量会相继改变,因为它们都指向同一个地址。

    {
        let a = 100;
        let b = a;
        b++;
        console.log(a,b);  //100 101
    }
    {
        let ob = {value:100};
        let oa = ob;
        oa.value = 200;
        console.log(ob.value,oa.value);    //200 200
    }
    
typeof( ) 与 instanceof( )
  • typeof检查原始值可得出其类型,但检查引用值就不能具体判断出其类型,因为都为object。

    // typeof 
    {
        let s = "Nick";
        console.log(typeof s); //string
    
        let b = true;
        console.log(typeof b); //boolean
    
        let i = 22;
        console.log(typeof i); //number
    
        let u;
        console.log(typeof u); //undefined
    
        let n = null;
        console.log(typeof n); //object
    
        let obj = new Object();
        console.log(typeof obj); //object
    
        let arr = new Array();
        console.log(typeof arr); //object
    
        let a = [1, 2, 3];
        console.log(typeof a); //object
    }
    
  • typeof对于引用值意义不大,通常采用instanceof操作符来判断引用值的类型。

    // instanceof
    {
        let obj = new Object();
        console.log(obj instanceof Object); //true
    
        let arr = new Array();
        console.log(arr instanceof Array); //true
    
        let a = [1, 2, 3];
        console.log(a instanceof Array); //true
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值