//变量
var es = 'es6';
es = 'es2015';
console.log(es);//es2015
//es5
//当且仅当该属性的 writable 键值为 true 时,属性的值,也就是下面的 value,才能被赋值运算符改变。
//默认为 false。
Object.defineProperty(window,'es',{
value:'es6',
writable:true
});
console.log(es);//es6
es = '2015';
console.log(es);//2015
//es6 const常量
const es = ' es6';
console.log(es);// es6
es ='es2015';
console.log(es);//报错
const es;
es = 'es6';//报错,声明就需要赋值,var 声明不赋值的话是undefined
var str = 'es6';
var str = 'es2015';
console.log(str);//es2015
//1.不允许重复声明
const str = 'es6';
const str = 'es2015';
console.log(window.str);//报错
var str = 'es6';
console.log(str);//报错
//2.const 不属于顶层对象window的,不会污染全局变量
const str = 'es6';
console.log(str);//es6
console.log(window.str);//undefined
//3.变量提升
console.log(str);//undefined
var str = 'es6';
run()
function run(){
console.log(1);//1
}
// //相当于
var str;
console.log(str);//undefined
str = 'es6';
//不存在变量提升
console.log(str);//报错
const str = 'es6';
console.log(str);//es6
//4.暂时性死区,作用域内要先定义再使用。
if(true){
console.log(str);//报错
const str = 'es6';
console.log(str);//es6
}
//5.块级作用域
if(true){
var str = 'es6';
}
console.log(str);//es6
if(true){
const str = 'es6';
}
console.log(str);//报错未定义
//const (总结)
// 1.不允许重复声明
// 2.不属于顶层对象window
// 3.不存在变量提升
// 4.暂时性死区(定义前使用)
// 5.块级作用域(作用域内有效)
//const 真的不能被改变吗?
const aa = 1;
aa = 2; //报错
const esObj = {
name:'es6',
year:'2015'
}
Object.freeze(esObj);//使用前后可对比一下,作用是冻结对象不被改变
esObj.name = 'es2015';
console.log(esObj);
//数组同理
const arr = ['es6','es7','es8'];
Object.freeze(arr);
arr[0] = 'es2015';
console.log(arr);
//最后是多层对象情况,简单冻结一层是不生效的。
const esObj = {
name:'es6',
year:'2015',
extension:['es7','es8','es9']
}
myFreeze(esObj);
Object.freeze(esObj);//这时简单一层冻结不生效了
esObj.extension[0] = 'es1016';
console.log(esObj);
//循环 esObj 冻结其内层对象
function myFreeze(obj){
Object.freeze(obj);
Object.keys(obj).forEach(function(key){
if(typeof obj[key] === 'object'){
myFreeze(obj[key]);
}
})
}