JavaScript

DOMオブジェクトとスクリプトエンジンオブジェクト間の循環参照における IE6 SP2- のメモリリークパターン

概要 IE6 SP2- には下記条件でページの unload 時にメモリリークするバグが存在します。 「DOMオブジェクト」と「スクリプトエンジンオブジェクト」間という異なるエンジン間で循環参照している クロージャがローカル変数に格納されているDOMオブジェクトを…

typeof null === 'object' は ECMAScript 3 の仕様バグ

ECMAScript 3 の typeof 演算子 typeof演算子は対象の型を返す演算子ですが、null に適用すると "object" が返ってきます。 console.log(typeof null === 'object'); // true では、null は Object 型なのか、というとそうではなくて仕様バグだったりします…

Date() と new Date() は等価ではない

概要 Native Object のコンストラクタの中には関数呼び出しとコンストラクタ呼び出しが同じ動作になるものがあります。例えば、Array() は new Array() と等価です。 new Array(1, 2, 3); // [1, 2, 3] Array(1, 2, 3); // [1, 2, 3] 対して、Date() は new …

MDN ではfor文の第一要素を初期化式(initial-expression)と説明している

概要 for文の第一要素で変数宣言するコードは次のようになります。 for (var i = 0; i < 10; i++) { alert(i); } この時、var i = 0 が「式」であるかのように誤解されることがあるようです。 ECMAScript 3 では ECMAScript 3 では ExpressionNoIn と Variab…

ECMAScript 5 規定の undefined は書き換え不可能

概要 次のようなコードをよく見ます。 undefined = 1; // 1 (function () { var undefined; // 同名のローカル変数を定義 alert(undefined); // undefined })(); ところが、ECMAScript 5.1 規定の undefined は書き換え不可能([[Writable]]: false)です。 15…

DOM Events の「バブルアップ」の語源は MDN

