const命令
const用来声明常量,一旦声明,其值就不能更改,这就意味着const一旦声明常量,就要立即初始化。
const命令的作用域与let命令相同:
- 只在声明所在的块级作用域内有效。
- const命令声明的常量也不提升。
- 同样存在暂死区,只能在声明后使用。
对于复合型的变量,变量名不指向数据,而指向数据所在的地址。const命令只需保证变量名指向的地址不变,并不保证该地址的数据不变
const foo={};
foo.prop=123;
foo.prop;//123
foo={};//报错
//const命令定义的常量,不可变的只是这个地址,既不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。
const a=[];
a.push("hello");//可执行
a.length=0;//可执行
a=["demo"];//不可执行
如果想冻结对象,应该使用Object.freeze方法。
const foo =Obiect.freeze({});
foo.prop=123;//不起作用
如果想把对象属性冻结,下例是将对象彻底冻结的函数
var constantize =(obj)=>{
Object.freeze(obj);
Object.keys(obj).forEach((key,value))=>{
if(typeof obj[key]==='object'){
constantize(obj[key]);
}
}
}
跨模块常量
const命令只能声明当前代码块内的常量,如果想设置跨模块常量:
//test1.js
export const sa='abc';
export const ss='hello';
//test2.js
import * from './test1.js';
console.log(sa);//abc
console.log(ss);//hello
全局对象的属性
浏览器环境下的全局对象指window对象,Node.js内指的是global对象。
- ES5中全局对象的属性与全局变量是等价的。
window.a=1;
a //1
- node.js中,模块环境下,全局变量必须显式声明为global对象的属性。
- ES6中规定:var命令和function命令声明的全局变量依旧是全局对象的属性;let命令、const命令和class命令声明的全局变量不属于全局对象的属性。
var a=1;
window.a;//1
let b=1;
window.b;//undefined
import命令
import命令用于加载由export命令定义的模块的对外接口。
import命令接受一个对象(用大括号表示),里面指定要从其他模块导入的变量名。大括号中的变量名必须与被导入模块对外接口名称相同。
import {firstName,lastName,year} from './test';
function setName(el){
e.textContent=firstName+' '+lastName;
}
//使用as关键字,将变量重命名
import {firstName as name} from './test';
//import命令具有提升效果
foo();
import {foo} from './test';
到这里,ES6中声明变量的方法仅剩下class,学习完了,再来总结