JavaScript

String repeat のアルゴリズムとパフォーマンス

ES6になると、String.prototype.repeatのメソッドが追加されるわけだが、そのアルゴリズムとパフォーマンスを追ってみている。ES6 String.prototype.repeat の仕様では以下の様な感じでシンプルな書き方をしている。 countが 0 より小さい、または 無限大で…

Firfox 30(Nightly)で ES6的な ArrayComprehension,GeneratorComprehension が実装された

書くのが1週間ほど遅れた。 979865 - Implement ES6 array and generator comprehensions 12.1.4.2 Array Comprehension 12.1.7 Generator Comprehensions var arry = [for (value of iteratableObject) value]; // ArrayComprehension /* == (function() { …

オブジェクトのキーの順序

【JavaScript】オブジェクトをキーでソートする方法 | Web制作会社スタイル 上記リンク先の手法は、新たなオブジェクトにキーを配列に入れてソートした後、その順にプロパティ値として入れる方法だ。が、この方法では完全にソートすることはできない。仕様的…

typeof eval('{ foo: 100 }') => ?

"object" "string" "number" "undefined"

Firefox 27(Nightly) における新たな String.prototype["@@iterator"]

928508 – String.prototype.@@iterator (and thus for-of) incorrectly iterates over code units rather than Unicode characters ちょいと面白いものが実装されて、String.prototype["@@iterator"]がアップデートされてた。"@@iterator" というのは、ECMAS…

Promise + Generator

Google Chromeに入ったジェネレータとPromiseで非同期処理に革命が起きた - 素人がプログラミングを勉強していたブログ javascripter さんの記事ではPromise実装としてjQueryのを使用しているけど、Fx では DOM Promise が使えるので、それに合わせて書きな…

Firefox 27(Nightly) の yield が { done, value } を返すようになった