バブルアップの語源 DOM L2 Events には親要素にイベントが伝播していくイベントバブル動作(Event bubbling)があり、これを「バブルアップ」と解説されているサイトをたまに見ますが、語源はMDNにあったようです。 (英語版には "bubble up" とあり、翻訳によ…

IE8- の Node#cloneNode はイベントまでコピーする

DOM2 規定の cloneNode() DOM Level 2 Core で規定されている Node#cloneNode は「すべての属性と値をコピーします」が、参照は新しく形成されます。 つまり、<p onclick="alert('click');"> のようにHTMLに埋め込んであるイベントはコピーしますが、addEventListener 等で形成されたイベ</p>…

ECMAScript 5 の Strict Mode でグローバルオブジェクトを得る

Strict Mode ECMAScript 5 には Strict Mode という仕組みがあり、Strict Mode では様々な機能(誤解の元となる機能、危険な機能)が制限されています。Strcit Mode になると関数コード内で this === undefined となり、this でグローバルオブジェクトを参照で…

CSSStyleDeclaration#setProperty と CSSStyleDeclaration#removeProperty

概要 IE8 で未定義の CSSStyleDeclaration#setProperty, CSSStyleDeclaration#removeProperty を IE8 で使えるようにしてみようという試みです。 /** * インラインスタイルを定義する */ element.style.backgroundColor = '#fee'; // CSSOM 規定 element.sty…

IE8- は名前付き関数式を関数宣言としても扱う

ECMAScript の 名前付き関数式 ECMAScript には「名前付き関数式」があり、変数に関数式を代入するときに名前をつけることが出来ます。 var hoge = function foo () { alert(foo); // function foo() { ... } alert(foo === hoge); // true }; ここでは "foo…

Google 検索結果をハイライトする Proxomitron フィルタ「Google: High Light by js」

概要 Google検索結果で検索語を最大7つまでハイライトします。(要 JavaScript) 仕様 JavaScript を利用しているため、ブラウザの JavaScript を有効にしてください。 インスタント検索にも対応するため、HTML5 規定の hashchange イベントを利用しています。…

window.setInterval は無限ループしたり実行順を保証できない場合がある

window.setInterval の問題点 window.setInterval には window.setTimeout にない2つの問題点があります。 致命的なエラーが発生してもタスクを繰り返し実行する。 2秒かかるタスクを1秒おきに予約すると、現在のタスクが終わる前に次のタスクが始まる。 エ…

ActiveXObjectとスクリプトエンジン間の循環参照によるメモリリーク

IE6 SP2- の ActiveXObject 周りのメモリリーク問題はあまり知られていないような気がしたので、簡単にまとめておきます。 jQuery や prototype.js では以下の方法で回避しています。 /** * メモリリークを回避する方法 (jQuery および prototype.js 方式) *…

XPath の transelate() を JavaScript で実装する

概要 XPath の translate() を JavaScript で実装しました。 XPath の仕様通りに実装した translate.js と機能拡張した translate-by-array.js があります。 translate.js XPath の仕様通り、String型の値を引数にとります。1文字単位での置換しか行えません…

全角/半角文字を変換する

think49 think49「半角文字 <-> 全角文字」の文字マップを生成してみた。https://ideone.com/sttNv #ECMAScript #JavaScript5月10日 11:46 PM think49 think49to-zenkaku.js : 半角文字を全角文字に変換する - Gist https://gist.github.com/964592 #ECMAScr…

babu_babu_baboo さん作 UUID生成器 (version 5) を試してみる

think49 think49UUID version5 - babu_babu_babooのごみ箱 http://goo.gl/jvDBU #ECMAScript #JavaScript #RFC41223月25日 6:04 PM think49 think49@think49 RFC4122 http://goo.gl/EYSEn に準拠したUUIDを生成するJavaScriptライブラリらしい。3月25日 6:38…

addEventListener に { handleEvent: ... } のリスナーを渡せるかは DOM Level 3 Events の規定外・実装依存です

think49 think49"意地悪を言えば、Object リスナを渡せるかは DOM Events の規定外・実装依存です。"http://goo.gl/zAOue /な、なんだってー!?(AA略) #DOM #JavaScript3月25日 3:14 PM think49 think49document.addEventListener('click', {msg: 'Hello', …

Opera の attachEvent は addEventListener のエイリアスだと思う

think49 think49Opera の attachEvent は addEventListener のエイリアスっぽいなあ。実行順が保証される上に { handleEvent: ... } まで通る。#JavaScript3月26日 1:37 AM think49 think49event.target === event.srcElement, event.currentTarget === this…

var でDontDelete属性が付与されるのは ES3 まで

think49 think49JavaScript Coding Guidelines for Mac OS X: メモリとパフォーマンスの検討事項 http://goo.gl/Pmglp #JavaScript #ES33月22日 1:34 PM think49 think49@think49 そもそも、VariableStatement はDontDelete属性を付与するから delete できな…

compatible-event.js 制作記録

think49 think49イベントリスナについて教えてください - Yahoo!知恵袋 http://goo.gl/0s5bu / attachEvent で実行順を保証したいらしいが、これは難問。handleEvent をキャッシュする必要があると思う…。 #JScript3月23日 5:43 PM think49 think49@think49 …

"use strict"; はグローバルコードに書いても良い

JSLint ではグローバルコードに 'use strict'; を書くとエラーになるが、ECMAScript 5 違反ではないらしい。(おそらく、Crockford氏の独自の思想によるエラーだと思う) think49 think49'use strict'; はグローバルコードに書いてはいけないんだったかな。JSL…

Feature Detection と UA Detection どちらを使うべき?

think49 think49Feature Detection は未知の UA に対してのみ行うべき? - by edvakf in hatenahttp://goo.gl/sueOj #JavaScript #ECMAScript2月16日 11:23 PM think49 think49@think49 "Feature Detection は遅いし、既知の UA に対してまで毎回 Feature De…

element.outerHTML を実装してみる

ダウンロード gist: 781650 (outerHTML.js) - GitHub Twitterログ think49 think49Firefox v3.6.13 に outerHTML を定義しようとしたが、Object.defineProperty が未定義だった…。#JavaScript #ES5 #HTML51月16日 5:09 PM think49 think49@think49 とりあえ…

Twitter のログをHTML出力する Bookmarklet

Bookmarklet javascript:(function(){var doc = document;var script = doc.createElement('script');script.type='text/javascript';script.src='http://vird2002.s8.xrea.com/javascript/Twitter-outputHTML-bookmarklet.js';doc.getElementsByTagName('he…

JavaScriptのベストプラクティス メモ (#jsEdu)

Togetter - 「JavaScriptのベストプラクティス大会 jsEdu」 で紹介されていて、JavaScriptベストプラクティス30選-jsEdu | Web scratch に記載がないツイートをまとめてみました。 Ajaxで同期通信を行うと処理完了まで待たされる。非同期通信ならバックグラ…