let 和 const

let命令

1.let命令只在所在的代码快内有效

{
        let a = 'hello world'
        console.log(a)      //hello world
}
    console.log(a)  //Uncaught ReferenceError: a is not defined

2.let 声明的变量不可重复定义

{
        let a = 0;
        let a = 'hello world'; //Uncaught SyntaxError: Identifier 'a' has already been declared重复定义变量
}

3.不存在变量提升,必须先声明后使用

console.log(aa); //Uncaught ReferenceError: aa is not defined
let aa = '11';

4.for循环中let和var的区别

for(var i=0; i<10; i++){

    }
    console.log(i);   //10
    for(let i=0; i<10; i++){ //此处let声明的i是父作用域
        let i = 'abc';       //内部let声明的是子作用域,暂时性死区
        console.log(i); //abc
    }
    console.log(i); // Uncaught ReferenceError: i is not defined

“暂时性死区” 只要块级作用域内存在let命令,它所声明的这个变量就不在受外部的影响,本质是只要进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
外层作用域无法读取内层作用域的变量
内层作用域可以定义外层作用域的同名变量

const命令

1.const声明一个只读的常量,一旦声明,就必须立即初始化,常量的值就不能改变。

const a = 'hello world';
    console.log(a); // hello world
    a = 123; //Uncaught TypeError: Assignment to constant variable.改变常量的值会报错

2.const作用域与let命令相同,只在声明所在的块级作用域内有效。
3.不可重复声明

本质: const实际上保证的并不是变量的值不的改动,而是变量指向的那个内存地址不得改动

  • 简单类型的数据(数值,字符,布尔),值就是保存在变量指向的内存地址中。
  • 复合类型的数据(数组,对象),变量指向的内存地址保存的知识一个指针。
posted @ 2017-12-19 11:19  胡珂儿  阅读(176)  评论(0编辑  收藏  举报