1.for循环的循环变量区和内容区是2个作用域
for(let i=0;i<10;i++){
let i = 'abc';
console.log(i);//abc 此处的i与循环体中的i是2个作用域
}
2.let+const
- 暂时性死区:只要定义了该变量,就不再受外部的影响
- 不存在变量提升
- 不能重复声明
- const在声明的时候就要初始化,一经初始化就不能再改变
- const实际是指向的内存地址不可变:如指向一个对象,对象的属性是可以修改的
- let const声明的全局变量不再是顶层对象window的属性,之前的var function声明的全局变量仍是window的属性
3.块级作用域
4.Object.freeze({}) 冻结某个对象,该对象不能再添加、修改属性
5.解构赋值:比较有用的就是对象、数组+函数参数的结构赋值
-
对象的解构赋值:
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };//重新起名 baz // "aaa"
-
解构赋值还是不要用圆括号了吧,那么难受:总之就是解构赋值里 声明语句里与模式不能加圆括号
6.字符的扩展:有必要扩展一下,参见:字符、字节、编码
最有用的当算 模板字符串了 :`aaaa${变量或者表达式}bbbb`
str.length返回的是字符的字节编码的长度,非字符串的长度。
for循环是以字符的字节长度遍历,for...of循环以字符的长度进行遍历。
字符串补全功能 可以用于时间的显示上,比如2:00点,显示成02:00,可以用:'2'.padStart(2, '0');
7.函数的扩展
最重要:箭头函数 -
箭头函数不能做构造函数和generator函数
-
箭头函数没有自己的this,它的this其实是外层作用域的this
-
箭头函数的this是定义时的this,而不是使用时的this
-
箭头函数内部不能使用arguments对象,但可以使用rest对象
8.数组的扩展
扩展运算符... -
...应用于数组,相当于将数组转为逗号分隔的值
9.proxy 对目标对象进行筛选拦截,改变默认行为。如get、set、getPrototypeOf等近13种行为。
Reflect与proxy功能类似,只不过是以函数的形式进行调用
Reflect.get(target, keyName)
10.对象的扩展:
Object.is(a,b) 用来比较两个值严格相等(类似===)不会做类型转换,但是 :
-0 === +0;//true
Object.is(-0, +0);//false
NaN === NaN;//false
Object.is(NaN, NaN) // true
让某个对象成为另外一个对象的原型,方法有:
a. es5的方法 var obj = Object.create(prototypeObj);
b. es6的方法 Object.setPrototype(obj, prototypeObj);
c. obj.prototype = prototypeObj;
11.Iterator接口
调用Iterator接口的地方:
数组、Set数据的结构赋值
扩展运算符...
for...of Array.from()等
yield * [2, 3, 4]
- Set & Map
const a = new Set([1, 2]);
a.size
a.add(2);
a.delete(2);
a.has(4);
a.clear();
// 去除数组的重复成员
[...new Set(array)]
[...new Set('ababbc')].join('')
// "abc"
// Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致
// WeakSet 与Set类似,但是成员只能是对象。
网友评论