背景
 
    一个经典的问题,先抛出来给大伙看看:

var a = "黑MAO";
var b = a;
var c = new Object();
var d = c;
a = "新黑MAO";
c.age = 24;
//打印出结果是怎么样的呢?
console.log(a, b, c, d);
 
    上面先把问题出来,经过本文的梳理,之后再回头看看这个过程。
 
JS有哪些数据类型?
 
    JS包含量大数据类型,一种是基本数据类型(String、Number、Boolean、undefined、null);另外一种是引用类型(Object)
 
数据的存储方式有哪些?
 
  • 栈区:存放函数的参数值,局部变量的值(先进后出)
  • 堆区:由程序员分配释放,分配方式类似链表(任意顺序)
  • 全局区: 全局变量和静态变量
  • 文字常量区: 常量
  • 程序代码区:函数二进制码
 
JS中的基础类型和引用类型是怎么存储的?
 
    基础类型的数据存储在栈区,举一个简单的例子
    

var name = "黑MAO";
function hello(user) {
console.log('hello ' + user);
}
hello(name);
//这里只关注变量的存储
 
key
value
name
黑MAO
user
undefined

引用类型的数据存储在堆区,举一个例子

 

var a = new Object();
//由于堆区类似个链表,所以就用链表简单的表示一下
 
key
value
a
对象A地址
 
对象A的值:Object{}
...

另:堆区存储的数据是通过地址查找值,而不遵循队列或者栈的出入顺序

 
回顾

    回头看看文章刚开始的时候,抛出的那个问题。可以根据上面讲到的存储方式,复现一下从创建到赋值的一个过程。

var a = "黑MAO";
var b = a;
var c = new Object();
var d = c;
 
栈区存储结构:    
key
value
a
黑MAO
b
黑MAO
c
对象C地址
d
对象C地址
堆区存储结构:
对象C的值:Object{}
...
...
 
a = "新黑MAO";
c.age = 24;
 
栈区存储结构:
key
value
a
新黑MAO
b
黑MAO
c
对象C地址
d
对象C地址
 

堆区存储结构:

对象C的值:Object{age : 24}
...
...
console.log(a, b, c, d);
//新黑MAO 黑MAO Object{age: 24} Object{age: 24}
 
总结
    
    理清一些过程,便于在写代码的时候,更加高效并且没有错误。随时整理,也防止自己忘记~    
 
 
参考资料:
 

浅谈JS数据类型存储问题的更多相关文章

  1. 浅谈js数据类型识别方法

    js有6种基本数据类型  Undefined , Null , Boolean , Number , String ,Symbol和一种引用类型Object,下面我们就来一一看穿,哦不,识别他们. t ...

  2. 浅谈js拖拽

    本文来自网易云社区 作者:刘凌阳 前言 本文依据半年前本人的分享<浅谈js拖拽>撰写,算是一篇迟到的文章. 基本思路 虽然现在关于拖拽的组件库到处都是,HTML5也把拖放纳入了标准.但考虑 ...

  3. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  4. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  5. 开发技术--浅谈python数据类型

    开发|浅谈python数据类型 在回顾Python基础的时候,遇到最大的问题就是内容很多,而我的目的是回顾自己之前学习的内容,进行相应的总结,所以我就不玩基础了,很多在我实际生活中使用的东西,我会在文 ...

  6. 浅谈JS之AJAX

    0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...

  7. 浅谈 js 正则字面量 与 new RegExp 执行效率

    原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...

  8. 浅谈 js 字符串之神奇的转义

    原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...

  9. 浅谈 js 正则之 test 方法

    原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. var re = /\d/; console. ...

随机推荐

  1. hdu 3836 Equivalent Sets(tarjan+缩点)

    Problem Description To prove two sets A and B are equivalent, we can first prove A is a subset of B, ...

  2. 源码分析之spring-JdbcTemplate日志打印sql语句

    对于开源的项目来说的好处就是我们遇到什么问题可以通过看源码来解决. 比如近期有个同事问我说,为啥JdbcTemplate中只有在Error的时候才打印出sql语句呢.我一想,这和log的配置有关系吧. ...

  3. JavaScript 数组中查找符合条件的值

    数组实例的find方法,用于找出第一个符合条件的数组成员.它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员.如果没有符合条件的成员,则返回u ...

  4. web项目跨域访问

    1.同域相互访问 假设A.html 与 b.html domain都是localhost (同域) A.html中iframe 嵌入 B.html,name=myframe A.html有js fun ...

  5. 为人们服务的asp.net 验证控件

    ASP.NET是微软推出的WEB开发工具,他有很强大的功能,今天看视频讲到验证控件这一部分,真的感受到了微软全心全意为人民服务了.越来越佩服微软了,人家都设计出来了,咱们一定要会用才可以啊,不然太…. ...

  6. 使用apktool解包和打包apk

    使用apktool解包和打包apk 下载apktool工具 解包 apktool d xxx.apk -f 植入代码 使用apktool解包要植入代码的apk(下面称为A), 使用apktool解包包 ...

  7. ListVeiw新增记录及 滚动条移动到指定位置

    C# 自带的ListView控件的滚动条移动到指定位置. lvwList为ListView控件 lvwList.EnsureVisible(lvwList.Items.Count - 1); 新增记录 ...

  8. JS判断,今天所在季度,第几周, 季度的第几周,年度第几周

    <html> <head> <title>日期判断 周 月 季 年</title> <script type="text/javascr ...

  9. 5 输出的properties文件按照key进行排序

    import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; ...

  10. poj3264 线段树

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 44121   Accepted: 20715 ...