概念
变量是用于存储信息的"容器"。可用var来声明一个变量:var 变量名,变量可以先声明后赋值,也可以同时声明并赋值,可以在一条语句中声明很多变量,语句以 var 开头,变量之前用逗号分隔;未使用值来声明的变量,该变量的值是 undefined
命名规范
- 变量名必须以英文字母、_ 和$开头;
- 变量名可以包括英文字母、_ 、$和数字;
- 不可以使用系统的关键字、保留字作为变量名;
- js变量名对大小写敏感
变量的数据类型
不可改变的原始值(栈数据),包括:
number
、string
、boolean
、undefined
、null
特点:
(1).占用空间固定,保存在栈中;
(2).保存和复制的是值本身;
(3).可使用typeof检测这些基本数据类型;引用值(堆数据)
array
、object
、function
特点:
(1).占用空间不固定,数据保存在堆中;
(2).保存和复制的是指向对象的一个引用;
(3).可使用instanseof检测这些数据的类型;
赋值原理
JS赋值简单理解其实就是把某东西赋予给谁的过程。但深入理解的话会涉及到内存、涉及到数据在堆栈中的存储规则,内存可以理解成一些用于存储数据的空间。
你应该知道,JS中原始值是存储在栈内存中的,引用值(如array、object、function)是存储在堆内存中的。所以有些人吧原始值也叫栈数据,引用值叫堆数据。所以我们分两种情况来说一下具体的过程和底层原理:
首先,来看原始值的赋值过程,如将a值赋值为b
代码
var a = 5;
var b = a;
其过程是:
1.声明变量a并赋值等于5
2.声明变量b,并将a的值赋值给b
在内存中的表现如下图
所以,原始值的赋值其实就是值cope的过程
看到这里,我可以再看看原始值的再赋值(修改)过程
比如修改上面变量让a为3,b为9,
a = 3;
b = 9;
在内存中的表现如下图事实上数据在内存中的存放是,当你重新赋值的时候,不会直接在原来的内存位置进行修改。而是它会开辟新的内存空间来存放,旧的内存序号会回归本来面目,不在是变量名。
理解完原始值得变量赋值,接下来来深入引用值的赋值和再赋值过程。
我们知道原始值属于堆数据,也就是数据内容是存放在堆内存中,堆内存本质是区别于栈区、全局数据区和代码区的另一个内存区域。
先举个例子:
声明一个对象obj,里面有个数据a值为1
然后重新给obj赋新的值
如下:
var obj = {a:1}
obj ={a:2}
在内存中的表现如下图:引用值在栈内存中保存的其实只是对应堆内存中对应的数据的内存空间的地址,通过这个地址可以找到对应的数据内容。
如果重新赋值也很简单
所以如果引用值的赋值,赋值的是指向的堆内存空间的对应地址。