用var声明xiaoming,为什么xiaoming的值没有被改变?IE6之前应该没有const吧?

用var声明xiaoming,为什么xiaoming的值没有被改变?IE6之前应该没有const吧?

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>Document</title>

</head>


<body>

<script type="text/javascript">

//补充代码

Object.defineProperty(Object, 'freezePolyfill', {

  value: function(obj) {

    var i;

    for (i in obj) {

      if (obj.hasOwnProperty(i)) {

          if(typeof obj[i]=="object"){

              Object.freezePolyfill(obj[i]);

          }

        Object.defineProperty(obj, i, {

          writable: false

        });

      }

    }

    Object.seal(obj);

  }

});


var xiaoming = {

  age: 14,

  name: '小明',

  obj: {

    a: 1

  }

};


Object.freezePolyfill(xiaoming); 

xiaomin={};

console.log(xiaoming);

    </script>

</body>

</html>


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,是的,在es6之前无法得到不变的常量。

老师现在明白同学的问题了,同学书写的代码,使用freezePolyfill方法冻结xiaoming这个对象,只是无法改变这个对象下的属性,但是这个对象本身是可以被重新赋值的,所以执行完xiaoming={}这句代码后,相当于重新给xiaoming赋值了,所以控制台打印的是空对象。

如下:使用var和let 声明xiaoming这个变量,之后都可以重新赋值。使用const声明表示常量,之后无法更改它的值,所以重新给xiaoming赋值会出现报错。示例:

var声明

http://img1.sycdn.imooc.com//climg/5e6eefdc096a09be09060616.jpg

http://img1.sycdn.imooc.com//climg/5e6eefe609d1a0cf06040186.jpg

let声明

http://img1.sycdn.imooc.com//climg/5e6eeff80940cb1809280596.jpg

http://img1.sycdn.imooc.com//climg/5e6ef00409852f4b06480190.jpg

const声明

http://img1.sycdn.imooc.com//climg/5e6ef01509eb405f08860630.jpg

http://img1.sycdn.imooc.com//climg/5e6ef01c098c3ce309100178.jpg

同学可以测试理解下,祝学习愉快~

好帮手慕慕子 2020-03-15 18:36:56

同学你好,对于你的问题解答如下:

  1. xiaoming的值没有被改变,因为同学使用freezePolyfill阻止xiaoming这个对象下的属性被改变,与使用var还是const关键字声明是没有关系的。

  2. const是ES6新增的语法,IE6版本之前是不支持该语法的。

同学的代码是正确的,效果实现的很棒,继续加油!

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

  • 提问者 慕尼黑5122342 #1
    这句写错了,是这样xiaoming={};,控制台打印是:{},不是原来的值。使用var声明的变量xiaoming被改变了。是不是es6之前无法得到完全不变的常量?
    2020-03-16 10:54:06
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师