• javascript原始值和引用值类型及区别


    原始值和引用值类型及区别

    首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变。

    原始值(简单数据类型)

    存储在栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。包含五种:undefined,null,boolean,number和string,可以通过typeof来判断某数据是何简单数据类型。

    引用值(复杂数据类型)

    存储在堆中的对象,放在变量的栈空间中的值是该对象存储在堆中的地址,也就是说,存储在变量处的值是一个指针(内存地址),指向存储对象的堆内存中,包含Object,array,function等

    区别:1.简单数据类型的值是储存在栈中,当把一个变量传递给另一个变量时,是把一个栈中的东西复制到另一个栈中,并且这两个变量互不影响,修改其中的变量值时不会改变另一个变量的结果。

    var a=10
    var b=a
    a=1
    console.log(b)//10

    2.引用值是把引用变量的名称存储在栈中,但是把实际对象存储在堆中,栈中的内存地址指向堆中的实际对象,当把引用对象传递给另一个变量时,复制的其实是指向实际对象的指针(内存地址),此时两者指向的是同一个数据,若通过方法改变其中一个变量的值,则另一个变量的值也会改变,因此,js中对象的复制是默认引用赋值的。

    const obj1={
            name:'xiaoming'
    }
    const obj2=obj1
    obj2.name='xiaohong'
    console.log(obj1)//xiaohong

    也是因为上述特点,es6中,const是声明常量的,赋值后,该值不可改变。

    const PI=3.14
    
    PI=2.14//报错
    
    console.log(PI)
    
    //但是
    const obj1={
            name:'xiaoMing'
    }
    
    obj1.name='xiaoHong'
    console.log(obj1.name)//xiaoHong

    这也是因为,const声明的obj1指向的是栈中的内存地址,此地址不可被修改,但是堆中存储的数据它是管不着的。

    小明的妈妈让小明看门,家里的东西被偷光了,门还在。

    如果你想复制赋值,另外一个值不会随它改变而改变,则必须重新分配对象,此时,该值的原指针(内存地址)改变,则另外一个值不会随它的改变而改变。

    var obj1={
            name:'xiaoMing'
    }
    var obj2=Object.assign({},obj1)
    
    obj2.name='xiaoHong'
    console.log(obj1)
    console.log(obj2)
  • 相关阅读:
    Java线程中run和start方法的区别
    dwr+spring集成
    Lucene入门
    struts2之单个文件上传
    利用jQuery接受和处理xml数据
    struts2之多个文件上传
    Google开源项目二维码读取与生成工具ZXing
    C# Regex 深入正则表达式
    android多分辨率多密度下界面适配方案
    [转]C#.net编程创建 Access 文件和 Excel 文件
  • 原文地址:https://www.cnblogs.com/clearyang/p/15735049.html
Copyright © 2020-2023  润新知