浅拷贝与深拷贝
浅拷贝与深拷贝 (深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的)浅拷贝只复制指向某个对象的指针而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
赋值和浅拷贝的区别
当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即:默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。
浅拷贝的实现方式 var obj1 = {
'name' : 'zhangsan',
'age' : '18',
'language' : [1, ...
js语法收集
判断执行if(el){
query(el)
}
el && query(el)
if(el){
el = query(el)
}
el = el && query(el);
if(!el) return
el = query(el)
// 是否存执行方法 或者读取数据
let object = {
name:'张三',
hobby:{
a:'钓鱼',
b:'滑板'
}
}
// 意思是如果object存在就取hobby(否则终止),如果hobby存在就取a(否则终止)。当有一个不存在的时候就取|| 后面的默认值
let a = object?.hobby?.a || '暂无数据'
// || 与 ??
// ?? 只会过 null 与 undefined
// || 当数据为 '', 0, null, undefined, false 都会走默认值
axios.get('/...').then(res => {
if(re ...
markdown 写法备注
标题
一级标题二级标题三级标题四级标题
无序列表
1
2
3
有序列表
列表
列表
列表
分割线
代码块 ```
文本样式
字体倾斜 > 字体倾斜 字体倾斜 字体加粗 > 字体加粗 字体加粗 字体删除 > 字体删除 ! 符号与字体之间不要有空格
作用域是什么-词法作用域
作用域是什么
存储变量的规则存储在哪里?怎么获取?
var a = 2
为一个变量分配内存,名字为a,将值为2保存进这个变量(不完全正确)
var a 编译器会询问作用域是否已经存在这样一个变量存在于同一个作用域内,如果有编译器会忽略该声明,继续编译,如果没有,他会要求作用域在当前作用域内声明一个新的变量,并命名为a。
接下载编译器会为引擎生成运行时所需要的代码,这些代码被用来处理a = 2 的操作,引擎运行时会询问作用域当前作用域集合中是否存在叫做a的变量,如果有,就是用该变量,如果没有会再向再外层的作用域询问,最终会到全局作用域。找到后会将2赋值给它,找不到就会抛出异常
总结:变量的赋值操作会执行两个动作,编译器在作用域中声明,运行时引擎会查找该变量并进行赋值。
编译器:LHS查询 查找类型RHS(LHS,RHS),当变量出现在赋值操作的左侧时进行进行LHS查询,出现在右侧时进行RHS查询。
console.log(a) 执行的是RHS,要去找a的值;
a = 2 执行的是LHS 要为=2找到赋值的目标。
LHS:赋值操作的目标是谁;目的是对变量进行赋值
RHS: ...