字面量增强
计算属性、方法、属性的写法简写
解构赋值
数组解构
var name1 =['abc','aaa','bbbb']
// 数组的解构
var [item1,item2,item3] = name1
console.log(item1,item2,item3);
对象解构:
var obj = {
name: 'aaa',
age: 15
}
var { name, age } = obj
//重新命名
var { name: newName } = obj
//给默认值
var { name: newName = "bbb" } = obj
let 和 const基本使用
-
var:里面的for/if不存在块级作用域 (ES5)
-
let:变量不能重复声明,拥有块级作用域,不存在变量的提升,不影响作用域链(高级版var)
-
const: 声明常量(指向的对象不能修改,但可以修改对象内部的属性),一定要赋初始值,最好用大写,拥有块级作用域,常量值不能被修改,但对数组和对象的元素进行修改时,不算对常量的修改,指向的内存地址不做改变(优先使用const) 传递的值不可改变,保证了安全性
let 和 const定义的变量名是不可以重复定义,没有作用域提升
块级作用域
早期只有 全局作用域 和 函数作用域
函数作用域:外部访问不到 函数里面的变量
ES6中新增加 块级作用域,对let/const/class声明的类型是有效的
{
//块级作用域
let foo = 'why'
}
for/if/switch也是块级作用域(使用let/const)
早期:for、if里面都没有块级作用域会导致很多的遍历,值面临被修改的操作,循环直接得到的是最后的值
-
解决方法:闭包(函数是一个作用域)/立即执行函数/var改为let(不能使用const不允许再赋值)
-
早期 使用 function作用域解决块级作用域问题
暂时性死区temporal dead zone(TDZ):在一个代码中,使用let、const声明的变量,在声明之前(执行之前),变量是不可以被访问的
模板字符串(``)
嵌入JS的变量或者表达式来进行拼接
`my function is ${foo()}`
标签模板字符串
如果我们使用标签模板字符串,并且在调用的时候插入其他的变量:
模板字符串被拆分了;
第一个元素是数组,是被模块字符串拆分的字符串组合;
后面的元素是一个个模块字符串传入的内容;
function foo(m, n) {
console.log(m, n, '------')
}
const name = 'hhhh'
const age = 18
//在函数后面直接使用模板字符串来调用该函数
foo`Hello${name}w${age}orld`
//[ 'Hello', 'w', 'orld', '' ] hhhh ------
函数的默认参数
默认值通常放在最后,有默认值的参数,不算在length个数中
function foo(m = 'aa', n = 'bb') {
console.log(m, n)
}
foo()
对象的解构赋值
function foo({ name, age } = { name: 'aa', age: 'bb' }) {
console.log(name, age)
}
foo()
rest 剩余参数
如果最后一个参数是...为前缀的,会将剩余的参数放到该参数中,作为一个数组
放在最后
function foo(m, n, ...args) {
console.log(m, n)
console.log(args)
foo(10, 20, 30, 5555, 44444)
//10 20
//[ 30, 5555, 44444 ]
}
rest剩余参数和arguments的区别
rest剩余参数只包含没有对应形参的实参,arguments对象包含了传给函数的所有实参arguments对象不是一个真正的数组,rest参数是一个真正的数组,可以进行数组的所以操作
箭头函数
//一个参数 可以省略小括号 只有一句执行代码可以省略花括号
const text = (参数) =>{}
使用场景:准备将一个函数作为参数传递给另外一个函数时
setIimeout(()=>{},1000)
箭头函数里的this指向 向外层作用域中(作用域链),一层层查找this,直到查到this,注意同级
this没有指向,只能往外找,找最近的作用域里的this
箭头函数是没有显式原型的,所以不能作为构造函数,使用new来创建对象
普通函数的指向为window全局对象
展开语法 Spread syntax
const names = ['11', '22', '33', '44']
const name = 'why'
//1.调用函数时 根据传递的参数个数来展开
function foo(x, y, z) {
console.log(x, y, z)
}
// foo(...names) // 11 22 33
// foo(...name) //w h y
//2.构造函数时
const newName = [...name, ...names]
console.log(newName)
//3.构建对象字面量时
const info = { name: '111', age: 118 }
const obj = { ...info, address: '杭州' }
console.log(obj);
//{ name: '111', age: 118, address: '杭州' }
可以在函数调用/数组构造时,将数组表达式或者string在语法层面展开;
还可以在构造字面量对象时, 将对象表达式按key-value的方式展开;
展开语法的场景:
-
在函数调用时使用;
-
在数组构造时使用;
-
在构建对象字面量时,也可以使用展开运算符,这个是在ES2018(ES9)中添加的新特性;
注意:展开运算符其实是一种浅拷贝;
数值的表示
const num = 100
const num2 = 0b100 //二进制 4
const num3 = 0o100 //十进制 64
const num4 = 0x100 //十六进制 256
//数值大的连接符 `_`
const num5 = 100_000_000
console.log(num, num2, num3, num4)