ちょっと前に、Generator のプロトタイプ で書いたが、function * () { yield ...; } な構文が導入された。また、最近ユーザ作成の Generator.next() が { done: Boolean, value: Value } なオブジェクトを返すように変更された。*1 function * gene () { fo…

現状のFirefox,Chromeで、for-of でイテレートできるようにする

Firefox 26.0a1 (Nightly) @@iterator 実装なし 代わりに iterator メソッドを定義するとOK(仕様外) __iterator__ というものもあるが、for-of とは無関係(独自実装) GeneratorObject の next メソッドは値を返すのみで{ done: ..., value: ... }な値を…

__proto__ = null をした後の __proto__ = {} について

記事とは関係ない質問なのですが __proto__にnullを設定した場合のみ 以降のinstanceof演算子の挙動が変わるのは仕様なのでしょうか FirefoxとChromeで確認しました o = {} o.__proto__ = Object.prototype o instanceof Object //true o.__proto__ = {} o._…

ソーシャルボタンのJavaScriptでfunctionの前に「!」がついている理由

結論から言うと、単なる格好付けです。以下説明。主要なJavaScript (ECMAScript 5th)では、functionは2種類あります。 文(Statement) *1 式(Expression) です。所謂、「即時関数」と呼ばれるものはfunctionは式(Expression)である必要があります。何故なら、…

要素リストをループで回して addEventListener するみたいな、よくあるサンプルを断罪してみる

function setButtonHandler () { var buttons = document.querySelectorAll(".hogeButton"); for (var i = 0, len = buttons.length; i < len; ++i) { (function(n) { buttons[i].addEventListener("click", function() { alert(n); }); }(i)); } } って感じ…

Firefox 24(Nightly) で DOM Future が実装された

856410 - Implement promises DOM Future ではなく、すでに、Promise に名前が変わっているけど、実装されたのは Future 。 This feature used to be called futures. 4 Promise - DOM Standard テストコード: mozilla-central mozilla/dom/future/tests/tes…

要素の表示/非表示をトグルするベストプラクティス

[JavaScript] tr要素 の display プロパティを用いた表示切替えについて | Blog | Development Reference を読んで、display = "block" はアカンやろ、と思ったので書いておく。 <div id="foo"> <p>FOO</p> </div> div#foo を JavaScript から表示/非表示をするには。 ダメパターン func…

Firefox 24(Nightly) で {Array,Map,Set}.prototype.{keys,values,entries} メソッド等が実装された

869996 – Set.prototype.{keys, values, entries} 875433 – iterator methods of [Array, Map, Set].prototype should be same function object as entries/values Array.prototype values() Map.prototype keys() values() entries() Set.prototype keys() …

問題:どれが「クロージャ」でしょうか?

func1 から func10 までのどれが「クロージャ」でしょうか? var scope = "global"; function func1 () { return scope; } var func2 = function () { return scope; }; var func3 = new Function("return scope;"); function foo () { var scope = "functio…

回答:どれが「クロージャ」でしょうか?

問題:どれが「クロージャ」でしょうか? - hogehoge の回答期待させて申し訳ないですが、はっきりとした解等を定めていません。ということで解答ではなく、回答で。クロージャの定義を以下の様に定めました。 引数以外の変数を実行時の環境ではなく、自身が…

イベントハンドラの this と event.target, +α

[JavaScript]for 内でイベントリスナとか登録するときにやっちゃいがちな間違い. とその対処法を3つほど. | TM Life 対応その2: event.targetを使う と 対応その4 : this を使う について上記サイトで書いてあることが間違っているというわけじゃないんだ…

ECMAScript Proxy の get 時の注意点

658266 - [Harmony]Proxy: 'this' in getter/setter doesn't indicate the proxy object DirectProxyになる前に上げたバグ*1なのでちょっとコードが古いけど、回答が付いて気付かされた。Proxy通過時の this の問題 var obj, handler, proxyObj; obj = { _na…

v8エンジンの __proto__ が getter/setter になってた

28.0.1500.3 (Official Build 198635) dev-mで確認以前確認した時はまだDataDescriptorだったから、また変更されたみたい。 > Object.getOwnPropertyDescriptor(Object.prototype,"__proto__") Object {get: function, set: function, enumerable: false, co…

switch と case のインデントレベル

主に2種類あると思う。 switch (expr) { case expr1: break; case expr2: break; default: // ... } と switch (expr) { case expr1: break; case expr2: break; default: // ... } ボクは、前者がお勧めだと思っている。jslint ? そんなの知りません。 vim…

Firefox 22(Nightly) で ArrowFunction が実装されたが、扱いが難しい

Firefox Nightly (22) に ES6のArrow Function来たる - fragmentary ということで、早速試しているわけです。 基本 var f1 = () => "OK"; // 引数なしの場合は、"()"が必須 var f2 = arg => arg + 1; // 引数一つなら、"()"は省略可 var f3 = (arg1, arg2) =…

Object.setPrototypeOf を作る

https://mail.mozilla.org/pipermail/es-discuss/2013-March/029259.html で気付かされた。Firefox なら Object.setPrototypeOf を作ることができる。Firefox、というよりも、SpiderMonkey なのだが、Object.prototype.__proto__がgetter/setterで定義されて…

Symbol でプライベートな値を作る

ChromeのExperimental WebKit/JavaScript Features - fragmentary Experimental JavaScript Features の方に Symbol が使えると書かれていたので早速。Symbol ってのはなんて言うか、固有のプロパティのキーになれるもの?っていう説明で良いのかな。 var s …

ユニコード文字のbase64エンコード/デコード

今のところAPIがあるのが、Firefoxのみかもだけど。単純に、window.btoa("あいうえお")とすると、InvalidCharacterError: String contains an invalid characterと例外が発生する。Encoding StandardのTextEncoder、TextDecoderが使えるなら、以下のように書…

GoogleChrome(27.0.1425.2 dev-mあたり) の __proto__ 挙動が変わった

window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.paren…

Array + Set で検索を高速に

Array#indexOf(item) !== -1をやって存在を確認するのが、どうにも速い気がしなくてやってみた。とりあえず、Array.indexOf vs Set.has · jsPerfで速度確認。Set#hasが圧倒的に速い。かと言って、単純な Set では以下の点で使いづらい 値の順番操作が面倒 入…

JSON.parse('{"__proto__": null}')

var o = JSON.parse('{"__proto__": null}'); console.log( Object.prototype.hasOwnProperty.call(o, "__proto__"), Object.getPrototypeOf(o), o instanceof Object, Object.getPrototypeOf(o) === Object.prototype ); Browser hasOwnProperty instanceof…

__proto__の挙動からJavaScriptエンジン判定

function getJSengine() { if (!("__proto__" in Object.prototype)) { if (typeof Object.getPrototypeOf === "undefined") return "JScript(IE8-)"; else return "JScript(IE9+)" } var o = JSON.parse('{"__proto__":null}'); if (!(o instanceof Object)…

Firefox 20 から for-each 構文がコンテンツ上で事実上の死

804834 - Hide "for each" from content for each構文はE4Xの構文とはいえ、JavaScript 1.6から定義されたものなので、バージョン1.6以上を指定したもの以外は実行できなくしようというもの。791343 -disable for-each statement on javascript.options.xml.…

Object.defineProperty できなくなるケース

ES-Discuss のメーリングリストで知った。 Object.prototype.get = function(){}; var o = {}; Object.defineProperty(o, "hoge", { value: "OK" }); // TypeError: property descriptors must not specify a value or be writable when a getter or setter …