第二章---一.对象

对象

var o={a:1,b:2};
o.a  o对象下的a属性
o.a=值 可以设置属性的值

对象的结构形式是键值对结构   键(key)  值(value)  成对
a 键   1  值
键值对中不能出现重复的键
var o={a:1,a:10} 错误
在对象中键 只能是string或者symbol


var b=false;
    o.b=10;这里的o.b  这个b不是变量b而是字符串b

    o对象下的键是变量b的值
    o[b]=10;
    var a="c";
    var b="d";
    o[a][b]=100;
  var obj={};

obj.a=10; 在obj下设置一个a属性,这个属性值是10
obj[“a”]=10; 在obj下设置一个a属性,这个属性值是10
点语法对于属性名有要求,必须是类似于变量的命名法则方式,不能直接写数值,非法符号
但是对象的键是字符串就可以,允许有各种字符,如果有其他各种字符键时,我们使用[key]写入

在key使用时没有使用""字符串,这时候给入的这个内容系统认为是变量,也就是将变量的值作为key

 var a=10;
    obj[a]=10;
    obj={"10":10};
	obj["a"]={};

    obj["a"]={};
    obj["a"]["b"]=2;  // {a:{b:2}}

任何内容作为key时,都会被自动转换为字符串
var a;
var b;
作为对象的key属性是,都会吧这个变量的值转换为字符串。a变量的值是undefined,转换为字符串时就会变成“undefined”
o[a]=10—>o[“undefined”]=10; 变量没有使用"",所以变量是把值作为这里key
o[“a”]=20;—>o[“a”]=20; 使用"“都是字符串
打印o[b] 先把b转换为字符串 “undefined” 获取对象o中的属性"undefined” 在对象中
刚才设置这个"undefined"的值是10,因此获取到了结果是10

- 对象的遍历

   var obj={a:1,b:2,c:3,d:4,e:5};
    for  in    遍历对象的所有key
    for(var key in obj){
   
    }

在其他语言中对象的遍历是无序的 在js中对象的遍历是有规则的
所有的key是数值的优先按照从小到大的顺序遍历,然后再遍历其他的key,按照创建的先后顺序遍历。

- 对象的存储

var o={a:1,b:2};
为啥要做对象。
var a=1;
var b=2;
var c=3;
需要在栈中开辟多个空间,无法归类
栈就相当于内存,堆就相当于硬盘
栈的速度快,堆的速度慢,栈的空间小,堆的空间大
归类存储,就有对象
{id:10001,name:“mac pro”,price:20000,num:1},
{id:10002,name:“iphone 13 pro”,price:8000,num:2},
存在堆中,并且产生一个堆中引用地址

- 引用地址赋值

下面就是把引用地址赋值,obj和obj1的结果都是同一个引用地址

 var obj={a:1,b:2};
 var obj1=obj;
 
  obj.a=2;  修改引用地址所对应的对象
  obj={a:2,b:2};   修改了引用地址
 
 
   var obj={a:1,b:2};
 
 
     function fn(o){
         o.a=10;
     }
     fn(obj);
 
     console.log(obj);
 
 
      function fn(o){
         o={a:10};
      }
 
     fn(obj);
     console.log(obj);

- 复制对象

浅复制

var obj={a:1,b:2,c:3};
var obj1={};
// obj1.a=obj.a;
for(var key in obj){
    obj1[key]=obj[key];
}
obj.a=10;
console.log(obj1,obj);

深复制

function cloneObj(targetObj,sourceObj){
            for(var key in sourceObj){
                if(typeof sourceObj[key]==="object" && sourceObj[key]!==null){
                    var o={};
                    targetObj[key]=o;
                    cloneObj(o,sourceObj[key])
                }else{
                    targetObj[key]=sourceObj[key];
                }
            }
        }

JSON

JSON.stringify(obj) 将对象转换为JSON字符串
JSON.parse(str)  将JSON字符串转换为对象
 错误
    Unexpected token d in JSON at position 22 JSON字符串有错误
    Unexpected token b in JSON at position 0 

这样也可以深复制

 var o=JSON.parse(JSON.stringify(obj));

删除属性

var obj={a:1,b:2};
delete obj.a;

对象的删除

null  切断引用关系,清除引用列表对应的内容
var obj={a:1,b:2};
 var obj1=obj;
 obj=null;
 对象{a:1,b:2} 的引用变量只有obj1,如果想要彻底清除这个对象
 obj1=null;

因为null主要的目的是针对引用类型来完成切断引用关系的,所以主要对于引用类型来使用
原变量类型时引用类型也就是object类型,现在切断了引用关系,变量的类型不改变,仍然是object

内存泄漏

不断产生新的孤儿对象,但是没有清除其引用关系,这样会造成堆中引用数据的不断增加
然后占用了大量的堆中空间,造成新的数据减少了运行空间,而速度变慢,这就是内存泄漏

孤儿对象

 对象仍然存在在堆中,但是其引用地址指向某个变量,变量却指向其他的对象

垃圾回收

当内存上升到一定值,JavaScript虚拟机就会自动产生一次清除,这个清除会将
所有没有引用地址的对象清除掉,以释放堆栈中的空间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩逸客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值