zoukankan      html  css  js  c++  java
  • 整理Javascript基础数据和引用数据复制值的问题

    Javascript数据分为两大类:1.基础类型(原始类型数据) 2.引用类型。他们的存储方式是不同的

    基础类型的数据存储是保存在栈内存中的:

    例如: var a=1; var b=a;

     

    1 var a=1;
    2 var b=a;
    3 a=2;
    4 alert(b);//1

    上面的代码首先给变量a赋值1,存在栈内存中如上图,然后声明了变量b,并且把变量a的值复制一份给变量b,在栈内存中分别保存了变量a,b的值都为1,然后改变了变量a的值为2,但是他们都是独立存在于栈内存中的,所以不会受到影响,最后弹出b的值为1.

    引用类型的数据存储方式:

    例如:var a=new Object();a.name=“yewenxiang”;

     

    1 var a=new Object();
    2       a.name=“yewenxiang”;
    3 var b=a;
    4       a.name=“xiangwang”;
    5 alert(b.name);//xiangwang

    引用类型中对象的存储方式和基础数据类型存储方式是不同的,对象是存在堆内存中的,而栈内存中存储的是变量名和指向堆内存中对象的地址。

    第一行:申明了变量a 创建了一个对象实例保存在堆内存中,

    第二行:给a对象添加了一个name属性,值为”yewenxiang”,保存在了堆内存中,

    第三行:申明了一个变量b,在栈内存中把a 指向对象的地址复制给了变量b,两个地址指向的是相同的一个对象。

    第四行:改变对象中name的属性值为”xiangwang”

    第五行:为什么弹出的是”xiangwang”呢,因为他们指向的是同一个对象,而上行代码把name的属性值变为了”xiangwang”,所以b.name的值也是“xiangwang”.

    碰到的难点:

    1 var a={name:”yewenxiang”};
    2 var b=a;
    3 a={name:”xiangwang”};
    4 alert(b.name);//“yewenxiang”

    为什么会弹出yewenxiang,这个问题我刚开始的思路想错了:开始以为他们都是指向同一个对象,改变了a.name的值为”xiangwang”,所以b.name的值也会改变为”xiangwang”。问题出现在第三行代码,a={name:xiangwang},这行代码不是在第一行那个对象中改变了name属性的值为“xiangwang”,而是又重新创建了另外一个对象,而且里面也有了一个name属性,值为”xiangwang”,如果不想创建一个新对象应该这么去写第三行代码a.name=“xiangwang”,最后弹出的值才是”xiangwang”。

  • 相关阅读:
    XML注释
    Mysql 查询不重复数据
    java 支持跨域
    蓝桥杯历届试题-打印十字图--Java
    以流的方式读取url中的参数
    写log日志,并读取log日志
    Java Memcached的使用
    PageInfo实现分页
    java swing 窗口在屏幕中默认显示的位置 居中位置显示
    简易计算器布局 BorderLayout JPanel GridLayout 混合
  • 原文地址:https://www.cnblogs.com/yewenxiang/p/6021703.html
Copyright © 2011-2022 走看看