ES6-let/const-块级作用域-rest-箭头函数-展开语法-数值的表示

690 阅读4分钟

字面量增强

计算属性、方法、属性的写法简写

解构赋值

数组解构

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定义的变量名是不可以重复定义,没有作用域提升

块级作用域

早期只有 全局作用域 和 函数作用域

函数作用域:外部访问不到 函数里面的变量

image.png

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)