[FE] console.log陷阱

在前端开发中,我们经常使用console.log在浏览器控制台上打印日志,
可是当打印一个引用类型的对象时,可能会遇到奇怪的情况,
打印的结果不是该对象被打印时候的值,而是程序执行完以后该对象的结果值。

Chrome 版本 59.0.3071.86(正式版本) (64 位)

const x = [];
console.log(x);

x.push(1);
console.log(x);

这两条log在控制台上显示如下:

→ []
→ [1]

我们点击控制台上的>,是可以展开看结果内容的。

↓ []
    0: 1
    length: 1
  → __proto__: Array(0)

↓ [1]
    0: 1
    length: 1
  → __proto__: Array(

展开后看到的内容,是x的最终结果。

→ []→ [1]在不被展开的时候是可以区分的,可是有一些情况是无法区分的

const y = { a: { b: 0 } };
console.log(y);

y.a.b = 1;
console.log(y);

控制台上显示的结果是不可区分的,

→ Object {a: Object}
→ Object {a: Object}

在控制台中展开后的结果,也是不可区分的

↓ Object {a: Object}
  ↓ a: Object
      b: 1
    → __proto__: Object
  → __proto__: Object

↓ Object {a: Object}
  ↓ a: Object
      b: 1
    → __proto__: Object
  → __proto__: Object

这时候就要注意console.log的陷阱了,
console.log是按引用方式打印对象的,一个对象的属性值并没有被拷贝出来,而是直接可以在控制台上查看它所对应的结果值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,378评论 2 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,369评论 19 139
  • 参考基础教程的整理,方便记忆 一、Object对象 (O大写) 所有其他对象都继承自这个对象。Object本身也是...
    Viaphlyn阅读 6,887评论 0 0
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宫若石阅读 4,799评论 0 1
  • 因着乔任梁的自杀,抑郁症这个话题上了热搜。 对于乔任梁这个名字,在他死亡的消息传出之前,我是完全没有听说过的。 原...
    自由之心1314阅读 3,244评论 0 3