引语
写这篇文章的目的,希望把自己理解的对于js的认识记录下来,如果可以帮助到需要的人,那是最好了;也希望可以和更多热爱js的同仁一起交流、探索,宇宙最好用的开发语言javascript(不接受反驳)。
js数据类型
今天,要讨论的是js的数据类型。我们都知道,js有基础数据类型、引用数据类型之分。
基础数据类型:Number String Boolean Undefined Null
引用数据类型:Object Function Array 等
那么问题来了,它们之间的不同点是什么呢?
我们一起来看个例子:变量复制
变量复制
结果很容易,没必要说,继续看
修改变量值
我们给b重新赋值 2,obj2.name的值赋值"new objecjt",发现a还是1(符合常理),但obj的name已经变成“new objecjt”,我们明明修改的是obj2的name,为什么obj的name也跟着变化了呢?
结论
从上面的例子,可以看出基本数据类型和引用数据类型在复制时,完全不同。那么为什么会是这样的结果呢?
打破砂锅问到底
原因要从js存储变量的方式说起。其实每当我们申明一个变量,计算机都会在内存中生成一个存储空间,存储空间由变量的值和一个“指针”组成,这个指针是外部能访问值的唯一路径,而变量名字就指向这个“指针”,故可以通过变量名,来获取对应的值。
示意图
变量内存示意图
然后看复制变量,还是拿前面的例子来说。当复制变量a,var b=a,此时计算机先为变量b重新生成了一个存储空间,然后把a所对应的存储值,复制到了b的存储空间,这样等于前后有2个存储空间产生:a的存储空间、b的存储空间。这样b和a就没有关联了,你访问你的值,我访问我的值,互不影响。
再看复制obj对象,var obj2=obj,此时计算机发现obj是个对象,并没有给obj2生成新的存储空间,而只把obj2指向了obj的“指针”,obj和obj2公用obj的存储值,这也是对象被称为引用类型的原因,obj2引用了obj的值,很大的减少了内存的开支;方便的同时,问题也是很明显,改了obj2的值,等于改了obj的值,有些时候,这样的情况可能不是我们所期望的。
ok,今天要分析的js技能就到这里,感谢大家的耐心浏览。下期我们将讨论:引用类型的深度复制。