大家好,本人名叫苏日俪格,大家叫我 (格格) 就好,下面我把我对ECMAScript的数据类型及值的理解跟大家分享一下,本文纯属个人理解,有哪里不对的地方请在评论区指出,大家一起学习共同进步。
ECMAScript包括三种数据类型:基本数据类型、引用数据类型和ES6新增的Symbol原始数据类型
基本数据类型:非常简单单一的数据段,无法再进行拆分的,exp:String、Number、Boolean、Null、undefined
引用数据类型:由多个值构成的可拆分的对象,exp:Object
原始数据类型:和其他类型不一样,本身既不是构造函数,也不是一个对象,是Symbol类型,它的值是独一无二的原始类型值
原始数据类型值在我的专辑《深入浅出ES6教程》中已经详细介绍了,下面我给大家主要介绍的是基本数据类型值和引用数据类型值,先看一个简单的例子:var a = 1;
var b = a;
b = 2;
console.log(a);
这个例子很简单,输出a=1;那么在这赋值的期间都发生了什么呢,看下面的图:
也就是说,在b=a这一步,使用a来初始化b,这样b的值也变成1,两者虽然值一样,但确是两个内存,b是a复制出来的一个副本,因此两者是独立的,互不影响,这就是js中的基本数据类型值;
那么引用数据类型的值又是怎么样的呢?var a = {name: '苏日俪格'};
var b = a;
console.log(b.name); // 苏日俪格
b.name = 'yufy';
console.log(a.name); // yufy
console.log(b.name); // yufy
大家看完了上面这个例子是不是蒙了呢,这结果恰恰和刚才的相反,这就是对象存在着引用,下面图中描述了栈堆的变化:
图中显示在执行b=a的时候,并没有分配新的内存给b,只是给了他一个指针,该指针指向了和a相同的内存,无论怎么去变动,两者都是一家子的;
如果想让对象赋值出来分配新的空间给他,在这里给大家两种比较容易的解决方式:
扩展运算符:
let a = [1,2,2,3];
let b = [...a];
a.push(4);
console.log(a); // [1, 2, 2, 3, 4]
console.log(b); // [1, 2, 2, 3]循环push每一项给新的数组:
let a = [1,2,2,3];
let b = [];
for (let i=0; i<a.length; i++) {
b.push(a[i]);
}
a.push(4)
console.log(a); // [1, 2, 2, 3, 4]
console.log(b); // [1, 2, 2, 3]
本文的所有内容均是一字一句敲上去的,希望大家阅读完本文可以有所收获,因为能力有限,掌握的知识也是不够全面,欢迎大家提出来一起分享!谢谢O(∩_∩)O~
欢迎访问我的GitHub,喜欢的可以star,项目随意fork,支持转载但要下标注,同时恭候:个人博客