检测window.console存在的正确方法是什么?

时间:2011-05-19 05:57:43

标签: javascript jquery

我有这段代码:

            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初始化为布尔值而不是函数对象的正确方法是什么?

6 个答案:

答案 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')

我在阅读https://stackoverflow.com/a/3390426/1172174

之后想出了这个