重学ES6 let & const

若是没有历史包袱,如今作一些项目,不用考虑较低版本的浏览器,某软,如今本身都已经放弃本身的浏览器了,推荐使用Edge浏览器~javascript

那么,在前端工程化的趋势下,vue,react以及众多其余框架的大潮中,ES6仍是有它的用武之处的!前端

先从let const 热下身吧~vue

let

全部声明的变量,只在let命令所在的代码块内有效。java

for循环计数器就很适合使用let,若是用 var 来声明 for循环内的变量,有可能会致使外部某处的同名变量受到影响。react

还有一个很经典的输出问题前端工程化

var a = []
for(var i = 0;i < 10; i++){
    console.log(i)
    a[i] = function() {
        console.log(i)
    }
}
a[5]() //10
a[8]() //10
复制代码

由于i都指向同一个全局i,致使输出的是最后一轮的i值,也就是 10浏览器

可是若是用 let ,那就彻底不同了数据结构

var a = []
for(let i = 0;i < 10; i++){
    console.log(i)
    a[i] = function() {
        console.log(i)
    }
}
a[5]() //5
a[8]() //8
复制代码

由于,let声明的变量只在本轮循环有效,每一次循环都是一个新的变量~并且,for 设置循环的部分是父做用域,循环体内是子做用域框架

看demoui

for(let i = 0;i < 3; i++){
    let i = 'hahaha'
    console.log(i)
}
//hahaha
//hahaha
//hahaha
复制代码

木有变量提高

以前咱们用ES5,var声明一个变量,可能有时候会这样写

console.log( a ) // undefined,可是并不会报错
var a = 8
复制代码

之因此能够这样写,是由于 var 存在 “变量提高”

至关于以下代码

var a 
console.log( a ) // 此时a还未被赋值
var a = 8
复制代码

可是let 没有 变量提高

console.log( a ) // RenerenceError
let a = 8
复制代码

let const 暂时性死区

用let声明的变量就被绑定在了声明处的块级做用域,只要在声明以前调用,就会报错。

不容许重复声明

如下两种都会报错

let a = 10 
let a = 5
复制代码
var a = 10 
let a = 5
复制代码

const

const 声明一个只读的常量,一旦声明,值就不能被改变了。

const声明变量也不会提高,也存在暂时性死区。

本质

const 实际上,并非变量的值不能改变,而是变量所指向的内存地址不能改变,由于,简单数据类型,值就保存在内存地址中,可是引用类型,变量只能保证指针是固定的,至于数据结构是否是可变,彻底不能控制。也就是,你能够改变这个对象的属性啊,巴拉巴拉的,可是,不能将这个对象换成别人~

相关文章
相关标签/搜索