Профилирование `if (x)` VS `if (x === undefined)` - PullRequest
5 голосов
/ 17 июня 2011
<script>
    function f(){
        var t=document.getElementById("t");
        var g=t.asdfg;
        var a=new Date().getTime();
        for(var x=0;x<100000000;++x){
            if(g===undefined);
            //if(g);
        }
        var b=new Date().getTime();
        alert(b-a);
    }
</script>
<body onload="f();">
    <input id="t"/>
</body>

в Firefox if(g) медленнее, чем if(g===undefined).Мне интересно, кто-нибудь знает какое-нибудь хорошее объяснение, почему это так?

в Chrome if(g) быстрее, чем if(g===undefined).Мне интересно, кто-нибудь знает какое-нибудь хорошее объяснение, почему это так?

Я не утверждаю, что мы должны использовать одно над другим .. Меня просто интересует теория

Возможно разные браузеры имеют разные реализации, но любая теория в любом браузере будет достойна ответа

1 Ответ

6 голосов
/ 17 июня 2011

В javascript нет ключевого слова undefined, оно не работает как null.

Когда вы используете

if(g===undefined)

undefined будет проанализирован как идентификатор. Следовательно, интерпретатор должен проверить наличие переменной undefined в глобальной области (окна). Этот поиск занимает некоторое время.

ИМХО, более правильный способ проверки неопределенности (хотя и не обязательно быстрее)

if(typeof(g) === 'undefined')

С другой стороны, выражение if(g), скорее всего, реализовано как неявное приведение к логическому значению, что, конечно, также занимает некоторое время.

Так что я предполагаю, что эти две разные операции не одинаково быстры в движках Firefox и Chrome.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...