<!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>Document</title>
</head>
<body>
<script >
一、 let命令特点:
1- 1et声明的变量只在let命令所在的代码块内有效;
{
let a = 10;
console.log(a);
}
console.log(a);//报错
2- 不存在变量提升现象,变量只可以在声明之后使用;
function test (){
console.log(b); 报错
let b = 19;
console.log(b)
}
test();
3- 暂时性死区 声明全局变量后如果要在块级作用域中声明相同的变量,在变量声明之前不允许任何操作
var c = 'test';
function fn(){
// c = 'zhang';//报错
let c = 'wang';
}
fn();
4-不允许重复声明
二、 count 命令特点
1- 声明一个只读的常量,一旦声明,常量的值不能改变
const NAME = "chengyuanyuan"
NAME = "cyy";报错
console.log(NAME);
2- 声明以后立即初始化,不允许留到以后赋值
const FLAG ; 报错
3- 只在声明变量的当前作用域内有效、const变量不会提升、存在暂时性死区、不可以重复声明(与let特点一致);
const本质:const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,
const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。
因此,将一个对象声明为常量必须非常小心。
const foo = {name:"zhangsan"};
foo.prop = "123";//不会报错
console.log(foo);//{name: "zhangsan", prop: "123"}
foo = {} //会报错,不允许改变foo指向的地址
如果想要对象冻结,可以使用Object.freeze方法,冻结后对象添加的新属性不起作用或报错
const foo2 = {namg:"wangwu"}
Object.freeze(foo2);
foo2.age=23;//Es6 报错 ES5生效
console.log(foo2);//{namg:"wangwu"}
三、顶层对象的属性
浏览器顶层对象的属性是window,Node指的是global对象
非严格模式下var 和 function 命令声明的全局变量是顶层对象的属性;
任何模式下let 、const、class 命令声明的全局变量都不是顶层对象的属性。从Es6开始,全局变量将于顶层对象的属性脱钩;
var f = "22";
console.log(window.f); 严格模式下返回undefined,非严格模式返回22
function fn1 () {
return f;
}
console.log(window.fn1()); 严格模式下执行window.fn1()报错,非严格模式返回22
let g = "33";
console.log(window.g); 任何环境下都返回undefined;
</script>
</body>
</html>