首頁  >  文章  >  Java  >  谷歌瀏覽器不為人知的console調試方法!

谷歌瀏覽器不為人知的console調試方法!

Java学习指南
Java学习指南轉載
2023-07-26 16:12:132010瀏覽

導讀:身為Java程式設計師,chrome瀏覽器是最常打交道的軟體之一,那麼它的一些調試小技巧你了解多少呢?

目錄

  • #console

    • console
    • ##log
    • info, warn, error
    • #table
    • group
  • ####### #########dir############count#############clear############ ###########assert###################chrome devtools###
    • $(selector, [startNode])
    • #$$(selector, [startNode])
    • $
    • copy(obj)
    • #inspect(object/function)
    • ##getEventListeners(obj)
    • monitor/unmonitor(function)
    • monitorEvents/unmonitorEvents(object[, events])
    • 別名

#console

console 是瀏覽器提供的介面。它是一個對象,在控制台中可以查看當前瀏覽器支援哪一些方法。以下介紹一些比較實用的api:

谷歌瀏覽器不為人知的console調試方法!

##console.log

這可能是學習前端調試技術最基礎的第一步了吧,你還記得最開始是從什麼地方學習到使用這個方法來調試嗎?

console.log(obj1 [, obj2, ..., objN);
console.log(msg [, subst1, ..., substN);
######console.log### 的功能就是要將訊息輸出到控制台。它可以傳入多個參數,輸出的行為取決於第一個參數是否是一個代替字串。 ######如果是替換字串,則後面的參數會依序替換掉字串裡的佔位符; 如果不是替換字串,則輸出每個參數的值:###
var name = 'anran758';

// 常规使用方式,输出原始值
console.log('Hello'); // Hello
console.log(name); // anran758
console.log(`Hello, ${name}`); // Hello, anran758

// 第一个参数是替换字符串,后面是替换的规则
console.log('Hi, %s. what are you doing', name); // Hi, anran758. what are you doing
console.log('%c I am some great text', 'font-size: 50px;'); // 假装 50px: Hi, anran758. what are you doing
谷歌瀏覽器不為人知的console調試方法!

下面是替换字符串所支持的参数, 学习过 C 语言的同学是不是有种熟悉的感觉呀~

占位符 描述
%s 字符串
%d or %i 整数
%o or %O 对象
%f 浮点数
%c 样式代码

在使用时需要注意的一点是:不同占位符在传入值时会预先针对类型的不同而进行格式化,比如:

// 我们在使用了数字占位符,却传入字符串. 内部进行格式化时进行了类似 parseInt('anran758', 10) 的数据转换
// 因此替换结果为 NaN
console.log('result: %d', 'anran758'); // result: NaN

// 再比如,我们传入一个浮点数,经过数据格式化为 3。这一种是符合预期,因为我们要的就是整数
console.log('result: %d', 3.25); // result: 3

了解了这些扩展方式后,我们可以来做一些有意思的事~

比如,如果你打开控制台去访问知乎、百度等网站时,可能会发现控制台有一些开发者留下的彩蛋~ 如招聘信息或者自家公司的立体 logo:

谷歌瀏覽器不為人知的console調試方法!

哔哩哔哩控制台输出

谷歌瀏覽器不為人知的console調試方法!

知乎控制台的输出

不过值得一提的是,js 规范中并没有规定 console 该如何实现,不同的浏览器调用 console 后的表现也会不一致。

这导致有一个常见的问题发生: 在调用接口时,明明请求的数据还没回来,打印出来却是有值的。实际上原因可能就是你所使用的浏览器,在实现时该 API 是异步的,它提前给你显示了出来。这个问题我在 segmentfault 的问答区中看到有很多朋友问了这样的问题,特意提一提这事。

解决的方法也很简单,如果你觉得这个值不对劲的话,你可以先将对象转为 json 字符串,然后再解析为对象, 这样就能将原始值输出。

console.log(JSON.parse(JSON.stringify(obj)));

info, warn, error

如果你使用过一些脚手架来搭建项目或者是使用过 SDK 的话,那么在控制台中你能看到以下相关的使用信息。

比如在载入程序时会发出一些运行信息会通过 log 或者 info 来输出信息。

或者你使用的框架中检测到你使用了一些将来可能会被废弃的 API,这时它可能会在控制抛出一个 warn 来警告你。

再或者你使用人家 SDK 的姿势不对,程序内部检测到压根不是这么用的,那么 SDK 内部会抛出错误信息,我们可以通过错误信息来进行排查错误。

这三个 API 更多的是给开发人员提供额外的信息,来查看页面的运行情况,更多用于被封装过后的组件或框架中。

// Info
console.info('Hi, This is message')

// warning 警告
console.warn('On, Your operation may cause a security breach!')

// Error 报错
console.error('Shit! Variable does not exist!')
谷歌瀏覽器不為人知的console調試方法!

table

console.table只接受一个数组或者对象, 可以接受一个额外的参数来描述表格的列数。它会把数据通过表格的形式打印出来, 这样我们看数据的时候就能直观了很多:

var array = [
  { name: 'Jack', age: 12 },
  { name: 'Tome', age: 18 },
  { name: 'baka', age: 15 }
];

console.table(array);
谷歌瀏覽器不為人知的console調試方法!

group

console.groupconsole.groupEnd 是成对出现的,就像我们使用的标签一样。group在控制台创建一个新的分组, 输出到控制台上的内容都会被添加一个缩进, 表示该内容属于当前分组, 直到调用 console.groupEnd() 之后, 当前分组才结束。

var boys = [
  { name: 'Jack', age: 12 },
  { name: 'Tome', age: 18 },
  { name: 'baka', age: 15 }
]

boys.forEach(item => {
  console.group(`${item.name}`)
  console.log(`This is ${item.name}`);
  console.log(`${item.name} is ${item.age} years old`);
  console.log(`${item.name} is ${item.age * 7} years old`);
  console.groupEnd(`${item.name}`)
})
谷歌瀏覽器不為人知的console調試方法!

dir

console.dir,在控制台中显示指定 JavaScript 对象的属性,并通过类似文件树样式的交互列表

我们知道console.log实际上是可以输出 DOM 节点的, 但很多时候我们想查看的不是 DOM 节点,而是该 DOM 节点下的属性,这里就可以使用 dir 来代替 log 来输出 DOM 节点对象.

var head = document.getElementById('head');

console.log(head);
console.dir(head);

但需要注意的是,这个功能是非标准的,尽量不要在生产模式下使用。

谷歌瀏覽器不為人知的console調試方法!

count

count, 如同字面意思一样. count()会输出每一次被调用的次数. 该方法的兼容性也需要注意, 不适用于生产模式.

console.count('anran758')
console.count('anran758')
console.count('zero')
console.count('anran758')
console.count('zero')
console.count('anran758')
console.count('zero')
console.count('anran758')
谷歌瀏覽器不為人知的console調試方法!

clear

clear可以清楚调用这个 API 之前的所有 log 信息,这在一个 log 很多很乱的情况下进行某个功能调试会很有作用。

// something info
console.clear();

time

启动一个计时器(timer)来跟踪某一个操作的占用时长。每一个计时器必须拥有唯一的名字。页面中最多能同时运行 10,000 个计时器。跟 group 一样, time 也是配套的。

当以此计时器名字为参数调用 console.timeEnd() 时,浏览器将以毫秒为单位,输出对应计时器所经过的时间.

比如我们统计一下请求接口的时间:

console.time('fetching data');
fetch('https://api.github.com/users/anran758')
  .then(data => data.json())
  .then(data => {
    console.timeEnd('fetching data');
    console.log(data);
  });

这样我们就轻易的知道了这次我们请求花费了多少时间啦~ 但值得注意的是,该方法的统计时间在微观下不够精准,更多时候我们还是需要使用更专业的测试工具后者网站来完成测试性能的工作。

谷歌瀏覽器不為人知的console調試方法!
谷歌瀏覽器不為人知的console調試方法!

assert

console.assert()还是蛮有意思的. 它第一个参数接受一个断言(声明), 第二个参数是一个message. 如果断言为 false,则将一个错误消息写入控制台。如果断言是 true,就当做没发生。语法如下:

console.assert(assertion, message [, subst1, ..., substN]);

这里的断言不一定是false才会触发错误. 我特意去测试了一下, 触发的规则也跟if的判断里的逻辑相反. 只要是断言是0, NaN, undefined, false, null, 空字符串('')这些假值就会激活报错.

// Assertion failed: Here is the "name" can not be empty
var str = '';
console.assert(str, 'Here is the "str" can not be empty');

// Assertion failed: 0 is not allowed!
var num = 0;
console.assert(0, '0 is not allowed!');

// Assertion failed: That is wrong!
console.assert(1 === 2, 'That is wrong!');

// 什么都不会发生
console.assert(1 === 1, 'That is wrong!');
谷歌瀏覽器不為人知的console調試方法!


以上是 18.01.30 分享出来的内容,在这之后又发现了一些好用的功能,如果你跟笔者使用的都是 chrome 浏览器的话,可以继续往下看,笔者将逐一进行介绍:

chrome devtools

下面介紹chrome devtools 在控制台提供的一些語法糖,這些方法只能控制台使用,而不能直接在程式碼裡使用。區分是瀏覽器提供的還是我們自己程式碼中定義的方法可以使用console.log(method),如果列印出來的是 [Command Line API] 就是內建方法。

$(selector, [startNode])

#我相信做過前端的朋友都了解jqeury$ 選擇器,甚至於我們看到這個符號就能聯想到DOM 相關的東西。

IE9 引入了document.querySelector(),可以讓我們很方便找到對應的DOM 元素,但該API 拼寫起來確實有點麻煩,並且該方法的使用頻率還不低。因此 chrome 開發工具提供一個$的別名給我們使用。

$ 接受两个参数,第一个参数接受一个选择器,第二个参数接受一个 DOM 元素表示从该元素下开始搜索,不传默认为 document.

我们可以简单做一个 demo 实验一下:

<!-- 一个简单的嵌套结构 -->
<div class="main main.container">
  <div class="start"></div>
  <div class="main content"></div>
  <div class="end"></div>
</div>

将上面的 demo 保存至 html 中后,在 chrome 浏览器中打开该文件。输入以下代码查看实际效果:

// 查看是否是 Command Line API,如果不是的话那就意味着你在全局中引入了第三方库,它会覆盖浏览器默认的 API
$;

// 从 document 中获取第一个 main 元素,
var container = $(&#39;.main&#39;);

// 我们将上面获取到的节点作为 startNode, 从该节点往下找可以找到 content
var content = $(&#39;.main&#39;, container);

console.log(&#39;container: &#39;, container, &#39;\n\n&#39;);
console.log(&#39;content: &#39;, content, &#39;\n\n&#39;);
谷歌瀏覽器不為人知的console調試方法!

$$(selector, [startNode])

$$ 相当于 document.querySelectorAll,但细节上看会有些不同。$$ 调用后会返回一个数组,而后者调用后返回的是一个 NodeList,缺少一些数组的方法。

$$$ 接受的参数的功能是一致的,就不过多介绍:

谷歌瀏覽器不為人知的console調試方法!

$_

说这个方法之前需要先科普一下返回值这个概念:js 每一个表达式都会有返回值,比如你定义一个函数,但是没有 return 任何东西,那么调用这个函数后的返回值就是 undefined。这个知识点可以在 你不知道的 JavaScript 系列中了解更详细的解析。

function fn() {} // 返回值是 undefined
fn(); // 返回值是 undefined

var n = 0; // 返回值是 undefined
n += 1; // 返回值是 1
[1, 2, 3].map(n => n * 2); // [2, 4, 6]

好啦,话归正题~有时候为了方便,我们会直接在控制台进行运算,此时我们可以使用 $_ 获取上一个表达式的值。在某些时候可以提供便利性。

谷歌瀏覽器不為人知的console調試方法!

cleardir 分别是 console.clearconsole.clear、dir 的别名。

copy(obj)

该方法可以将数据 copy 至粘贴板。

当初发现这个 API 时还是挺意外的。当时需要将城市映射表数据改造为另一种结构,就直接在控制台中处理好了。接着就在想如何将数据弄出来,数据量很大,不好拷贝下来。然后突发奇想,看看控制台有没有支持复制数据的功能,随便尝试了以下,然后就成功了。

这就意味着以后我们做一些数据处理可以直接在控制台中进行处理,在某些方面上会挺方便的,比如快速生成一个长度为 20 的数组,数组内有 0 ~ 19 的数字:

// 要检查一下有没有全局变量覆盖了默认的 API
// ƒ copy(value) { [Command Line API] }
copy;

var arr = [];
for (let i = 0; i < 20; i++) {
  arr.push(i);
}

// 此时可以检查是否复制成功
console.log(arr);
copy(arr);
谷歌瀏覽器不為人知的console調試方法!

inspect(object/function)

inspect 接受一个对象或者函数。

如果这个参数是一个 DOM 元素的话,并且它是存在 DOM 树中的,那么它会切换到 Elements 这个 tab。如果这个 DOM 元素没有被插入 DOM 树种的话,那仅仅会切换 tab。

如果传入的是一个函数,会将这个函数传入 source 面板,用以检查函数(比起查看 DOM 的功能, 传递函数后的功能除了格式代码外并没有想到好的用处)

谷歌瀏覽器不為人知的console調試方法!

代码格式前

谷歌瀏覽器不為人知的console調試方法!

代碼格式後

#getEventListeners(obj)

谷歌瀏覽器不為人知的console調試方法!

谷歌瀏覽器不為人知的console調試方法!
##getEventListeners(obj)
傳回指定
DOM

綁定的事件監聽器,有時會除錯DOM 時會挺方便的。以知乎首頁為例,這樣可以很清楚的看到document.body 綁定的事件:

##monitor/unmonitor(function)#############當呼叫指定的函數時,會向控制台記錄一則訊息,指示函數名稱以及呼叫時傳遞給函數的參數。使用###unmonitor(function)###停止監控。 ######相當於在這個函數的頭部添加了一個 ###console.info### 的信息,算是語法糖吧~ 主要是調試時使用。當##############################monitorEvents/unmonitorEvents(object[, events])########## ######monitorEvents### 監控指定###DOM### 的事件,若不傳第二個參數,就監聽所有事件的發生。 ###

相对应的是使用unmonitorEvents(object[, events])停止监控事件。

// 监控/停止监控 window 中触发的所有事件
monitorEvents(window);
unmonitorEvents(window);

// or 监控/停止监控 window 中触发的 mouseover 事件
monitorEvents(window, &#39;mouseover&#39;);
unmonitorEvents(window, &#39;mouseover&#39;);

// or 监控/停止监控 window 中触发的指定多个事件
monitorEvents(window, [&#39;mouseover&#39;, &#39;mouseout&#39;]);
unmonitorEvents(window, [&#39;mouseover&#39;, &#39;mouseout&#39;]);

别名

对于一些常用的方法, chrome tools 提供了别名以供我们快速使用:

缩短前 缩短后
console.clear clear
console.dir dir
console.table table
Object.keys keys
Object.values values

参考资料:

  • Console
  • 从 console.log 说起(上)
  • Console Utilities API Reference

以上是谷歌瀏覽器不為人知的console調試方法!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:Java学习指南。如有侵權,請聯絡admin@php.cn刪除