我有这段代码:
var has_logger = (window.console && window.console.log);
if (has_logger) {
window.console.log(data);
}
has_logger
,而不是一个布尔值,实际上是初始化为一个函数对象(function log() { [native code] }
)
我的问题:
现代浏览器中没有必要测试console.log,对吗?
将has_logger
初始化为布尔值而不是函数对象的正确方法是什么?
答案 0 :(得分:4)
如果未启用Firebug,如果您不检查,Firefox将抛出错误。
var has_logger = !!(window.console && window.console.log);
将始终为布尔值。
答案 1 :(得分:4)
是的,这是一种非常好的测试方式,是的,你必须测试。请注意,您的has_logger
变量实际上最终会引用该函数,因此您可以使用双重爆炸将其转换为布尔值,如Amadan所说。
谨防IE9's odd behavior around console.log
。
如果您希望代码在除浏览器之外的其他JavaScript环境中工作,您可以使用:
has_logger = typeof console === "object" && console.log;
即使未定义,也可以安全地测试免费引用的类型。这将适用于浏览器(您有window
)和其他环境(您没有)。
答案 2 :(得分:3)
通常,当其他浏览器中不存在console.log功能时,我仍然希望在某处输出结果。我每次想要写入日志时都没有if语句,而是创建了以下一些javascript,它将一个console.log方法添加到窗口对象(当它尚不存在时)。这意味着在我的代码中我想使用console.log,我可以这样做而不用担心它在其他浏览器中破坏。
(function () {
if (typeof window.console !== "object")
window.console = {
log: function (message) {
// Write the message somewhere in browsers that don't support console.log
}
};
} ());
由于我使用jQuery,我使用以下内容将每条消息写入div。
$(function () {
(function () {
if (typeof window.console !== "object")
window.console = {
log: function (message) {
$('<div>' + message + '</div>').appendTo('#consoleArea');
}
};
} ());
});
答案 3 :(得分:2)
Firefox 3.6及更早版本没有window.console
。我不知道你认为那是现代的。
对于第二个问题,JavaScript中的&&
运算符不返回布尔值;它返回其左侧表达式(如果它是假的)或其右侧表达式(如果左侧不是假的)。如果由于某种原因确实需要布尔值,请使用!!(whatever-value)
。
答案 4 :(得分:2)
所有人都会给你一个布尔:
var has_logger = (window.console && window.console.log) ? true : false;
var has_logger = new Boolean(window.console && window.console.log);
var has_logger = !!(window.console && window.console.log);
答案 5 :(得分:1)
这是我最近提出的试图完全防弹的内容......我希望如果我错过了什么,大家会告诉我的。除非log是一个函数,否则它似乎可以防止引用错误并且是错误的。如果某人将某个其他函数附加到window.console.log,这会引发错误,那么就没有人能做到这一点。
var hasLog = !!("console" in window &&
window.console &&
"log" in window.console &&
window.console.log &&
typeof window.console.log == 'function')
之后想出了这个