JS变量,值类型

变量申请:

申请多个单一变量:

尽量不要像下面这样申请:

命名规则:

变量名字必须要以英文字母,下划线,$开头

变量名可以包括英文字母,下划线,$,数字

不可以用系统的关键字(现在使用的系统的有特殊含义的词),保留字(未来也许系统使用的关键字)用做变量名

值类型:首先先将值分为原始值和引用值

原始值:

Number String Boolean undefined null

引用值:

array Object function .....date  RegExp

看一下下面的js代码:

b的值是多少呢?10  没错

那么再看下面的

那么现在你再来看arr1多少呢?1?

不对 是1,2

造成这样的原因是由于原始值和引用值储存的方式不一样

原始值存储的方式用的栈(先进后出),栈内存的赋值方式是复制

先看a,b;

var a = 10;

var b;

现在在赋值b时,首先是a的10拷贝一份,然后再给b

那么,再次改变a的值时候,就和b没什么关系了

接下来引用值,他的存储方式是栈加堆

首先

var arr,arr1;

然后

arr = [1];

系统发现存的数组,然后就将数组的内容存储到堆里面

然后arr里面存的是数组内容的地址

然后再将arr赋值给arr1 ,

arr1 = arr;

现在在arr中增加内容

arr.push(2);

这个时候再输出arr1   ,去到1000的地址中找内容,就会变成[1,2]了,原因是arr,和arr1共同指向1000地址的内容

document.write(arr1);

接下来看下一段代码:

这样你觉得arr1应该是多少呢?1,2,3?   不对,是1,2

这是因为刚才用的push把2存进去了,现在使用的是:

arr = [1,3];

这样会重新找一个地址

再将一下,刚才的内存机制,原始值其实是叫不可改变的原始值,刚才那样写其实是不对的(我们直接改变了里面的内容)

其实是这样的,在你重新给原始值赋一个新值的时候,他并不是直接改变其原来的内容,他只是将原来内容的地址变回去,然后再在新的地方重新申请一个空间,然后再将新值存储进去

赋值完最开始是这样的:

然后改变a的值,

就会变成这样,那原来的地址怎么办呢,就和我们u盘删东西是一样的原理,

一般来说我们删东西其实并没有删除,它还存在于内存中,只是他的地址我们找不到了(但是有些相关工具可以找到,所以不要轻易丢弃u盘之类的存储工具),然后随着我们存储的东西越来越多,内存会有满的一天,然后你会删东西,再次存储东西的时候,会将上次地址块的内容重新填写,这个时候才是真正的删除了。

猜你喜欢

转载自blog.csdn.net/VVVZCS/article/details/81810950