深入浅出篇 — ES6新特性(一)

280 阅读3分钟

变量:

一. let:

  1. let(块级变量声明)的特点:
  • 没有变量声明提升,不能重复定义,不挂载到window
  • 声明的变量和 {} 配合产生块级作用域 --- 生命在大括号内部的变量无法在外部使用
  • 产生临时死区
  • 解决闭包问题

a. 不存在变量提升:

例:
console.log(a)      // ReferenceError
let a = 10  

b. 同一个作用域下不能重复定义同一个名称

例:
let a =100 
let a =200
console.log(a)      //  ReferenceError

let a =100 
    a =200
console.log(a)      //  200 可以这样写
特别提醒 : 同一个作用域下,不同的作用域是可以声明同一个名称的

c. 严格的作用域-块级作用域

例:
1. 
function fun (){
    var n =10
    if(true){
        var n = 100
    }
    console.log(n)
}
fun()   // 100

2. 
{
    let a =10
}
console.log(a)  // 报错

3. 
{
    var a =10
}
console.log(a)  // 10  这就可以

4. 
let a = 10
{
    console.log(a)   // 10 
}
// 块级作用域并不是完全封闭,里面的还是可以用外面的变量

d. 临时性死区

例:
1.
let a = 10
{
    console.log(a)  //报错
    let a = 20
}
//如果在块级作用域内有用let声明的变量,那么只会找该作用域内的变量

2. 
let a = 10
{
    console.log(a)  //  10
    // 块级作用域并不是完全封闭,里面的还是可以用外面的变量
}

e. 解决了闭包

例:
    1. 
    var arr = []
    for (var i = 0; i < 10; i++) {
        arr[i] = function () {
            console.log(i)
        }
    }
    arr[0]()  // 10
    arr[4]()  // 10
    arr[7]()  // 10
    
    2. 
    var arr = []
    for (let i = 0; i < 10; i++) {
        arr[i] = function () {
            console.log(i)
        }
    }
    arr[0]()  // 0
    arr[4]()  // 4
    arr[7]()  // 7

二. const:

  1. const的特点:
  • 一经声明,常量的值就不可改变
  • 只声明,不赋值,也报错
  • let的特点const也都有

a. const声明是一个只读常量,一经声明,常量的值就不可改变

例:
const PI = 3.1415;
PI = 3;  //报错

b. 只声明 不赋值 也报错

例:
const foo;  //报错

c. const实质:

  • const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动
  • 对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量
  • 但对于复合类型的数据(主要是对象和数组),变量指向的内存地址
例:
const foo = {};
foo.prop = 123;  // 这样是可以的
foo = {}   // 但你又重新开一个内存地址,这就不行了
//所以若定义引用类型时是地址不能改变

d. let有的性质,const也都有

箭头函数

  1. 箭头函数的特点:
  • 不用function关键字
  • 只能作为函数使用而不能用new,没有原型
  • 参数不能重复命名
  • 返回值可以不写return,但有时要配合 {}
  • 内部arguments this 由定义时外围最接近一层的非箭头函数决定
  1. 写法
例:
    1.
    var f = v => v 
    //变量名 =参数 => 函数体
    2.
    var f= function(n1,n2){
    return n1 + n2
    }
    相当于
    var f = (n1,n2) => n1+n2
    3.
    var f= function(n1,n2){
        fun(n1 , n2)
    }
    相当于
    var f = (n1,n2) => {fun(n1 , n2)}
小知识点:
  • 在es6中对象里想写一个属性,并且属性为函数,特殊写法

      let obj={
          fn:function(){}
          
          //可以换成下面这种写法
          fn(){}
      }