本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

Chrome 51のV8の興味深いバグ

以下のコードを実行した結果を予想してみてほしい。


function foo()
{
    return typeof null === "undefined" ;
}

for ( var i = 0 ; i < 1000 ; ++i )
{
    console.log( foo() ) ;
}

typeof nullの結果は"object"なので、"undefined"と===で比較するとfalseになる。したがって、関数fooは必ずfalseを返すはずである。1000回実行しようと常にfalseを返す関数は常にfalseを返すはずである。

では実際に実行して確かめてみよう。

コンソールにコピペするのとは挙動が違うが、何度もクリックすると、なぜかtrueを返すようになる。おそらく、コンソールにコピペすると毎回JITが走るので、挙動が違うのだろう。

ちなみに、workaroundとしては、typeof null === undefinedとかtypeof null === "undefined" + ""などがあるらしい。

参考

Javascript developers, be warned about this crazy JIT bug in V8!

Issue 604033 - chromium - JIT compiler not preserving method behavior - Monorail

ドワンゴ広告

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0