js对象的循环引用

JavaScript012

js对象的循环引用,第1张

1 .当一个对象的属性是自己的时候,使用JSON.stringify或者一般的没有处理的deepClone的时候会发现栈溢出

1 .json序列化的时候,序列化的对象尽量避免循环依赖,子类不定义与父类相同名称的成员,避免定义非成员变量的getter、setter方法

1 .出现循环引用的时候算是bug么?要怎么处理

2 .webpack里面也会有这种情况,循环依赖a-b-c-a

3 .对象存在循环引用的时候,打印不会出现栈溢出,深拷贝的时候,才会的导致栈溢出

1 .定义了引用类型的变量后该变量存的是堆内存的地址,通过地址访问堆内存的数据,从而产生了引用。而基本数据类型定义后存储的是数据值,不需要引用

2 .在js中对两个引用类型使用 === 判断是对两者的地址进行判断

3 .所以判断是否存在循环引用,可以简单定义为对象内部的属性是否和对象本身的地址相同

1 .去除对象中涉及到的循环引用的属性.消除循环引用JSON.decycle方法可以解除循环

2 .将循环引用中的一个对象缓存起来,以避免重复序列化或者创建

1.1 数据属性(`properties`),对象的普通属性将字符串名称映射到值。例如,下面对象obj有一个数据属性,名称为 prop,对应的值为 123:var obj = {prop: 123}可以用以下方式读取属性的值:console.log(obj.prop)// 123,console.log(obj["prop"])// 123,当然也可以用以下方式来设置属性的值:obj.prop = "abc"obj["prop"] = "abc"

1.2 访问器属性,另外,可以通过函数处理获取和设置属性值。 这些函数称为访问器函数。 处理获取的函数称为getter。 处理设置的函数称为setter:var obj = {get prop () {return 'Getter'},set prop (value) {console.log('Setter: ' + value)}}访问 obj 属性:>obj.prop'Getter'>obj.prop = 123Setter: 123。

1.3 内部属性一些属性只是用于规范,这些属于“内部”的属性,因为它们不能直接访问,但是它们确实影响对象的行为。内部属性有特殊的名称都写在两个方括号,如:内部属性[[Prototype]]指向对象的原型。它可以通过Object.getPrototypeOf()读取。它的值只能通过创建具有给定原型的新对象来设置,例如通过object.create()或__proto__ 。

内部属性[[Extensible]]决定是否可以向对象添加属性。可以通过Object.isExtensible() 方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。可以通过Object.preventExtensions()方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。

属性特性(attribute),属性的所有状态,包括数据和元数据,都存储在特性(attribute)中。它们是属性具有的字段,就像对象具有属性一样。特性(attribute)键通常用双括号编写:

是不一样的,可以这么说,同一个构造函数,无论在哪儿实例化对象,在内存中的地址是不一样的,没实例化一次,就会对应新的内存地址。你可以在构造函数中,声明一个随机数变量:如var suiji = Math.random() 然后实例化对象,输出这个变量,那肯定不是一样的,说明不是一块内存地址。