深浅复制、垃圾回收

本文详细介绍了JavaScript中创建对象的构造函数和字面量方法,以及如何通过点语法或括号语法访问对象属性。讨论了对象的属性、方法、存储结构和遍历查找。同时,讲解了深复制与浅复制的区别,推荐使用JSON.parse(JSON.stringify())实现深拷贝,以及Object.assign()进行浅拷贝。此外,还提到了JavaScript中的垃圾回收机制和函数的定义、参数、返回值以及作用域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对象

创建对象的方式:

构造函数创建法
var o=new Object();
字面量创建法:
var o = {
    a:1;//a 为键 1 为值
    b:2;
}
故对象是以键值对的形式存在  key  value  每个key对应唯一的value

如何打印输出对象

键必须是字符串或者Symbol,如果不是则会隐式转换为字符串
        console.log(o.a);       //用点语法不加双引号
        console.log(o["a"]);
        对象的存储一共有两种情况,一种是存储数据,一种是存储函数
        存储数据的叫做对象的属性,存储函数叫做对象的方法
        var o = {
             a: 1,
             b: true,
             c: {
                 d: 10
             },
             e: function () {

             }
         }

对象中存储的内容 相互之间是没有关联的
如果需要在对象中查找是否有某个键 (“a” in o);
如果需要在对象中查找是否有某个值,只能通过for in遍历对象查看每个值是否满足

for(var i in o)
var a=String.fromCharCode(122);//将asscii转换为字符  97-122就是小写字母a-z
console.log(a);   
//String.fromCharCode(num1[, ...[, numN]])返回由指定的UTF-16 代码单元序列创建的字符串

例:将小写a-z,按1-26的数字顺序打印出来
    str = "";
    for(var i = 1;i<27;i++){
        str = String.fromCharCode(i+96)
        console.log(str+":"+i)
}
对象的赋值
var o = {a:1};
var o1= o;  //这是将o对象的引用地址赋值给了对象o1,新旧对象还是共享同一块内存
o1.a = 10;//因此修改两个对象中的任何一个的属性和属性值,另一个对象内也会跟着发生改变
console.log(o.a)

深复制和浅复制

首先我们知道,数据是分为基本数据类型和对象数据类型的,基本数据类型存储在栈中,栈的内存小但是读取速度快,而对象数据类型存储的是该对象在栈中引用,真实的数据存放在堆内存里,堆的空间大读取速度慢。
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

深复制

实现方式:JSON.parse(JSON.stringify())
let arr = [1, 3, {
   username: ' kobe'
}];
let arr4 = JSON.parse(JSON.stringify(arr));
arr4[2].username = 'duncan';
console.log(arr, arr4)

原理: 用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。

浅复制

实现方式:Object.assign()

Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。

浅复制
var obj = { a: {a: "kobe", b: 39} };
var initalObj = Object.assign({}, obj);
initalObj.a.a = "wade";
console.log(obj.a.a); // wade

但是需要注意的是当object只有一层的时候,是深复制
let obj = {
   username: 'kobe'
};
let obj2 = Object.assign({},obj);
obj2.username = 'wade';
console.log(obj);//{username: "kobe"}

垃圾回收机制(Garbage Collection,GC)

一般来说没有被引用的对象就是垃圾,就是要被清除

   var o={a:1};
将栈中变量o设置为null,表示不在引用对象,然后将堆中这个对象的引用列表中这个变量去除。

内存泄漏:大量的不使用的引用对象,没有被标识为null,并且还在不断生成和丢弃

函数

函数的结构形态

function 定义函数
fns 函数名 可以自己起,与变量起名方式相同,并且它本身就是变量。(a,b)可以向函数中注入的数据,a,b叫做参数,你注入几个数据就要声明几个参数
{} 就是函数执行的语句块
arguments 所有通过执行函数时传入的参数的列表
return 跳出当前函数,不再执行return以后的语句,并且可以返回一个数据, 如果函数中没有return,或者直接return没有返回数据,则返回undefined
function fns(a,b){
console.log(arguments);
return 10;
}

全局中定义了一个变量a=5;
在任何位置都可以调用全局变量
函数外使用var定义的变量都是全局变量

在函数内使用var 定义的变量都是局部变量,就是该函数的内的局部变量
只能在该函数内调用,不能再函数还或者别的函数中调用
局部变量只能再当前函数内定义,并且函数执行完成后会自动销毁该局部变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值