js 基础知识

一,数据类型

基础数据类型:number,string,boolean,undefined,null 五类

引用数据类型: Object, Array等

var length = 7;                             // 数字
var lastName = "Gates";                      // 字符串
var cars = ["Porsche", "Volvo", "BMW"];         // 数组
var x = {firstName:"Bill", lastName:"Gates"};    // 对象 

二,浅拷贝 和 深拷贝

2.1 浅拷贝

简单点来说,浅拷贝就是假设B复制A,当修改A时,看B是否发生了变化,如果B也跟着变了,则就会浅拷贝,例如
 

let a=[0,1,2,3,4],
    b=a;
console.log(a===b);
a[0]=1;
console.log(a,b); // [1,1,2,3,4] [1,1,2,3,4]

基本数据类型(number,string,boolean,undefined,null)都存储在栈内存中, 例如 let a = 1;

当你 b = a 复制时,栈内存会新开辟一个内存,例如

所以当修改 a = 2 时,对 b 并不会造成影响,当然,let a = 1, b = a, 虽然 b 不受 a 的影响,但这也算不上深拷贝,因为深拷贝本身只针对较为复杂的object类型数据

引用数据类型--名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值, 我们以上面浅拷贝的例子画图:

当 b = a进行拷贝时,其实复制的是 a 的引用地址,而并非对立面的值

 

 而当我们 a[0] = 1 进行数组修改时,由于 a 与 b 指向的是同一个地址,所以自然 b 也受了影响,这就是所谓的浅拷贝了

那,要是在堆内存中也开辟一个新的内存专门为 b 存放值,就像基本数据类型那样, 起步就达到深拷贝的效果了

 

2.2 深拷贝 

简单点来说,深拷贝就是假设B复制A,当修改A时,A,B互不影响,则就是深拷贝

2.2.1 很多时候浅拷贝不是我们想要的,如何实现深拷贝? 互不影响呢?

方法:

1)JSON.stringfy 与 JSON.parse

2) Array 的 slice 和 concat 方法 返回新数组

var arr = ["One","Two","Three"];

var arrtoo = arr.slice(0);    //从数组下标0开始复制整个数组
arrtoo[1] = "set Map";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtoo + "<br />");//Export:数组的新值:One,set Map,Three
concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
语法
arrayObject.concat(arrayX,arrayX,......,arrayX)
说明
返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。


var arr = ["One","Two","Three"];

var arrtooo = arr.concat();
arrtooo[1] = "set Map To";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtooo + "<br />");//Export:数组的新值:One,set Map To,Three

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值