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”。

  • 相关阅读:
    SpringMVC的下载
    上传的前台实现
    SpringMVC自定义视图解析器的使用
    SpringMVC的Model对象的使用
    SpringMVC中使用作用域对象完成数据的流转
    SpringMVC的响应介绍
    SpringMVC的静态资源放行配置
    SpringMVC的静态资源放行
    SpringMVC的编码过滤器配置
    pymysql
  • 原文地址:https://www.cnblogs.com/yewenxiang/p/6021703.html
Copyright © 2011-2022 走看看