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盘之类的存储工具),然后随着我们存储的东西越来越多,内存会有满的一天,然后你会删东西,再次存储东西的时候,会将上次地址块的内容重新填写,这个时候才是真正的删除了。