zoukankan      html  css  js  c++  java
  • JavaScript中使用console调试程序的坑

    上DEMO

    a = {key1: [1, 2], 'key2': {'key4': '11'}, 'key3': [1, 2]}
    console.info(1,a)
    a.key2.key4 = '22'
    console.info(2,a)
    

    通过浏览器打开DEMO,看浏览器的终端,发现
    Alt text
    第一次console竟然和第二次的console的值一样,都是已修改后的值,22。。。

    研究了很久后,发现问题出在浏览器的终端。
    由于a的key2是一个对象,所以在浏览器输出到终端的时候,没有把key2的value输出出来,而且给了一个指针N1。这个指针是指向key2的对象{'key4': '11'}的。
    随后JS代码修改了key2的对象的值,根据JS的内存管理规则,key4的指针指向一块新的内存(存储‘22’字符串的内存),但是key2的对象的指针N1不会变化。
    然后JS程序跑完了,我们去终端查看key2这个对象,尽管我们点击的Object是第一次console的对象,但是指针依然是N1,浏览器的终端通过N1指针,找到内存中key2的对象,由于这时候key2对象已被修改,所以显示的是‘22’

    根本原因是:浏览器输出了对象的指针,而不是对象本身。

    这个坑会让我们误以为,第一次console的时候,key4的值是‘22’,其实不是的。

    解决方法就是 在console的时候,不要输出过于复杂的数据结构。例如上面的DEMO改为这样,把a改为a.key2,就不会踩到这个坑。

    a = {key1: [1, 2], 'key2': {'key4': '11'}, 'key3': [1, 2]}
    console.info(1, a.key2)
    a.key2.key4 = '22'
    console.info(2, a.key2)
    

    终端:

    Alt text

    未经许可请不要转载。

  • 相关阅读:
    如何下载网络图片资源
    经典排序之快速排序(含红黑树)
    经典排序之归并排序
    node微信公众号开发---自动回复
    koa2的文件上传
    async await的用法
    Generator yield语法和 co模块
    CentOS 7 下安装 Nginx
    windows下nginx的安装及使用方法入门
    linux下nodejs安装以及如何更新到最新的版本
  • 原文地址:https://www.cnblogs.com/Xjng/p/5530597.html
Copyright © 2011-2022 走看看