zoukankan      html  css  js  c++  java
  • JS浅谈原始值与引用值操作

    值的操作分为三大类:复制,传递,比较

    一:复制

    原始值
    let a = 10;
    let b = a;
    注释:2018-7-30 17:33:49
    1 原始类型的值都是存放在栈内存当中,所以他们的赋值操作,其实相当于在栈内存开辟新的空间,然后将值的副本赋给新的内存,所以他们互不干扰
    
    引用值
    let obj = {
        name:'panrui'
    };
    let obj1 = obj;
    1 引用类型的值是存放在堆内存当中,栈内存中变量保存的只是一个堆内存的地址,所以赋值操作,也是开辟一个新的栈内存,然后将地址赋值给新的内存,由于两个变量对应的地址指向同一个地方,所以他们会互相影响
    2 tip:如果给变量赋值新值呢
        2.1
        obj1 = 6
        console.log(obj) //{name:'panrui'} 并不会影响
        2.2
        obj = 6
        console.log(obj1) //{name:'panrui'} 并不会影响
        重复赋值实际上是覆盖变量对原值的引用,变为另一个值的副本或对其引用。所以不会对原值产生影响

    二:传递

    原始值
    let a = 10;
    function f(x){
        x= x + x
    }
    f(a)
    console.log(a) // 10 
    注释:说明传递和赋值其实是一样的,都是传递值的副本,互不影响
    
    
    引用值
    let obj = {
        name:'panrui'
    };
    function a(a){
        a.name = 'hello'
    }
    a(obj)
    console.log(obj) // {name:'hello'}  因为传递的地址指向的同一个引用,所以互相影响
    
    注释:说明不管是基本类型,还是引用类型都是按值传递的,引用类型传递的是地址,基本类型传递的值的副本
    function a(a){
        a.name = 'hello';
        a = new Object(); 
        a.name = 'hah';
        console.log(a) //{name:'hah'} 相当于重新赋值,这时候a在栈内存保存的是另外一个值的副本或者新的地址
        
    }
    a(obj)
    console.log(obj) //{name:'hello'}

     

    三:比较值

    原始值
    let a = 'hello'
    let b = 'hello'
    a === b //true
    注释:当对原始值进行比较时,进行逐字节的比较来判断它们是否相等。比较的是值本身,而不是值所处的位置,固然比较的结果可能会相等,
    但只是说明它们所包含的字节信息是相同的
    
    
    
    引用值
    let a = new Number(1);
    let b = new Number(1);
    a === b //false
    
    let c = a;
    a === c //true
    
    注释:当比较两个引用值时,比较的是两个引用地址,而不是比较它们的原值字节是否相等
    不忘初心,不负梦想
  • 相关阅读:
    useState 的介绍和多状态声明(二)
    PHP:相对于C#,PHP中的个性化语法
    PHP:IIS下的PHP开发环境搭建
    PHP:同一件事,有太多的方式
    Javascript:再论Javascript的单线程机制 之 DOM渲染时机
    Javascript:拦截所有AJAX调用,重点处理服务器异常
    DDD:谈谈数据模型、领域模型、视图模型和命令模型
    .NET:再论异常处理,一个真实的故事
    Javascript:由 “鸭子类型” 得出来的推论
    Workflow:采用坐标变换(移动和旋转)画箭头
  • 原文地址:https://www.cnblogs.com/panrui1994/p/9394056.html
Copyright © 2011-2022 走看看