JavaScript

ECMAScript Test262

ECMAScriptのテストケースが9/25付けで更新されていたので、各ブラウザについて実行させてみた。 ECMAScript Test262Test Suite Ver.: ES5 | Test Suite Date: 2011-09-25 ブラウザのバージョンは以下の通り: Chrome Firefox Opera Safari IE 14.0.835.202 …

JavaScriptの文字列を反転する10の方法とそのパフォーマンス

はじめに JavaScriptで文字列を反転する10の方法を(無理矢理?)思いついたので、ちょっと簡単に紹介したい。また、それぞれについて、各ブラウザでパフォーマンスを測定してみたので、その結果も合わせて載せる。文字列のStringオブジェクトには、部分切…

JavaScriptのcall.applyの不思議 (wtfjsを解説)

wtfjsに下のような面白いものが登録されました。 alert.call.call.call.call.call.apply(function (a) {return a}, [1,2]) // 2 確かに、どうしてこうなるのかは直ぐには分かりません。一つ一つゆっくりと確認してみましょう。関数コールのobj.func(arg,...)…

JavaScriptのundefinedというクセ者のいろいろ

はじめに JavaScriptの初心者にとってundefinedというのはちょっと混乱を招くものらしい。nullとの違いや使い分けがよく分からなかったり、数値やブール値との比較が不自然だったりするのが原因と思われる。ここでは、そのようなundefinedのいろいろについて…

O3DはWebGL上のライブラリという位置付けとなることに正式決定

ブラウザ上の2DグラフィックとしてはCanvas APIが標準としての地位を築いたが、3DについてはMozillaのWebGLとGoogleのO3Dが競合していたが、Googleが折れたようだ。O3DはWebGL上のJavaScriptライブラリとして再構築されることが正式にアナウンスされた。 The…

JavaScriptのDateで表現可能な過去と未来

寒くなったり暖かくなったりと気温変化が激しかったためか、先週一週間は体調を崩してしまい仕事がはかどらなかった。一日だけ休んだが、熱があるわけでもなく、ちょっと頑張れば出勤はできるし、重要な会議もあった。しかし、全身脱力感で、何もする気が起…

IE6をクラッシュさせるコード

マイコミジャーナルに「IEをクラッシュさせる1行」というAjaxianの記事の紹介記事が載っている。jQueryのプラグインで落ちるとあるが、jQueryとは無関係の下記のコードで落ちるようだ。 function crash() { for (x in document.open); } crash(); そもそも…

JavaScriptのメソッドコールの仕組みを深く理解する (参照型とは?)

はじめに JavaScriptでは関数もオブジェクトです。このことはよく理解されていると思います。関数とメソッドとの明確な違いはなく、どちらも関数オブジェクトである、というところまではよいのですが、関数コールとメソッドコールの違い、あるいはその仕組み…

Opera10.50のECMA規格の準拠度を調べてみた

Opera10.50が登場していきなり世界最高速という触れ込みで注目を集めていて、いろいろなベンチマーク結果も公開されてますが、僕として気になるのはECMA規格にどこまで正確に準拠しているかという点です。ざっと調べてみました。実用上の大きな問題となるよ…

驚きいっぱいのJavaScript?

言語やインタフェースの設計には「驚き最小の原則」というのがある。まつもとさん本人はそんなこと言っていないようだが、かつて、Rubyはその原則に沿った言語と言われていた。一方、JavaScriptはそれに反する言語と未だに見なされているようだ。多くの場合…

Firefox3.6 のswitch文がさらに高速になった

「JavaScriptのswitch文のパフォーマンスはブラウザの違いでこんなにも差があった。」でブラウザごとのswitch文の速度評価を行ったが、Firefox3.6のパフォーマンスについて、hacks.mozilla.orgに以下のような気になる記事がある。JavaScript speedups in Fir…

HTML5 CanvasのarcToをarcで実装してみた

はじめに 前回のエントリ「HTML5 Canvas のarcTo関数の実装が未だにorz」で書いたCanvasのarcToですが、これをarcで実装してみました。CanvasのarcTo関数は左図のように3点A, B, Cが与えられたとき、その2本の半直線に接する半径Rの円弧を描画するもので…

JavaScriptでFlashを実装

ちょっと前に、JavaScriptでFlashプレイヤーを実装するような強者が現れることを密かに期待している、なんてことを書いたが、AjaxianにGordon: Flash Runtime Implemented in Javascriptという紹介記事が載ったので心躍ったが、中身はまだ見ていないけれど、…

HTML5 Canvas のarcTo関数の実装が未だにorz

2年近く前にCanvas APIの実装状況を網羅的に調査したことがありますが、ブラウザごとに実装がいろいろ異なっていていました。その中で一番目立ったのがarcTo関数の実装の違いです。改めて調べてみました。ブラウザのバージョンは以下です。 Chrome Safari O…

JavaScriptのswitch文の速度評価記事への補足

前回書いたエントリー「JavaScriptのswitch文の速度はブラウザの違いでこんなにも差があった。」に予想外にたくさんのブックマークがつき、貴重なコメントも頂きありがとうございます。それにインスパイアーされたので、ちょっと補足を書きました。個々の項…

JavaScriptのswitch文の速度はブラウザの違いでこんなにも差があった。

