2013-01-01から1年間の記事一覧

IEで関数名を取得する

IE以外のブラウザであれば、関数.nameで関数名を取得することができる。 var func = function hoge() { } func.name; // => "hoge" 事実上標準でES6にも取り入れられそう。しかしIEではバージョン11においても関数.nameは定義されていない。そこで、Function…

文字列SetとしてのDOMTokenList

DOMTokenListを文字列専用のSetとして使えそうと思ったけど、空白を含む文字列を追加できないので使いづらかった(DOMTokenListを得られるのはclassListかrelListで、どちらもセパレータが空白)。 var set = document.createElement('div').classList; set.…

似非Set

Setを似非実装してみた。sizeではなくlengthならArray.prototypeのメソッドを転用できるのに。 似非Setdeleteは予約語なので、関数名に同名を付けられない。Setを既に実装しているFirefoxでは、Set.prototype.delete.name === 'delete'となる。Function#name…

JavaScriptの ++i は i += 1 ではない

JSLintでは ++ を使うとエラーになる。++i の代わりに i += 1 と書くようにということのようだ。でも、+= 1 は ++ の正確な代替ではなかった。加法演算子は被演算子の少なくとも一方が文字列なら、文字列連結処理になる。一方、前置増分演算子 (++) は初めに…

FirefoxにおけるArray#concatは strict mode function 相当

Array.prototypeの大半のメソッドは、配列以外のオブジェクト(NodeListなどの擬似配列など)にも転用できるように汎用的に定義されている。Array.prototype.concatもその一つだけど、他のメソッドとは異なりthis値に配列っぽさは求められておらず、どんなオ…

CSSセレクタ4の字句解析器を書いた

CSS4 セレクタエンジンの事始めとして。字句解析の範囲では、CSS3 とそれほど変わらない。違いは Reference combinator で使う「/」と、セレクタの subject を指定する「!」くらい。 yonQuery/lexer.js at master · rikuba/yonQuery · GitHub デモ用のページ…

NodeListを配列に変換するのにArray.applyを使うのはどうか

NodeListやHTMLCollectionを配列(Array)に変換する方法の一つに、Array.prototype.sliceを使う方法がある。 var array = Array.prototype.slice.call(document.getElementsByTagName('A')); でも、最近の実装であればArray.applyもその用途に使える。 var ar…

Array/Stringの汎用メソッドをこだわって定義する

FirefoxではArray.prototypeやString.prototypeにあるメソッドを簡単に転用できるように、コンストラクタ(Array, String)自身に汎用メソッド(generic method)が定義されています。 これにより、 Array.prototype.forEach.call(nodeList, body.appendChil…

breakできるforEach ―throwを使って―

JavaScriptのforEach的なものでbreakしたい話 - 車輪を再発明 / koba04の日記 思いつき。break文のように入れ子になった内側のループの中から外側のループも抜けられるように。 function Break(target) { this.target = target; } function forEach(array, c…

文字コードを使ってソート

JS Bin Array.apply(null, Array(100)) .map(function () { return Math.random() * 1000 | 0; }) .map(String.fromCharCode) .sort() .map(function (c) { return c.charCodeAt(0); }); 140文字に収まらなかった。

IEではフォーム内の要素にIDを付けてもグローバル変数として定義されない

サンプルコード <title>TEST</title> <body> <input id="input1"> <form> <input id="input2"> </form> <pre><script> function w(text) { document.writeln(text); } try { w('input1: ' + input1); } catch (e) { w('input1 is undefined'); } try { w('input2: ' + input2); } catch (e) { w('input2 is undefi…</pre></body>