一、let & const
ES6 之前声明变量时使用的是 var,它有几个特点
- 变量声明提升
- 计数是容易泄露成全局变量
因为在 ES6 以前,只有两种作用域,全局作用域和函数作用域,如果在声明变量的时候不想让它变成全局变量,就要声明一个函数,放入函数中
ES6 以后变量声明就方便了,变量声明更推荐使用 let 和 const,特点如下
- 先声明再使用
- 声明的变量在块级作用域中
- 不能重复声明
- const 声明时必须赋值,且不能更改
let 有一个用法,JS 帮我偷偷加了一些东西
for(let i=0;i<6;i++){
console.log(i)
}
// 0 1 2 3 4 5
// JS 悄悄在块级作用域里又声明了一个变量
for(let i=0;i<6;i++){
let j=i;
console.log(j)
}
var、let、const 原理
- var
会直接在栈内存里预分配内存空间,然后等到实际语句执行的时候,再存储对应的变量,如果传的是引用类型,那么会在堆内存里开辟一个内存空间存储实际内容,栈内存会存储一个指向堆内存的指针。 - let
是不会在栈内存里预分配内存空间,而且在栈内存分配变量时,做一个检查,如果已经有相同变量名存在就会报错。 const
也不会预分配内存空间,在栈内存分配变量时也会做同样的检查。不过const存储的变量是不可修改的,对于基本类型来说你无法修改定义的值,对于引用类型来说你无法修改栈内存里分配的指针,但是你可以修改指针指向的对象里面的属性。var 把“声明”和“初始化”提升到前面
- let、const 只是把“初始化”提升到前面,没有做“初始化”操作
console.log(a)
var a = 1
// undefined
console.log(b)
let b = 2
// Uncaught ReferenceError: Cannot access 'b' before initialization
console.log(c)
const c = 3
// Uncaught ReferenceError: Cannot access 'c' before initialization
console.log(d)
// Uncaught ReferenceError: d is not defined
参考:https://www.jianshu.com/p/12c186deb6fe
二、箭头函数
箭头函数的特点就是不接受 this 参数,弱化了 this 的用法
三、三个点语法
默认参数和剩余参数
// 默认参数
function sum(a=0,b=0){
return a+b
}
// 剩余参数
function sum(message,...numbers){
let result = 0
for (let i=0;i<numbers.length;i++){
result += numbers[i]
}
return message + result
}
sum('结果是',1,2,3,4,5,6,7,8,9)
伪数组变数组
// 用 ES6 的 ...
let arguments = [...arguments]
// ES6 提供的 API
let arguments = Array.from(arguments)
展开操作符
let array1 = [1,2,3,4,5,6]
let [a,b,c,...array2] = array1
console.log(array2) // [4,5,6]
let array1 = [1,2,3,4,5,6]
let array2 = [0,...array1,7]
console.log(array2)
解构赋值
let a = 1
let b = 2
[a,b] = [b,a] // JS 不能括号开头
console.log(a,b)
// 2 1
对象的解构赋值
let {name,age,gender} = {name:'zhangsan',age: 18,gender: 'male'}
let {name:xingming} = {name:'zhangsan',age: 18,gender: 'male'}
// 把结构赋值后的内容重命名
解构赋值 + 默认参数
let [a=7,b=8] = [1]
浅拷贝
// 浅拷贝,把对象中的属性一一拷贝
let objA = {name:'a'}
let objB = Object.assign({},objA)
// ... 语法
let objB= {...objA}
对象合并
let objA = {p1:1,p2:2}
let bojC = {p1:111,p3:3}
let objB = Object.assign({},objA,objC)
console.log(objB)
// ... 语法
let objB = {...objA,...objC}
变量作为对象的 key
let key = 'x'
let value = 'y'
let obj = {}
obj[key] = value
// ES6 的变量变成 key
let obj = {
[key]: value
}
四、新版字符串
const a = "Hello"
const b = "World"
const string = `${a} ${b}`
let name = 'Eddie'
let person = '人'
let fn = function(){
console.log(arguments)
}
fn`${name}是一个${person}`
// ["","是一个","好人"]
「@浪里淘沙的小法师」