const不能从字面上来理解,他不能修改的是栈内存在的值和地址。
使用const声明的是常量,在后面出现的代码中不能再修改该常量的值。
怎么理解栈内存在的值和地址呢?就要从javascript的类型说起:
基本类型 Boolen, Number, String 是把直接值直接存在栈内
引用类型 Object(Function, Array ....)是把值存在对应的地址中
const b = 2;//正确 // const b;//错误,必须初始化 console.log('函数外const定义b:' + b);//有输出值 函数外const定义b:2 // b = 5; //错误,Assignment to constant variable.
const:
-
如果定义了一个基本数据类型,比如number,string 。。。 这样的话是常量,绝对不可改变。
-
如果用const去定义一个Object或者Array,只能说Object或者Array本身是常量,但是还是可以他们添加删除或修改属性或者元素的。。。
let是块级作用域,函数内部使用let定义后,对函数外部无影响。
var array = [1, 2, 3]; var q = 1; array = array.map((v) => { return v + q; }) console.log(array); //[2, 3, 4]
var array = [1, 2, 3]; let q = 1; array = array.map((v) => { return v + q; }) console.log(array); //Uncaught SyntaxError: Identifier 'q' has already been declared
if (xxx) { let a = 1; } console.log(a); // Uncaught ReferenceError: a is not defined if (yyy) { console.log(a); // Uncaught ReferenceError: a is not defined ]
var 和 let 的区别在于作用区块。
The let
statement declares a block scope local variable, optionally initializing it to a value.[1]
The variable
statement declares a variable, optionally initializing it to a value.
以上是 MDN 的定义,直白地说,var 的作用域是当前 scope 的所有子作用域,包括当前作用域中声明或调用的函数或是 while / for / if / try-catch 语法区块。
SO~建议:
为了让自己的代码可读性更好,赋值之后不会再做修改了就用const
,如果后边还会修改就用let
,不建议使用var
了