关于const:
1.const声明的基本类型的值不可重复声明,不可修改,声明之后需要初始化,声明存在暂时性死区,只在声明的块级作用域内有效。
2.const本质上确保的是变量的内存地址的数值不会被改动,所以对于基本类型的值来说,数值在栈中保存,不会被修改;但是对于对象来说,const声明的对象不可以被改变的是内存地址,数据存在堆中,是可以被修改的,如果想不被修改需要freeze。
3.冻结对象后不能新添加属性,但是还可以修改原有属性,所以需要彻底冻结所有属性。
4.浏览器环境下顶层对象和全局对象都是指window对象,使用let,const等es6声明的全局变量或对象不再是属于顶层对象中的属性。
关于数组解构:
1.解构length左边>右边,多余的值为undefined,右边>左边,无影响。
2.解构可以使用默认值,省略值,解构右边必须可以遍历。默认值只有当右边严格等于undefined才生效,如var [a=1,b=2] = [3],此时b=2,因为省略情况也是相当于初始为undefined。null不严格等于(===)undefined,但是==,所以右边有null还是会等于null。
3.默认值为函数时是惰性求值,只有当需要求的时候才调用函数,如果右边有值就不调用。设置默认值可以是之前声明的变量,但是不可以是未被声明的变量,如x=y,y=1,这时x需要y的值,但是y还未被声明。
关于对象解构:
1.对象解构同名直接用,因为es6同名可以省略名值对成单独的名,不同名仍需要写全。注意模式和变量的区别,变量才有意义,模式只是去找到变量的途径,不会被赋值。
2.对象解构可以取得继承的值,如obj1是obj2的原型,那么let {obj1的属性} = obj2(obj2甚至可以是空对象),最后都能获取以obj1的属性为标识符的值。
let {foo:{bar:rr}} = {bar:‘baz‘} console.log(rr)
3.如上代码,如果未声明foo这个父对象,然后直接去取其子对象bar,那么就会报错,但是如果声明了就没有问题(后面替换为{foo:{bar:‘baz‘}})
今天就到这里
原文地址:https://www.cnblogs.com/harrywu96/p/12097920.html