はじめに JavaScriptのswitch文は、CやJavaと異なりcaseのところに任意の式が書けるため、実行時にcaseの式も評価されるので基本的にはif-else文の並びと類似のものになります。つまり、caseの数に応じてパフォーマンスも低下すると予想されます。本当にそう…

JavaScriptのパフォーマンスの違いから数値表現の違いを推定してみた

はじめに JavaScriptの数値は仕様的には64bit倍精度のIEEE754に準拠というものですが、内部の実装では高速化のために必要に応じて32bit整数だったりdoubleだったりします。ブラウザによっては、その辺りの実装に違いがある筈で、それはパフォーマンスの違い…

ECMAScript 5th editionがECMAで承認される

いろいろ紆余曲折がありましたが、ECMAScriptの第5版が正式にECMAで承認されて仕様書がリリースされました。Draftの文字が消えたので、ちょっとは読む気が沸いてきます(笑)。アナウンスメールES5 is an ECMA standard下記から仕様書はダウンロードできま…

JavaScriptのビット演算の仕組みを理解する

はじめに JavaScriptの数値表現はIEEE754の64ビットの倍精度型浮動小数ですが、ビット演算はどのように定義されているのでしょうか。今回はそのビット演算について解説します。この仕様は10年以上前から変わらないのですが、改めてその部分が書籍などでどの…

JavaScriptの大きな数と小さな数の仕組みを理解する 〜 IEEE754入門 〜

JavaScriptでの数値はIEEE754で規定されている倍精度型doubleです。符号部が1ビット、仮数部が52ビット、指数部が11ビットの64ビットで表現される浮動小数です。この辺りは、計算機の初歩の初歩で、当たり前すぎて普段は気にすることはないと思いますが、そ…

Operaだけ何故か極端に高速な正規表現パターン

とても単純な正規表現だけれど、照合するのに非常に時間のかかるパターンがあります。下記はその一例。 var s = "abcdefghijklmnopqrstuvwxyz".match(/a(.+)+c/); 照合することは一目瞭然です。しかし、+ は最長一致型の照合なので2重のバックトラックが発…

JavaScriptで循環配列を文字列化したらどうなるか?

JavaScriptのオブジェクトは文字列化しても単に "[object Object]"と表示されるだけなのに、配列は文字列化すると "1,2,3,4" のようになる。便利なようであまり便利でもない。 var ary = [1,[2,[3,4]],5] var s = ary.toString(); // s は "1,2,3,4,5" 各要…

JavaScriptのsetInterval関数の意味を正確に理解するための1つの説明

ECMAScriptの言語仕様と組込関数の動作仕様は非常にきめ細かく規定されていますが、それに含まれていないJavaScriptの関数の仕様はどうもはっきりしないように思えます。そのためか、それを利用するコードも正確なものではないものが見受けられます。その1…

JavaScriptのToNumberとparseInt/parseFloatの仕様と実装の違い

ECMAScriptの規格書は非常に細部に至るまで細かく仕様が規定されていますが、100%全て正しく実装している処理系は僕の知る限りありません。過去に広まってしまったソフトとの後方互換性を維持するため、あえて仕様にあわせていないのだろうというものも…

FAQ形式によるJavaScriptの本質がわかる超入門

はじめに JavaScriptは簡単な言語のようでいて、実は奥が深く、初心者にとってなかなかその本質がわかりにくい言語です。ここでは、JavaScriptの言語的エッセンスを理解できるようなものをFAQ形式で書いてみました。ご意見や誤り等を指摘してもらえたら嬉し…

JavaScriptで ""+x を文字列変換に使うのは気持ち悪い

JavaScriptの本やブログなどで非常に良く見かけるのだが、数値などの文字列でないものを文字列に変換する方法として var s = "" + x; のように空文字との連結によって行っているが、私としてはちょっと気持ち悪さを感じる。もちろん、間違いではない。確かに…

JavaScriptでおもちゃのLispを作ろう(5)〜組込み関数編〜

前回までに組込み関数を一切定義していないピュアなLisp処理系ができました。今回は必要最小限の組込み関数を実装します。 /* * 関数に名前をつけて登録する。引数lazyがtrueのときは、関数の引数を評価しない。 * スペシャルフォームのときtrueをセットする…

JavaScriptでおもちゃのLispを作ろう(4) 〜評価器編〜

いよいよ評価器の実装を行います。Lispの評価器はeval()関数を実装することです。eval()関数はLisp自身で実装することができます。Lisp自身によるeval関数の実装はLispの古典であるLisp1.5マニュアルによると以下のようになります。 apply [fn;x;a] = [atom[…

Yコンビネータのお話

過去にもいろいろなブログで何度も取り上げられて話題になりましたが、自分なりの理解で書いてみました。Yコンビネータはシンプルでありながら、不思議で奥が深いので興味をそそる要素があるのでしょう。JavaScriptも広い意味では関数型言語であり、λ計算と…

JavaScriptでおもちゃのLispを作ろう(3) 〜リーダ/パーサテスト編〜

これまでに実装したのは、文字列からS式を読み込むリーダとその逆のプリンタです。今回はそれらの機能が期待した通りの動作をするかテストします。JavaScript用の自動単体テストフレームワークJsUnitがありますが、ここは趣味のプログラミングなので、オレ流…