你不知道的JS系列-6
概述
断言
ES6
- 语句由一个或多个表达式组成
- 一个独立的表达式也可以称为表达式语句
- JavaScript 引擎实际上是动态编译程序,然后立即执行编译后的代码
- 在 JavaScript 中作为常量的变量用大写表示,多个单词之间用下划线 _ 分隔
- JavaScript 中,只有值有类型;变量只是这些值的容器
- 如果一个函数内部有一个 this 引用,那么这个 this 通常指向一个对象。但它指向的是哪个对象要根据这个函数是如何被调用来决定。this 并不指向这个函数本身
- 默认值表达式是惰性求值的,这意味着它们只在需要的时候运行
解构
对象的结构赋值,与常见的赋值逻辑相反:
const { a: X, b: Y }={a:10,b:20}
const {M,N}={M:1,N:2}
console.log([X,Y]) // [10,20]
console.log([M,N]) // [1,2]
常规赋值是,target:source
模式,从上面例子可以看到他是反转的,将:
左侧的值赋值给右侧,即source:target
模式
简洁属性/方法
ES6中可以将对象的属性简化:
const x = 2, y = 3,
o = {
x,
y
}
同样,对于方法也可以简化
const o={
x(n){
return n
},
y(m){
return m
}
};
但是这种简洁写法也存在一定弊端,譬如内部引用时:
const run={
some:function some(x,y){
if(x<y) return some(y,x)
return x-y
}
}
console.log(run.some(1,4))
console.log(run.some(4,1))
此时我们无法用简洁模式表达(或者说会产生其他隐患问题),但需来取即可
super
标签模板
模板字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)
const a=10;
const b=2;
function foo(...arg){
console.log([...arg])
}
foo`Hello ${ a + b } world ${ a * b }`; // [[ 'Hello ', ' world ', '' ], 12, 20 ]
从上面例子也可以看出等同于foo([ 'Hello ', ' world ', '' ], 12, 20)
标签模板调用函数时,函数的第一个参数是一个数组,该数组的成员是模板字符串中那些没有变量替换的部分;被替换的部分作为后续参数依次传入。
箭头函数
在箭头函数内部,this 绑定不是动态的,而是词法的
for of 循环
JavaScript 中默认为(或提供)iterable 的标准内建值包括:
- Arrays
- Strings
- Generators(迭代器)
- Collections / TypedArrays ( 类数组)
普通对象并不适用for of循环