我正在尝试理解教程中的一些代码,并且有一行:
window.console && window.console.timeEnd && console.timeEnd('Generated In');
这会在JavaScript / jQuery中做什么?
答案 0 :(得分:3)
这里有趣的是&&
运算符。它说“如果左手是假的,则返回该值;如果是,则执行右侧并返回该值”。关键是,如果左侧是假的,则不执行右侧。这称为短路,可用于短手条件。
在这种情况下,您的代码:
window.console && window.console.timeEnd && console.timeEnd('Generated In');
相当于:
if (window.console) {
if (window.console.timeEnd) {
console.timeEnd('Generated In');
}
}
因此,在尝试调用该函数并可能获得window.console
之前,查看window.console.timeEnd
和ReferenceError
属性是否存在是一项测试。
答案 1 :(得分:0)
window.console由各种浏览器实现。我不认为你可以指望它存在,这就是为什么这个表达式在调用它的方法之前检查它的存在。
查看chrome的文档,了解一个实现的所有细节: https://developers.google.com/chrome-developer-tools/docs/console
答案 2 :(得分:0)
如果先前已启动此计时器,则会停止计时器。 window.console&& window.console.timeEnd是检查以确保window.console和window.console.timeEnd对象存在,因为并非所有浏览器都支持它。
你可以在这里阅读更多关于计时器的https://developer.mozilla.org/en-US/docs/Web/API/console.time?redirectlocale=en-US&redirectslug=DOM%2Fconsole.time,你可以看到IE中不支持window.console.timeEnd,这就是为什么这些检查到位的原因。
答案 3 :(得分:0)
这里发生了什么......基本上。如果window.console存在,并且window.console.timeEnd存在,请运行console.timeEnd(' GeneratedIn');
你和&&&是一种我只在javascript中看到的只有当它存在必需条件时调用函数的方式。因此,如果window.console.timeEnd不存在,那么语句就会在那里结束,而不是继续执行会导致错误输出的函数。
这是一个非常相似的问题:How && works in JavaScript if isn't in a control statement?
答案 4 :(得分:0)
结束名为'Generated In'的计时器。 window.console
检查控制台是否存在,window.console.timeEnd
检查timeEnd函数是否存在,最后一个语句是该函数的执行。
&&
运算符只是确保先前的语句已评估为true
。只要其中一个不成立,JavaScript就会停止评估,因为在这种情况下,整个事情都不会再成为现实。
答案 5 :(得分:0)
window.console
对象提供日志记录和&调试功能。如果打开控制台窗口(Ctrl-Shift-J或Command-Option-J),您将看到控制台输出。
timeEnd
方法提供了计时功能。有关详细信息,请参阅MDN documentation。
此特定构造在调用之前检查console
对象和timeEnd
方法是否存在。 JavaScript有short-circuit evaluation,因此如果window.console
为假,window.console.timeEnd
永远不会被评估(如果是,则会失败),如果window.console.timeEnd
为假,{{1永远不会被调用(如果是,它会失败)。换句话说,这是一种启动计时器以进行调试的超级安全方式。
可能采用这种方法的一个原因是IE的旧版本没有定义控制台对象,除非您正在调试。这将在您的脚本中创建不可见的运行时错误,这很糟糕。
解决此问题的另一种方法(我更喜欢的方法)是存根您打算使用的对象和函数。您在问题中询问的方法的问题是,每次调用console.timeEnd('Generated In')
或任何控制台计时器功能时,您都必须执行相同的操作。罗嗦而低效!不是DRY!使用存根,您只需执行一次,然后您可以使用对象和方法,而无需担心它们不存在。例如:
console.log()
答案 6 :(得分:0)
console
是一个调试对象,用于记录等。console.timeEnd()
是某些浏览器中公开的计时器结束函数(参见console.timeEnd at MDN)< / p>
上面的代码正在测试是否有一个console
成员;如果是这样,它是否有timeEnd()
方法?如果是这样,请打电话。
大致相当于:
if (window.console)
if (window.console.timeEnd)
window.console.timeEnd('Generated In');
答案 7 :(得分:0)
前两个表达式是检查以确保A.控制台对象存在且B.它有一个可以调用的方法。第3个表达式只是调用方法并传入一个字符串,以便用户可以在控制台中查看此输出并查看简单的计时结果。
代码看起来很奇怪,但是当你意识到它只是一种用来防止JavaScript异常发生的技术时。并非所有浏览器都可以使用控制台对象,因此在这些情况下代码将无法执行任何操作。
这是一种防御性的编码方式,如果由于控制台对象无法使用而无法运行,则可以。