JavaScript(六)-对象

//1.定义对象
var  obj={a:1,b:2};
//a是obj的key
//1是obj的key属性的value;
//键值对key-value;

//2.给对象的key赋值
obj.a=10;//直接定义对象obj的属性a的值是10

//3.给对象添加新属性(方法一)
obj.c=20;//现在给obj对象创建一个新属性c,并且设置这个新属性的值是20
//打印属性值(方法一)
console.log(obj.c);

//4.给对象添加新属性(方法二)
obj["d"]=30;//即obj.d=30;
//打印属性值(方法二)
console.log(obj["d"]);//即cosole.log(obj.d);

对象属性有两种写法:
(1)点语法
(2)中括号[]的写法
区别:
1.obj.a 点语法是不需要双引号
obj[“a”] key的写法必须有双引号
//为什么要有双引号?
在这种写法时,要求属性名必须是字符型(或symbol型)

        var a="ab";
        obj[a]=40;
        //这里a是变量,可以理解为将"ab"的字符串作为obj的属性
        console.log(obj.ab);

那么什么时候加双引号?
属性是字符串的时候就需要加双引号,是变量就不需要加双引号

var s="眼睛";
小明[s]=2;
小明["眼睛"]=2;
小明.s=2;//这里使用点语法时不能使用变量
//这种写法会造成给小明添加s属性,他的值是2,并没有添加眼睛属性
		var obj={a:1,b:2};
        var o="a";
        console.log(obj[o]);//1
        console.log(obj.o);//undefined
		var o="a";
        console.log(obj[o]);//1,o没有加双引号是变量
        console.log(obj["o"]);//3,o是字符串
        console.log(obj.o);//3,点语法,不能加变量,所以不需要双引号,默认是o属性
var n=9;
obj[n]=100;//如果变量的值不是字符,会隐式转换为字符,会将n的值转换为字符9,设置为属性

var m=true;
obj[m]=10;//这里会将任何变量不是字符串的隐式转换为字符串

当使用对象[变量],如果变量不是字符型,会隐式转换为字符型,并且将这个字符串作为该对象的属性名;

var o={a:1};
var o1={b:2};
var o2={};

o2[o]=10;//o转换为字符串时是"[object Object]"
o2[o1]=20;//o2转换为字符串时是"[object Object]",则会覆盖
console.log(o2[o]);//20

遍历对象

	var obj={
            a:1,
            b:2,
            c:3,
            d:4,
            e:undefined
        }

        console.log("e" in obj);//e是不是obj的属性名
        for(var prop in obj){
            // 将所有obj中的属性名分别赋值给prop这个变量
            console.log(prop);//key
            console.log(obj[prop]);//value
        }

运行结果:
在这里插入图片描述
js中的对象遍历是根据对象属性添加的先后来遍历,对象遍历是有顺序的

		var o={f:10,g:20};
        for(var prop in obj){
            o[prop]=obj[prop];
        }

        console.log(o);

即:

o=Object.assign(o,obj);//用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。o是目标对象,obj是源对象

JSON串

		var obj={a:1};
        console.log(obj);

        var str=JSON.stringify(obj);
        console.log(str);

1.JSON.stringify(obj)//转为JSON串
运行结果:
在这里插入图片描述
2.JSON串转换为对象

		var s='{"b":2}';
        var o=JSON.parse(s);//将JSON字符串转换为对象
        console.log(o);

运行结果
在这里插入图片描述

堆和栈

1、栈的数据读取、写入速度较快,但是存储的内容较少
2、堆的读取和写入速度较慢,但是存储的内容较多
内存 硬盘
重启电脑内存就会清除
3、字符型、数值型、布尔型、undefined存在栈中;
4、对象存储在堆中;
5、栈中,一旦该变量不再使用则会被清理掉
6、当点击对象前面的箭头时,才去堆中对应的地址去取数据
7、引用地址就是指堆中对象存储的地址

内存泄漏:对象的引用列表中变量并没有清除掉引用关系,因此就不会被垃圾回收机车回收

var obj={a:1};
obj=3;
//{a:1}的引用列表中仍然是obj
//obj已经是新的值3了,于是没有任何方法在获得{a:1}
//这个对象也就不会被回收了

obj=null;//在{a:1}的引用中删除了obj的引用
//obj=3;重新给obj赋值给3;
//当内存占用到一定的时候,就会有一个垃圾回收车将所有堆中没有引用关系的对象回收
		var obj={a:1};
        var obj2={a:1};
        //当使用{a:1}这就是在堆中创建了一个新的对象,就会有一个的新的引用地址
        //上面两个{a:1}相当于创建了两个对象,他们的引用地址是不同的
        console.log(obj===obj2);//false

删除属性

		var o={a:1};
        o.b=10;
        delete o.a;//删除属性
        console.log(o);
var  obj={
            a:1,
            b:2,
            c:{
                d:10,
                e:20
            }
        }
        // 浅复制
        // var o1={};
        // for(var prop in obj){
        //     o1[prop]=obj[prop];
        // }
        // var o1=obj;
        // obj.a=10;
        // obj.c.d=100;
        // console.log(o1);

       // 深复制
        var o1=JSON.parse(JSON.stringify(obj));
        obj.c.d=100;
        console.log(o1);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值