上DEMO

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

通过浏览器打开DEMO,看浏览器的终端,发现



第一次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)

终端:

未经许可请不要转载。

JavaScript中使用console调试程序的坑的更多相关文章

  1. javascript 中的console.log和弹出窗口alert

    主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是co ...

  2. javascript中的console.log有什么作用?

    javascript中的console.log有什么作用? 主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是:他能看到结构话的东西,如果是alert ...

  3. JavaScript中sort方法的一个坑(leetcode 179. Largest Number)

    在做 Largest Number 这道题之前,我对 sort 方法的用法是非常自信的.我很清楚不传比较因子的排序会根据元素字典序(字符串的UNICODE码位点)来排,如果要根据大小排序,需要传入一个 ...

  4. javascript 中的console.log的作用

    主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是co ...

  5. javascript 中的console.log有什么作用啊?

    相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是console能看到对象的内容. console不会打断你页面的操作,如果用al ...

  6. javascript中所谓的“坑”收录

    坑一: // 反例myname = "global"; // 全局变量function func() { alert(myname); // "undefined&quo ...

  7. null的坑 和 比较运算符、相等运算符的隐式转换问题 (在javascript中,null>=0 为真,null<=0 为真,null==0却为假,null到底是什么?)

    null在关系运算中的坑 & 关系运算符的隐式转换问题 注意: 比较运算符 和 相等运算符 的 ECMAscript 语法实现不同. 比较运算符 和 相等运算符 对数据进行了隐式转换, 相当于 ...

  8. 通过google chrome操作JavaScript中Console

    紧接着有关上一个文章的!function................. 前端开发人员一定会用到你的开发者工具中的Console控制台.通常Console用于调试程序,日志输出,打断点等功能.比如我 ...

  9. 坑:JavaScript 中 操作符“==” 和“===” 的区别

    标题:JavaScript 中 操作符"==" 和"===" 的区别 记录一些很坑的区别: 1. '' == '0' // false 0 == '' // t ...

随机推荐

  1. 【阿里云产品公测】ACE安装Discuz超详细图文教程

    作者:阿里云用户51干警网 hello.今天我们来在阿里云ACE上安装discuz. 因为本人不喜欢X3.2的版本,这次我使用的是DZX2.5. 首先的是准备工作: 一.申请阿里云ACE内测 http ...

  2. Selenium html之于ul标志代码分析与使用

    分析:https://github.com/页面Li <div class="header header-logged-out"> <div class=&quo ...

  3. USB HID 协议入门

    转载请注明来源:cuixiaolei的技术博客 USB HID设备类的应用场合 USB HID类是USB设备的一个标准设备类,包括的设备非常多.HID类设备定义它属于人机交互操作的设备,用于控制计算机 ...

  4. Oracle基础 (系统工具(export,import)) exp/imp和 (数据泵 (data pump))expdp/impdp的区别:

    一.exp/imp和expdp/impdp在功能上的区别: 1.把用户usera的对象导入到userb emp/imp用法: formuser=usera touser=userb; empdp/im ...

  5. 算法java(Robert Sedgewick)基本API-StdOut.java

    /************************************************************************* * Compilation: javac StdO ...

  6. JavaScript字符串分割方法

    使用split('')方法.此方法与Java的字符串分割方法方法名一样.

  7. ubuntu server 系统,更换阿里云源(用户更新源)

    Ubuntu安装完毕后,默认使用的是官方的源,在国内访问速度很慢,这里介绍更换为阿里云的源方法. 步骤如下: 1.备份源配置文件 sudo cp /etc/apt/sources.list /etc/ ...

  8. 【转】使用SharpZipLib实现zip压缩

    使用国外开源加压解压库ICSharpCode.SharpZipLib实现加压,该库的官方网站为 http://www.icsharpcode.net/OpenSource/SharpZipLib/Do ...

  9. 【转】C#异步编程及其同步机制

    C#异步编程及其同步机制 本篇文章涵盖一下几部分内容: 1. 什么是异步编程,为什么会需要异步编程 2. .NET下的异步编程及其发展 3. .NET线程同步机制及线程间数据封送 4. 异步模式 5. ...

  10. js中的scroll和offset 的使用比较

    1.offsetTop     :当前对象到其上级层顶部的距离.不能对其进行赋值.设置对象到页面顶部的距离请用style.top属性. 2.offsetLeft    :当前对象到其上级层左边的距离. ...