タグ

ブックマーク / nanto.asablo.jp (8)

  • 漢字にマッチする JavaScript の正規表現パターン: Days on the Moon

    たまに漢字にマッチする正規表現パターンを書きたいときがあります。Perl の正規表現だと Unicode のスクリプト名を使って \p{Han} で漢字にマッチさせられるのですが、JavaScript ではそうはいきません。JavaScript の正規表現には以下のふたつの問題があります。 Unicode スクリプト名の指定 (\p{...}) に対応していない。 そもそも Unicode の符号位置に対してマッチさせられない (UTF-16 における符号単位に対するマッチになる)。 BMP 外の文字にマッチさせたいときは、サロゲートペアの符号単位を記述する必要がある。 これに関しては ECMAScript 2015 で導入された /u フラグで解決する見込み。 とはいえ、解決不能な問題というわけでもないので、Perl の \p{Han} を JavaScript に移植してみましょう。\

  • ソート高速化を試みる: Days on the Moon

    JavaScript の Array#sort は、比較関数を渡さない場合、各要素は文字列として比較され、並び替えられます。これに関して、IE などで用いられている JScript では、文字列化を一度しか行わず結果をキャッシュしている、すなわち内部的にシュワルツ変換 (Schwartzian transform) を行っているようで、配列要素の toString メソッドを適宜調整することによりソートを高速化できるというのが IT 戦記で触れられていました。 これはつまり、通常次のようにするところを、 // 比較関数 function C(order) { this.order = order; } array.sort(function (a, b) { return a.order - b.order; }); 次のようにすると JScript で高速化が図れるというものです。 //

  • jQuery のバグを見つけてから修正されるまで: Days on the Moon

    1 月 24 日に開催された Kyoto.js meetup 4 で「jQuery のバグを見つけてから修正されるまで」と題した発表を行いました。 jQuery へのコミットに関して 2 行でまとめるとすれば次のようになるでしょうか。 jQuery のソースコードはショートコーディングの嵐なので心してかかる Contributing to jQuery と jQuery Core Style Guidelines は必読 発表の筋書きは以下の通りです。 jQuery のバグを見つけてから修正されるまで フォロー・ミー nanto_vi (TOYAMA Nao) 株式会社はてな アプリケーションエンジニア クライアントサイド (JavaScript) サーバーサイド (Perl) jQuery をバリバリ使っている Deferred イベント DOM 操作 ある日どこかで 街中にクリスマスの

  • jQuery で HTTP 接続するときの書き方: Days on the Moon

    12 月 13 日に Kyoto.js の第 3 回 meetup で、「jQuery で HTTP 接続するときの書き方」と題した 5 分間のライトニングトークを行いました。以下にその内容を一部再構成して収録します。 こんにちは、nanto_vi です。今日は jQuery で HTTP 接続をするときの書き方について話します。 皆さん jQuery を使うことも多いかと思います。jQuery で HTTP 接続をするとき、古いサンプルだと次のような書き方が載っています。 $.ajax({ url: '/foo/bar', data: { baz: 'qux' }, success: function (data) { console.log(data); }, }); 接続完了時の処理をコールバック関数として $.ajax() に渡してやる形ですね。しかし、現在この書き方は非推奨となっ

  • JavaScript でブロックスコープを実現する: Days on the Moon

    JavaScript には基的にブロックスコープというものが存在しない。どうしてもブロックスコープを扱いたいときは function 式を使ったりする。 var a = 10; { var a = 20; print(a); // 20 } print(a); // 20 var a = 10; (function () { var a = 20; print(a); // 20 })(); print(a); // 10 だがやはりブロックスコープがあったほうが便利ということで JavaScript 1.7 では let 式、let 文、let 宣言が導入される。 var a = 10; let (a = 20) { print(a); // 20 } print(a); // 10 しかしこれでは対応するブラウザが Firefox 2 以降などに限られる。ところが、with 文とオブ

  • JavaScript でメソッド名自動生成: Days on the Moon

    JavaScript でもメソッド名自動生成はできる……といっていいんだろうか? JavaScript の一実装に過ぎない SpiderMonkey の独自拡張機能にあるだけで ECMAScript はもちろん JScript でもできないからダメかな? まあ一応できる実装もある。「404 Blog Not Found:Perl Monger の質問 - AUTOLOADって他でどうやるの?」で挙げられていた例でいうとこんな感じ。 // SpiderMonkey のみ (Firefox など) function UnicodeChar() {} UnicodeChar.prototype.__noSuchMethod__ = function (name) { var c = String.fromCharCode(name.replace(/^u/, "0x")); return (th

  • DOM オブジェクトとメモリリーク: Days on the Moon

    IE でのメモリリーク ちょこちょこと紹介されているので知っている人も多いと思うが、IE には DOM ノードに絡んだメモリリークの問題がある。これに関しては Microsoft 自身の記事である「Understanding and Solving Internet Explorer Leak Patterns」に詳しいが、簡単にいえば DOM ノードオブジェクトに関する循環参照を作ると、IE を終了させるまでそのオブジェクトが解放されないというものだ。記事によればメモリリークには以下のようなパターンがあるという。 1. 単純な循環参照 ある DOM ノードオブジェクトのプロパティをたどっていくと自分自身に行き着く場合。以下のようなパターンが考えられる。 element.property == element element1.property1 == element2, element2

  • JavaScript で引数束縛: Days on the Moon

    引数束縛 (カリー化) の話。まずは「JavaScriptでカリー化」(檜山正幸のキマイラ飼育記)。タイトルを見てどこかで聞いたような話だなと思ったら「関数の変形」(Effecttive JavaScript - Dynamic Scripting) だった。だが、前者は文字列に戻してから評価というのが力技っぽくて個人的に好きでないし、後者は汎用的過ぎていささかわかりにくい。そこで今回は先頭の引数から束縛していくというのに的を絞ってみたいと思う。 まず第 1 引数のみを束縛する場合。Function#apply を使えば引数を配列として渡せるので、束縛された値と後から渡された引数とを連結してやればいいのではないか。 function curry(func) { return function (first) { return function () { var args = Array.p

  • 1