<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
/*
const声明一个只读的常量,一旦声明,常量的值就不能改变
*/
// const PI=3.1415;
// PI=3; Assignment to constant variable.
//const与let的作用域相同:只在声明所在的块级作用域内有效
// if(true){
// const MAX=5;//MAX is not defined
// }
//MAX;
//const命令声明的常量也是不提升,同样存在暂时性死区,
//只能在声明后的位置使用
// if(true){
// console.log(MAX);
// const MAX=5;//ReferenceError: MAX is not defined
// }
//const声明的常量不可重复声明
/*
const声明变量本质:
1.const声明变量的本质不是变量的值不得改变,
而是变量指向的那个内存地址所保存的数据不得改动。
对于简单类型的数据(数值、字符串、布尔值)
值就保存在变量指向的那个内存地址,因此等同于常量
2.但是对于复合类型的数据(主要是对象和数组),
变量指向的内存地址,保存的只是一个指向实际数据的指针,
const只能保证这个指针是固定的 (即总是指向另一个固定的地址)
,但是不能保证它指向的数据结构是不可变的,
因此声明变量需要非常小心
*/
const foo={};
//为foo添加一个属性
foo.prop=123;
console.log(foo.prop);
//常量foo是一个存储地址,这个地址指向一个对象,不可变的是这个地址
//把foo指向另一个地址就会报错
foo={}//报错
//eg:
const a=[];
a.push('hello');//可执行
a.length=0;//可执行
a=['dave'];//报错
//如果想将对象解冻,使用Object.freeze()
const foo=Object.freeze({});
//常规模式时,下面一行不起作用
//严格模式时,改行会报错
/*
ES6声明变量的六种方法:
var function let const import class
ES5中,顶层对象的属性与全局变量是等价的
ES6为了改变这一点:
一方面规定,为了保持兼容性。var命令和function
命令声明的全局变量,依旧是顶层对象的属性
另一方面规定,let命令、const命令、class命令
声明的全局变量不属于顶层对象的属性
也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩
*/
</script>
</body>
</html>