• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
斗罗
博客园    首页    新随笔    联系   管理    订阅  订阅

常量 const

                    //变量
                         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]);
					}
				})
			}
posted @ 2021-02-03 15:24  斗罗  阅读(45)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3