let实际上为 JavaScript 新增了块级做用域。
var声明全局做用域,let声明局部做用域html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width initial-scale=1.0"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>Title</title> </head> <body> </body> <script> let a = 10; var b = 18; {let c = 28} let d = 38; console.log(d); // 38 console.log(c); // 报错。 c is not defined console.log(window.a); // undefined console.log(window.b); //18 </script> </html>
const实际上保证的,并非变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,所以等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即老是指向另外一个固定的地址),至于它指向的数据结构是否是可变的,就彻底不能控制了数组
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width initial-scale=1.0"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>Title</title> </head> <body> </body> <script> const a = 10; // let a = 35; //报错 const list = []; list.push('hello'); //成功 // list = ['大吉大利'] // 报错 const dict = {}; dict.prop = 125; console.log(dict); // {prop: 125} </script> </html>