其他
这些console.log技能是真香啊~
点击上方“IT平头哥联盟”,选择“置顶或者星标”
你的关注意义重大!
译文 | https://segmentfault.com/a/1190000018756503
console.log
,虽然 console.log
占有一席之地,但很多人并没有意识到 console
本身除了基本 log
方法之外还有很多其他方法。适当使用这些方法可以使调试更容易,更快速,更直观。console.log()
console.log
中有很多人们意想不到的功能。虽然大多数人使用 console.log(object)
来查看对象,但是你也可以使用 console.log(object, otherObject, string)
,它会把它们都整齐地记录下来,偶尔也会很方便。console.log(msg, values)
,这很像 C 或 PHP 中的sprintf
。console.log('I like %s but I do not like %s.', 'Skittles', 'pus');
> I like Skittles but I do not like pus.
%o
(这是字母o,不是0),它接受对象,%s
接受字符串,%d
表示小数或整数。%c
,这可能与你所想不太相同,它实际上是CSS值的占位符。使用%c占位符时,对应的后面的参数必须是CSS语句,用来对输出内容进行CSS渲染。常见的输出方式有两种:文字样式、图片输出
。console.log('I am a %cbutton', 'color: white; background-color: orange; padding: 2px 5px; border-radius: 2px')
console.dir()
console.dir()
的函数非常类似于 log()
,尽管它看起来略有不同。console.log
版本中看到。当你查看元素的结构时候,你会发现它们之间的差异更大,也更有趣。let element = document.getElementById('2x-container');
console.log
查看:console.dir(element)
给出了更加方便查看 DOM 结构的输出:console.warn()
log()
,你可以以完全相同的方式使用 console.warn()
。唯一真正的区别是输出字的颜色是黄色的。具体来说,输出处于警告级别而不是信息级别,因此浏览器将稍微区别对待它。这具有使其在杂乱输出中更明显的效果。console.log
并仅保留console.warn
。这对于偶尔会在浏览器中输出大量无用废话的应用程序尤其有用。清除一些无用的信息可以让你更轻松地看到你想要的输出。console.table()
console.table()
函数旨在以一种比仅仅转出原始对象数组更整洁的方式显示表格数据。const data = [{
id: "7cb1-e041b126-f3b8",
seller: "WAL0412",
buyer: "WAL3023",
price: 203450,
time: 1539688433
},
{
id: "1d4c-31f8f14b-1571",
seller: "WAL0452",
buyer: "WAL3023",
price: 348299,
time: 1539688433
},
{
id: "b12c-b3adf58f-809f",
seller: "WAL0012",
buyer: "WAL2025",
price: 59240,
time: 1539688433
}];
console.log
来输出上面的内容,我们会得到一些非常无用的输出:▶ (3) [{…}, {…}, {…}]
console.table(data)
的输出要有用得多。> console.table(data, ["id", "price"]);
console.table()
只能处理最多1000行,因此它可能不适合所有数据集。console.assert()
assert()
与 log()
是相同的函数,assert()
是对输入的表达式进行断言,只有表达式为false时,才输出相应的信息到控制台,示例如下:var arr = [1, 2, 3];
console.assert(arr.length === 4);
WAL0412
的数据问题,并希望仅显示来自这些数据的事务,这是直观的解决方案。console.assert(tx.buyer === 'WAL0412', tx);
false
,断言才会执行,更改如下:console.assert(tx.buyer !== 'WAL0412', tx);
console.assert()
并不总是特别有用。但在特定的情况下,它可能是一个优雅的解决方案。console.count()
for(let i = 0; i < 10000; i++) {
if(i % 2) {
console.count('odds');
}
if(!(i % 5)) {
console.count('multiplesOfFive');
}
if(isPrime(i)) {
console.count('prime');
}
}
isPrime
函数,假设它是成立的。odds: 1
odds: 2
prime: 1
odds: 3
multiplesOfFive: 1
prime: 2
odds: 4
prime: 3
odds: 5
multiplesOfFive: 2
...
console.countReset()
,可以使用它重置计数器。console.trace()
trace()
在简单的数据中很难演示。当您试图在类或库中找出是哪个实际调用者导致了这个问题时,它的优势就显现出来了。export default class CupcakeService {
constructor(dataLib) {
this.dataLib = dataLib;
if(typeof dataLib !== 'object') {
console.log(dataLib);
console.trace();
}
}
...
}
console.log()
仅告诉我们传递数据dataLib
是什么 ,而没有具体的传递的路径。不过,console.trace()
会非常清楚地告诉我们问题出在 Dashboard.js
,我们可以看到是 new CupcakeService(false)
导致错误。console.time()
console.time()
是一个用于跟踪操作时间的专用函数,它是跟踪 JavaScript执行时间的好方法。function slowFunction(number) {
var functionTimerStart = new Date().getTime();
// something slow or complex with the numbers.
// Factorials, or whatever.
var functionTime = new Date().getTime() - functionTimerStart;
console.log(`Function time: ${ functionTime }`);
}
var start = new Date().getTime();
for (i = 0; i < 100000; ++i) {
slowFunction(i);
}
var time = new Date().getTime() - start;
console.log(`Execution time: ${ time }`);
console.time()
来简化以上代码。const slowFunction = number => {
console.time('slowFunction');
// something slow or complex with the numbers.
// Factorials, or whatever.
console.timeEnd('slowFunction');
}
console.time();
for (i = 0; i < 100000; ++i) {
slowFunction(i);
}
console.timeEnd();
console.group()
// this is the global scope
let number = 1;
console.group('OutsideLoop');
console.log(number);
console.group('Loop');
for (let i = 0; i < 5; i++) {
number = i + number;
console.log(number);
}
console.groupEnd();
console.log(number);
console.groupEnd();
console.log('All done now');
class MyClass {
constructor(dataAccess) {
console.group('Constructor');
console.log('Constructor executed');
console.assert(typeof dataAccess === 'object',
'Potentially incorrect dataAccess object');
this.initializeEvents();
console.groupEnd();
}
initializeEvents() {
console.group('events');
console.log('Initialising events');
console.groupEnd();
}
}
let myClass = new MyClass(false);
选择DOM元素
$(‘.class’)
和 $(‘#id’)
选择器有多么重要。它们根据与之关联的类或 ID 选择 DOM 元素。\$\$(tagName)
或 \$\$(.class)
, 注意双元符号,根据特定的选择器选择DOM的所有元素。这也将它们放入数组中,你也可以通过指定数组中该元素的位置来从中选择特定的元素。className
的所有元素,而\$\$(‘.className’)[0]
和 \$\$(‘.className’)[1]
获取到分别是第一个和第二个元素。将浏览器转换为编辑器
document.body.contentEditable=true
查找与DOM中的元素关联的事件
getEventListeners
使找到这些事件更加容易且直观。getEventListeners($(‘selector’))
返回一个对象数组,其中包含绑定到该元素的所有事件。你可以展开对象来查看事件:getEventListeners($(‘selector’)).eventName[0].listener
eventName[0]
是一个数组,它列出了特定事件的所有事件。例如:getEventListeners($(‘firstName’)).click[0].listener
‘firstName’
的元素的单击事件关联的侦听器。监控事件
monitorEvents($(‘selector’))
将监视与选择器的元素关联的所有事件,然后在它们被触发时将它们打印到控制台。例如,monitore($(#firstName))
将打印 ID 为firstName
元素的所有事件。monitorEvents($(‘selector’),’eventName’)
将打印与元素绑定的特定事件。你可以将事件名称作为参数传递给函数。这将仅记录绑定到特定元素的特定事件。例如,monitorEvents($(‘#firstName’),’click’) 将打印绑定到ID为'firstName'的元素的所有click
事件。monitore($(selector),[eventName1, eventName3', .])
将根据您自己的需求记录多个事件。与其传递单个事件名作为参数,不如传递包含所有事件的字符串数组。例如monitore($(#firstName),[click, focus])
将记录与ID firstName元素绑定的click
事件和focus
事件。unmonitorevent ($(selector))
:这将停止监视和打印控制台中的事件。
检查 DOM 中的一个元素
inspect($(‘selector’)) 将检查与选择器匹配的元素,并转到 Chrome Developer Tools中的 Elements 选项卡。例如, inspect($(‘#firstName’))
将检查 ID为'firstName' 的元素,spect($(‘a’)[3])
将检查 DOM 中的第 4 个a
元素。1, $2 等可以帮助你获取最近检查过的元素。例如,
$0
表示最后检查的 DOM 元素,而$1
倒数第二个检查的 DOM 元素。
检索最后一个结果的值
$_
2+3+4
9 //- The Answer of the SUM is 9
$_
9 // Gives the last Result
$_ * $_
81 // As the last Result was 9
Math.sqrt($_)
9 // As the last Result was 81
$_
9 // As the Last Result is 9
清除控制台和内存
clear()
- ------- end -------- -
❤️ 看完两件事
如果你觉得这篇内容对你有所帮助,我想邀请你帮我两个小忙:
点个「
在看
」,让更多的人也能看到这篇内容(喜欢不点在看,都是耍流氓 -_-)关注公众号「IT平头哥联盟」,一起进步,一起成长!
推荐阅读:
Google Chrome 工程师:JavaScript 不容错过的八大优化建议