浅谈JS数据类型存储问题

背景

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

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}

总结

理清一些过程,便于在写代码的时候,更加高效并且没有错误。随时整理,也防止自己忘记~

参考资料:

http://blog.jobbole.com/81010/

http://blog.jobbole.com/81011/

http://blog.jobbole.com/81018/

时间: 2024-10-14 06:53:44

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

浅谈js数据类型识别方法

js有5种基本数据类型  Undefined , Null , Boolean , Number , String 和一种引用类型Object,下面我们就来一一看穿,哦不,识别他们. typeof 前面5种虽多,但是是基本类型,也容易识别,typeof 操作符就能差不多把他们都识别了,null 不服的站了出来:"能识别我么?",typeof这下犯难了:"你,你你先坐下." typeof对Object基本上是脸盲的,除了function之外看谁都是Object, 数组

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

开发|浅谈python数据类型 在回顾Python基础的时候,遇到最大的问题就是内容很多,而我的目的是回顾自己之前学习的内容,进行相应的总结,所以我就不玩基础了,很多在我实际生活中使用的东西,我会在文章中提一下.并且我自己会根据这些内容进行相应的补充与扩展. 文章定位:不是科普文,是自己对于自己学习的总结. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任何的自我感情色彩. 情感:用我自己的方式,解读知识点.力求通俗易懂,完美透析知识. 正文 正文的主要内

浅谈 js eval作用域

就简单聊下如何全局 eval 一个代码. var x = 1; (function () { eval('var x = 123;'); })(); console.log(x); 这个代码得到的是 1 而不是 123如果想让 eval 执行的代码是全局的,那么有几种方法. var x = 1; (function () { window.eval('var x = 123;'); })(); console.log(x); 这个方法标准浏览器都可以得到 123 而IE6-8则依然是 1 相同的

浅谈 js 正则之 test 方法

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

浅谈 js 语句块与标签

原文:浅谈 js 语句块与标签 语句块是什么?其实就是用 {} 包裹的一些js代码而已,当然语句块不能独立作用域.可以详细参见这里<MDN block> 也许很多人第一印象 {} 不是对象字面量么?怎么成了语句块了?如果在赋值语句或者表达式里用的时候,确实是对象字面量,如: var a = {}; ({toString:function(){return "hehe"}}) + "..."; 是不是很有意思..但是直接使用如: {toString: fu

浅谈JS之AJAX

0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HTTP和web服务器进行数据交换(用户不知道也感觉不出来,就跟桌面应用程序似的进行数据交互),它不会导致页面重新加载,这样才有更好的用户体验. Ajax是基于以下开放标准: javascript(DOM) css html xml(json) 通俗的说就是使用了javascript(DOM)的XMLH

浅谈 js 下 with 对性能的影响

这几天多次看到有博主们在写 with 的文章,这货确实非常方便,但是却是个性能杀手,所以一直都是上不得台面的.那么他究竟会让效率低下到什么程度呢?先来看下 with 是如何的便捷吧.. // 正常调用 console.log(location.host); console.log(location.pathname); // 在 with 下 with (location) { console.log(host); console.log(pathname); } 如果不影响性能,确实是非常霸气

浅谈python字符串存储形式

http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问并且给出自己现有知识有的回答.长话短说,用过python的人对于 == 和 is 应该不陌生,但是这里我还是介绍一下. ==是用来判断两个东西是否相等,比如: a = 10: b = 10: print(a == b): 输出是true: 再看一个例子: a = [1,2,3]; b = [1,2,3]; c = [1,2,4]; print

浅谈 js 数字格式类型

原文:浅谈 js 数字格式类型 很多人也许只知道 123,123.456,0xff 之类的数字格式.其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有人说这是什么个格式?其实还不止呢.1          //11.2       //1.21.2e3    //12001.2e+3  //12001.2e-3  //0.0012.12e+2 //12-.12e-2 //-0.0012 当然这些只是十进制.我们来说说 八进制 和 十六进制.0x00