我有这段代码:
var has_logger = (window.console && window.console.log);
if (has_logger) {
window.console.log(data);
}
has_logger
,不是布尔值,而是初始化为函数对象(function log() { [native code] }
我的问题:
无需在现代浏览器中测试控制台.log对吗?
将
has_logger
初始化为布尔值而不是函数对象的正确方法是什么?
如果未启用 Firebug,如果您不检查,Firefox 将抛出错误。
var has_logger = !!(window.console && window.console.log);
将永远是布尔值。
是的,这是一种非常好的测试方法,是的,你必须测试。请注意,您的has_logger
变量实际上以对该函数的引用结束,因此您可以使用 Amadan 所说的双爆炸将其转换为布尔值。
不过,要注意IE9在console.log
周围的奇怪行为。
但是,如果您希望您的代码在浏览器以外的其他 JavaScript 环境中工作,您可以使用以下内容:
has_logger = typeof console === "object" && console.log;
您可以安全地测试自由引用的类型,即使它未定义。这将适用于浏览器(您有window
)和其他环境(您没有)。
当控制台.log功能在其他浏览器中不存在时,我仍然希望将结果输出到某处。而不是每次我想写入日志时都有一个 if 语句,而是创建了以下 javascript 位,当 window 对象尚不存在时,它会向 window 对象添加一个控制台.log方法。这意味着在我的代码中,无论我想在哪里使用控制台.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');
}
};
} ());
});
Firefox 3.6 及更早版本没有window.console
。 我不知道你会把它算作现代的。
对于你的第二个问题,JavaScript 中的 &&
运算符不返回布尔值;它返回其左侧表达式(如果它是 falsy)或右侧表达式(如果左侧不是 falsy)。 如果您出于某种原因确实想要布尔值,请使用 !!(whatever-value)
。
所有人都会给你一个布尔值:
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);
真正完全防弹......我希望你们能告诉我,如果我错过了什么。它似乎可以防止引用错误,除非日志是一个函数,否则它是假的。如果有人将其他函数附加到 window.console.log则会引发错误,那么对此无能为力。
var hasLog = !!("console" in window &&
window.console &&
"log" in window.console &&
window.console.log &&
typeof window.console.log == 'function')
我读完后想出了这个 https://stackoverflow.com/a/3390426/1172174