• 对于JS的变量这个环节,其实主要要了解一下JS数据类型的存储方法
  • JS有两种不同的数据类型:基本类型(原始类型),引用类型(对象类型)。

  1.栈 (stack) 和 堆 (heap)

   (stack)栈会自动分配内存空间,由系统进行释放,用来存放基本数据类型 [ 数字(Number)、字符串(String)、布尔(Boolean)、空(Null)、未定义(Undefined)]  ,占据固定的大小的空间,是一种先进后出的数据结构。

       堆 (heap)堆是基于散列算法的数据结构,每创建一个新的对象,在堆内存中开辟一片新的空间;动态分配的内存,大小不确定,也不会自动进行释放; 生命周期由虚拟机的垃圾回收算法来决定;


  

2.JavaScript 数据类型 (基本数据类型,引用数据类型)

    基本数据类型(5种) 数字(Number)、字符串(String)、布尔(Boolean)、空(Null)、未定义(Undefined);直接按值

       【存放在栈内存中的简单数据段,数据大小确定,内存空间大小也确定】

      引用数据类型Array,Object;【存放在堆内存的对象,变量保存的是一个指针,空间大小不一样】


 

 3.图解 数据类型的存储方式

  基本数据类型的值是直接存在栈内存中,值与值直接是相互独立的,修改其中的一个变量不会对其他变量进行影响;

  引用数据类型的值是保存在堆内存中,每创建一个新的对象,就在堆内存中开辟一个新的空间,变量保存的事对象的内存地址(对象的引用),相同变量保存相同的对象的时候会影响值的改变;

   引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。

简言之: 基本数据类型的值直接保存在栈内存;引用类型的变量标识和指针保存在栈内存,引用类型的对象保存在堆内存的地址;

      var name = '小花';
var age = 10;
var test;
var arr = [1,2,3];
var obj = {age:10};

      通过图形表示基本数据类型和引用数据类型在内存中的存储情况:

       name,age,test三种基本数据类型是直接存储在栈内存中;

       arr,obj在栈内存中只是存储了一个地址来表示在堆内存中的引用;

  

var a=[1,2,3];
var b=a; //传地址,对象中传给变量的数据是引用类型,存储在堆内存中
b[0]=20; //b改变 会影响a的值的改变,因为他们指向的是同一个对象;
console.log(a[0]);//20;

注意:b只是拥有了一个不同名的‘指针’,去指向在堆内存中的对象;并不是直接赋堆内存的对象,所以b改变也会改变的a的数值;所以b修改的时候,会根据地址回到a堆中修改,c则直接在栈中修改,并且不能指向a堆内存中。

当b清空的值时,只是断开该变量与对象的联系,另一个对象并不受影响


  

 4.数据类型的比较

  • 比较两个基本数据类型的时候是对值之间的比较;
  • 比较两个引用数据类型的时候,是对象的内存地址比较;

    


注意: 引用数据类型的复制,就牵扯到 ‘浅拷贝’ 和 ‘深拷贝’ 的学习

1-JavaScript变量的更多相关文章

  1. javascript变量的作用域

    javascript变量的作用域 基本类型和引用类型 基本类型值指的是简单的数据段,而引用类型值指的是那个可能由多个值组成的对象  讲一个值赋值给变量时,javascript解析器首先要确定是基本类型 ...

  2. JavaScript 变量声明提前

    <JavaScript权威指南>中指出:JavaScript变量在声明之前已经可用,JavaScript的这个特性被非正式的称为声明提前(hoisting),即JavaScript函数中声 ...

  3. JavaScript 变量

    一,JavaScript 变量(存储信息的容器) 与代数一样,JavaScript 变量可用于存放值(比如 x=2)和表达式(比如 z=x+y). 变量可以使用短名称(比如 x 和 y),也可以使用描 ...

  4. javascript变量声明 及作用域

    javascript变量声明提升(hoisting) http://openwares.net/js/javascript_declaration_hoisting.html 可能要FQ一下 java ...

  5. JavaScript 变量作用域

    一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...

  6. 【转】javascript变量声明 及作用域

    javascript变量声明提升(hoisting) javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看 ...

  7. JavaScript变量和数据类型

    变量 变量就是一个元素,类似于数学中的概念,用来指定表示一个对象.在JavaScript中,用来指定变量的关键字为var.当声明新变量时,可以使用关键词 "new" 来声明其类型 ...

  8. 回归基础: JavaScript 变量提升

    from me: javascript的变量声明具有hoisting机制,它是JavaScript一个基础的知识点,也是一个比较容易犯错的点,平时在开发中,大大小小的项目都会遇到. 它是JavaScr ...

  9. JavaScript - 变量,作用域,内存

    JavaScript 变量可以用来保存两种类型的值:基本类型值和应用类型值.基本类型的值源自以下5种基本数据类型:Undefined.Null.Bollean.Number和String. 所有变量都 ...

  10. 六天玩转javascript:javascript变量与表达式(2)

    本系列内容为本人平时项目实践和参照MDN,MSDN,<javascript语言精粹>,<Effective Javascript>等资料,并且整理自己EverNote的日常积累 ...

随机推荐

  1. linux系统telnet端口不通能收到SYN但不回SYN+ACK响应问题排查(转载)

    linux系统telnet端口不通能收到SYN但不回SYN+ACK响应问题排查 一:背景:一台机器从公司办公网登录不上且所有tcp端口都telnet不通,但是通过同机房同的其它机器却可以正常访问到出问 ...

  2. export,import ,export default

    a.js export var name="李四"; 或者: a.js var name1="李四"; var name2="张三"; ex ...

  3. python文件之间变量和函数的 获取/调用 的方法

  4. 在Spring+MyBatis组合中使用事务

     通过Spring和MyBatis的组合,给出一个较为详细的实例 代码清单:配置Spring+MyBatis测试环境 <?xml version='1.0' encoding='UTF-8' ? ...

  5. 根据SNP的位置从基因组提取上下游序列

      代码如下: #!/usr/bin/perl -w use strict; die "perl $0 <vcf> <genome>" if(@ARGV = ...

  6. [转帖]crontab每小时运行一次

    crontab每小时运行一次     先给出crontab的语法格式 对于网上很多给出的每小时定时任务写法,可以说绝大多数都是错误的!比如对于下面的这种写法: 00 * * * * #每隔一小时执行一 ...

  7. 在 .Net 项目中生成Report小记

    背景 项目为WinForm + WCF 的应用,按照给定格式生成Report,显示在WinForm窗体上并可以导出为PDF和Excel文件. 分析 之前用过DevExpress For WinForm ...

  8. springmvc 拦截器与用户验证token

    1:springmvc 配置文件中添加拦截器,当然首先要有拦截后交给哪个类处理也要写上 <mvc:interceptors> <mvc:interceptor> <mvc ...

  9. java FastJson的使用总结

    1.前言 1.1.FastJson的介绍: JSON(javaScript Object Notation)是一种轻量级的数据交换格式.主要采用键值对({"name": " ...

  10. Matlab R2017b 打开后一直显示“正在初始化”,导致无法运行命令

    1. 前言 Matlab R2017b打开后一直显示"正在初始化",导致无法运行命令. 2. 解决方案 1. 找到并记录授权文件license_standalone.lic的路径. ...