模板字符串
两个特点 : 1 可换行 ,2 拼接直接以${...}的形式拼接
结果:
对象写法简化
对象中属性相同的赋值可以简写,方法申明本来也可以简写(把冒号和小括号去掉)
等于右边
Symbol
特点:
1 Symbol的值是唯一的,要来解决命名冲突的问题。
2 Symbol值不能与其他数据进行运算
3 Symbol定义的对象属性不能使用for ... in 遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名
Symbol创建方式:
两种方式有些不同,上面两种是不一样的,下面两种是一样的。
作用:
1
在这之前,我们通常定义或访问对象的属性时都是使用字符串
let obj = {
abc: 123,
"hello": "world"
}
obj["abc"] // 123
obj["hello"] // 'world'
(abc属性可以通过obj.abc访问,也可以通过obj["...."]的形式访问)
而现在,Symbol
可同样用于对象属性的定义和访问:
const a = Symbol()
let obj = {
[a]: "一斤代码"
}
obj[a] // '一斤代码'
Symbol类型的key是不能通过Object.keys()
或者for...in
来枚举的,它未被包含在对象自身的属性名集合(property names)之中。所以,利用该特性,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。
作用2:
我们经常定义一组常量来代表一种业务逻辑下的几个不同类型,我们通常希望这几个常量之间是唯一的关系,为了保证这一点,我们需要为常量赋一个唯一的值(比如这里的'AUDIO'、'VIDEO'、 'IMAGE'),常量少的时候还算好,但是常量一多,你可能还得花点脑子好好为他们取个好点的名字。(因为常量用的是const不能只申明不复制,赋值很麻烦)
const TYPE_AUDIO = 'AUDIO'
const TYPE_VIDEO = 'VIDEO'
const TYPE_IMAGE = 'IMAGE'
function handleFileResource(resource) {
switch(resource.type) {
case TYPE_AUDIO:
playAudio(resource)
break
case TYPE_VIDEO:
playVideo(resource)
break
case TYPE_IMAGE:
previewImage(resource)
break
default:
throw new Error('Unknown type of resource')
}
}
现在有了Symbol
,我们大可不必这么麻烦了:
const TYPE_AUDIO = Symbol()
const TYPE_VIDEO = Symbol()
const TYPE_IMAGE = Symbol()
作用3:
在JavaScript中,是没有如Java等面向对象语言的访问控制关键字private
的,类上所有定义的属性或方法都是可公开访问的。因此这对我们进行API的设计时造成了一些困扰。
而有了Symbol
以及模块化机制
,类的私有属性和方法才变成可能。
最简单