你知道 Chrome 为调试专门提供的这些函数吗?

系统 浏览器
在 Chrome 的 DevTools 中的控制台提供了一些 Debug 专用的函数,每一个都身怀绝技。

在 Chrome 的 DevTools 中的控制台提供了一些 Debug 专用的函数,每一个都身怀绝技。

Console Utility Functions

这些函数只能用在 Chrome 的 console 中。当我在第一次看到这些函数时非常兴奋,把它们直接写到了自己的代码中,结果当然是跳出了各种 Uncaught ReferenceError:xxx is not defined 错误。

$_

$_ 会存储的执行结果,在控制台测试 JavaScript 的时候通常都需要逐步确认,这正是 $_ 的用武之地:

在遇到不能链式调用的函数时可以用 $_ 来避免游标被修改:

顺带提一句,将来也有可能会出现 Pipeline operator 来做到任意的函数链接,一次来促进提升性或避免修改内建原型。

 

  1. let a; 
  2. a = 1 
  3.   |> ((n) => add(n, 5)) 
  4.   |> double
  5.  
  6. console.log(a); // 12 

$, $$

  1. $(selector[, element]), $$(selector[, element]) 

$ 和 $$ 分别就是 document.querySelector 和 document.querySelectorAll 的缩写,其来源于大家都熟知的 JQuery。

第二个参数可以传入起始的元素,搭配 $0 就可以先检验一个元素,然后再从它开始搜寻。

  1. $('.btn', $0) 

我经常用 $$ 来快速测试一些东西,例如输出某个人 GitHub 页面的所有存储库名称:

不过如果已经把 JQuery 引入为 $ 的话,还是会正常执行 JQuery 的。

debug

  1. debug(function

参数为一个函数,只要执行到该函数就会触发调试器,可以用 undebug(fn) 来取消:

 

  1. function a() { 
  2.   console.log(1); 
  3.  
  4. debug(a); 
  5. // undebug(a); 

其效果相当于:

 

  1. function a() { 
  2.   console.log(1); 
  3. a = (function() { 
  4.   const origin = a; 
  5.   return function() { 
  6.     debugger; 
  7.     origin(); 
  8.   } 
  9. })(); 

monitor

  1. monitor(function

用法和 debug 类似,monitor 函数被执行时会输出函数名称和参数,可用 unmonitor(function) 来停止,不过不能用于箭头函数,如果要监听箭头函数的执行就只能手动重写了。

monitorEvents

  1. monitorEvents(element[, eventType]) 

可以监听并输出元素的特定事件,比较特别的是除了能监听单个事件,还能监听事件类型,例如输出 window 的点击事件和所有 touch 类别的事件:

 

效果和以下 JavaScript 相同:

 

  1. window.addEventListener('click', console.log) 
  2. window.addEventListener('touchstart', console.log) 
  3. window.addEventListener('touchmove', console.log) 
  4. window.addEventListener('touchend', console.log) 
  5. window.addEventListener('touchcancel', console.log) 

可以用 unmonitorEvents(element [, eventType])来停止监听。

getEventListeners

  1. getEventListeners(element) 

输出已注册在元素上的监听器,就拿刚才的例子来说,输入 monitorEvents(element) 后再输入 getEventListeners(element) 就会看到所有事件都被注册了一波:

展开的话可以看到监听器的各种属性:

  • listener:触发事件执行的函数
  • once:该监听器只会触发一次
  • passive:无法执行event.preventDefault(),通常用于提升监听器的性能,如 scroll
  • type:监听事件类型
  • useCapture:监听器会在 Capture 阶段拦截事件

以上属性都是在执行 addEventListener 时所能够提供的参数,别忘了在 removeEventListener 时也要填入相同的参数才能除监听器。

 

  1. const options: { 
  2.   capture: true
  3.   passive: true
  4.   once: false 
  5. window.addEventListener('click', console.log, options); 
  6. // window.removeEventListener('click', console.log, options); 

queryObjects

  1. queryObjects(object) 

官方说明是返回 Constructor 产生的所有实例,不过我的理解是:返回所有原型链中包含该原型的对象。

可以看到以 a 为原型创建的 b也会出现在 queryObjects(A) 的结果中。

另外由于 queryObjects 并不会直接返回数组,所以要点右键菜单中的 Store as global variable 把数组放进变量 temp1。

copy

  1. copy(object) 

copy 能够把 DOM 或对象复制到剪贴板,我有时会用 copy 把对象转为 JSON 并粘贴到接口文档中,或者在控制台中快速创建或修改假数据。

还很贴心的加上了缩进

keys, values

  1. keys(object), values(object) 

输出对象本身的所有 key 或 value,效果与 Object.keys(object),Object.values(object)相同,为什么要强调自身呢?如果是用 in 来遍历对象的每个属性,就会把原型链上所有的属性全都拿出来出来跑一遍:

 

  1. const object = Object.create({ foo: 1}); 
  2. object.bar = 2; 
  3. for (let key in object) { 
  4.   console.log(key
  5. // bar 
  6. // foo 

除了自身的 key,还要 enumerable or not.)。

如果想要确认属性是否是定义在对象本身可以用 Object.prototype.hasOwnProperty:

 

  1. for (let key in object) { 
  2.   if (Object.prototype.hasOwnProperty.call(object, key)) { 
  3.     console.log(key); 
  4.   } 
  5. // bar 

至于为什么不用 object.hasWonProperty(key),请参考下面的代码:

 

  1. const object1 = { 
  2.   hasOwnProperty: function() { 
  3.     return false
  4.   }, 
  5. }; 
  6. const object2 = Object.create(null); 
  7.  
  8. object1.key = 'key'
  9. object2.key = 'key'
  10.  
  11. object1.hasOwnProperty('key'); // ? 
  12. object2.hasOwnProperty('key'); // ? 

clear

  1. clear() 

虽然点击左上角的 🚫 就可以把 Console 清理干净,但我还是习惯用 clear(),就像在终端中输入clear 那样。

注意在 Preserve log 开启的情况下不能用 clear 清空 Console。

责任编辑:未丽燕 来源: segmentfault.com
相关推荐

2022-11-10 09:00:41

2020-05-27 11:30:54

Chrome DevT前端命令

2020-06-22 15:41:20

IF函数Excel用法

2020-10-28 11:20:55

vue项目技

2021-08-05 18:21:29

Autowired代码spring

2018-05-11 15:53:59

2023-01-13 17:02:10

操作系统鸿蒙

2020-11-18 07:52:08

2020-12-24 15:26:07

Redis数据库

2018-07-26 08:42:11

2015-06-29 09:06:51

2024-09-05 09:25:59

SpringUserDAO接口

2016-03-18 19:03:35

认知计算IBM

2018-08-07 09:29:35

数据库MySQL优化方法

2021-11-10 15:37:49

Go源码指令

2018-02-06 09:40:25

PythonOOP继承

2018-03-07 06:37:14

开源项目源代码云计算

2019-02-12 11:15:15

Spring设计模式Java

2019-07-08 10:18:38

MPLSIP数据

2023-01-16 08:09:51

SpringMVC句柄
点赞
收藏

51CTO技术栈公众号