最高のJavaScript構文糖衣


81

ここにいくつかの宝石があります:

リテラル:

var obj = {}; // Object literal, equivalent to var obj = new Object();
var arr = []; // Array literal, equivalent to var arr = new Array();
var regex = /something/; // Regular expression literal, equivalent to var regex = new RegExp('something');

デフォルト:

arg = arg || 'default'; // if arg evaluates to false, use 'default', which is the same as:
arg = !!arg ? arg : 'default';

もちろん、無名関数は知っていますが、それらをリテラルとして扱い、その場で(クロージャとして)実行できることは素晴らしいことです。

(function() { ... })(); // Creates an anonymous function and executes it

質問: JavaScriptで利用できる他の優れたシンタックスシュガーは何ですか?


2
私はそれを知りませんでした|| デフォルト値の構文。直感的ではありませんが、素晴らしくコンパクトです。(たぶん私それ見たが、理解したことはなかった。)
Chris Noe

1
三項構文を理解するのにずっと苦労しました。あなたがそれを数回書いた後、それは第二の性質のように見えるでしょう。あなたがそれを見たかもしれない場所に関しては、私はjquery.jsとprototype.jsの両方がそれを使用していると思います。
まぶたのない2008年

1
それぞれの例を説明してみませんか?
pc1oad1etter 2008年

2
「arg || 'default'」について知りませんでした。ブール値を返すことを期待しますが、trueと評価される最初の値(左から)を返します(Pythonと同様)!「arg = arg?arg: 'default'」よりもはるかに優れています!
jamol 2009

クリス・ノエがこのスレッドをポーンしました!
Mahesh Velaga 2010

回答:


58

現在の日時をミリ秒単位で取得します。

Date.now()

たとえば、コードのセクションの実行時間を計るには、次のようにします。

var start = Date.now();
// some code
alert((Date.now() - start) + " ms elapsed");

実際、これは最高のjavascript構文糖衣です。winnar siyuo。
まぶたのない2008年

3
OrbMan、それはおそらくコンテキストに依存します。引数として渡す場合は、数値や文字列ではなくオブジェクトに強制変換される可能性があります。その場合、+はすでに数値に強制変換されています。実際、+はparseInt(value、10)の省略形として機能しているように見えます。
まぶたさ2009

訂正:parseInt(value、10)とは多少の違いがあります。例えば、+ [3]とのparseInt([3]、10)の両方番号3と同じであるが、+ [3、4] ==のNaNとのparseInt([3、4]、10)== 3
まぶたのない2009

えーと... parseInt(value、10)のこれらのインスタンスはすべてparseFloat(value)である必要があります。そして、クリス・ノエ、コメントスパムでごめんなさい;)
見えない2009

1
私の好奇心はjsperfでそれをしようとする私をプッシュし、最もパフォーマンスが正規のgetTime():)(参考文献であると思わjsperf.com/millisecondsdate
sirLisko

33

オブジェクトメンバーシップテスト:

var props = {a:1、b:2};

(小道具の「a」)// true
(小道具の「b」)// true
(小道具の「c」)// false

それは確かにprops.a === undefinedよりも簡潔ですありがとう。
まぶたのない2008年

15
そして、props = {a:undefined}であってもそれは真実です。
ephemient 2008年

参考までに-XPCNativeWrapperオブジェクトで「in」を使用しようとすると、FirefoxはTypeErrorをスローします。そしてFirefox4以降、多くのオブジェクトがラップされています。したがって、props.a ===に戻ります。これらの場合は未定義です。
Chris Noe 2011年

26

Mozilla(および伝えられるところによるとIE7)では、以下を使用してXML定数を作成できます。

var xml = <elem> </ elem>;

変数を置き換えることもできます。

var elem = "html";
var text = "一部のテキスト";
var xml = <{elem}> {text} </ {elem}>;

本当に?それをサポートする他のエンジンはありますか?
まぶたのない2008年

1
疑問に思っているのは、「xml」変数を作成したら、それを使って何ができるでしょうか。今Firebugで遊んでいるだけで、メソッドやプロパティがないように見え、DOMに追加することはできません。
nickf 2008年


8
E4Xリテラルは、クロスサイトスクリプティング攻撃によるセキュリティ障害であり、「var xml = new XML( '<elem> </ elem>')」IMOとだけ言うことができるよりも実際にはそれほど優れていません。
bobince 2009年

2
@CharlieSomervilleそれはリスクではありません。E4Xは、「安全な」[X] [HT] MLファイルをアクティブなJSに変える可能性があります。この問題の背景については、code.google.com / p / doctype / wiki / ArticleE4XSecurityをお読みください。
bobince 2010

26

匿名関数とクロージャを使用して、プライベート変数(情報隠蔽)と関連するget / setメソッドを作成します。

var getter, setter;

(function()
{
   var _privateVar=123;
   getter = function() { return _privateVar; };
   setter = function(v) { _privateVar = v; };
})()

少し時間がかかりましたが、わかりました。これはきちんとしています。
matt lohkamp 2008年

swfobjectソースを調べているときに、少し前に同様の手法を発見しました。クロージャを使用してプライベート変数/メソッドを作成することは、おそらく私が考えもしなかったことです。ちょっとかっこいいです。
Herms

新しいJSバージョンでは、よりシンプルなものを使用できますif(true) { let _privateVar=123; }
Kulvar 2016年

ここでは、「ドッグボール」のスタイル上の潜在的な問題に注意してください。参照:twitter.com/paul_irish/status/176187448420864000
Jonathan.Brink

22

プロトタイプの継承を介してネイティブJavaScriptタイプを拡張できること。

String.prototype.isNullOrEmpty = function(input) {
    return input === null || input.length === 0;
}

6
ただ、アレイにこれを行うことを避ける:stackoverflow.com/questions/61088/...
クリス・ノエ

これは真実ですが、for(a in b)ループを使用する場合に限ります。他のみんながそうしていると確信しているように、私は通常フレームワークを使用します。結果として、私は通常.each()を使用しています
steve_c 2008年

これは、潜在的な問題だかのいずれかの(b)において、あなたのための容器の用途のコード。また、そのコンテナがブラウザの場合、ブラウザ内の他のコード(たとえば、そのフレームワーク)が壊れている可能性があります。私はその人にうんざりしている。
クリス・ノエ

うん。良い点、クリス。私はまだプロトタイプの継承をJavaScriptの最高の機能の1つとして数えています:)
steve_c 2008年

for(var i in obj){if(!obj.hasOwnProperty(i)){続行; } ...}
まぶたのない2008年

21

===タイプを比較するために使用します。

var i = 0;
var s = "0";

if(i == s)// true

if(i === s)// false

これは実際には厳密に等しいと呼ばれます-基本的には、==を実行するときに発生しなければならないすべての型変換を回避します
olliej 2008年

他の言語(PHP)でも、これを「ID」チェックと呼びます。つまり、これら2つの値は同一ですか。
nickf 2008年

@nickf、それは少し誤解です。$var1 = 'string'; $var2 = 'string'; $var1 === $var2; // true$var1$var2は同一ではありませんが(メモリに格納されている同じ値への参照)、同じタイプと同じ値です。
まぶたがない2010

@ eyelidlessness、javascriptがそのように機能するかどうかはわかりません...文字列は(通常)格納され、値によって渡されます。ただし、オブジェクトは参照として保存されますvar1 = {a : 'b'}; var2 = {a : 'b'}; var1 === var2 // false
nickf 2010

@nickf、わかりました。ただし、PHPコードの印章を削除して、JavaScriptでも同じ結果を得ることができます。これらの文字列は同一ではありませんが、値は同一です
まぶたがない2010

21

複数行の文字列:

var str = "これは\
すべて1つ\
ストリング。";

文字列に空白を追加せずに後続の行をインデントすることはできないため、一般に、plus演算子を使用して連結することを好みます。しかし、これは素晴らしいヒアドキュメント機能を提供します。


2
公正な警告-\の後に末尾にスペースがある場合、例外がスローされます。
Daniel Szabo 2012年

21

配列の長さのサイズを変更する

lengthプロパティは読み取り専用ではありません。これを使用して、配列のサイズを拡大または縮小できます。

var myArray = [1,2,3];
myArray.length // 3 elements.
myArray.length = 2; //Deletes the last element.
myArray.length = 20 // Adds 18 elements to the array; the elements have the empty value. A sparse array.

1
サー、これはSOに関する唯一の最も重要な答えであるに違いないと私は信じています。もうpush私のために何もしません、へへ。本当にありがとう。
aefxx 2010年

4
実際には、この方法で作成された要素は実際には存在しません(未定義の値もありませんが、それらにアクセスすると未定義になります)。また、for..inでそれらを繰り返すことはできません。
yorick 2011年

16

空の配列でjoinメソッドを利用して、「-」などの文字列を特定の回数繰り返します。

var s = new Array(repeat+1).join("-");

== 3を繰り返すと、「---」になります。


15

デフォルトの演算子と同様に、||はガード演算子です&&

answer = obj && obj.property

とは対照的に

if (obj) {
    answer = obj.property;
}
else {
    answer = null;
}

1
必ずしもである必要はありませんnull。これは、の場合にのみ当てはまりobj === nullます。
pimvdb 2011

1
||と組み合わせて使用​​することもできます objがまったく存在しない場合、またはオブジェクトは存在するがkeyプロパティが存在しない場合に、バックアップを確保するため。このように、答えは常に定義されます:answer =(obj && obj.property)|| 'backupprop';
dtipson 2015年

13
var tags = {
    name: "Jack",
    location: "USA"
};

"Name: {name}<br>From {location}".replace(/\{(.*?)\}/gim, function(all, match){
    return tags[match];
});

文字列置換のコールバックは便利です。


12

ゲッターとセッター

function Foo(bar)
{
    this._bar = bar;
}

Foo.prototype =
{
    get bar()
    {
        return this._bar;
    },

    set bar(bar)
    {
        this._bar = bar.toUpperCase();
    }
};

私たちに与える:

>>> var myFoo = new Foo("bar");
>>> myFoo.bar
"BAR"
>>> myFoo.bar = "Baz";
>>> myFoo.bar
"BAZ"

はい、それは私が使用した現在のアプローチよりも少し良いでしょう。
アッシュ

@eyelidlessness IEが実装するECMAScript5のObject.definePropertyにあり、他のブラウザーはdefineGetterを使用できます。
イーライグレー

IE8はDOMオブジェクトのゲッター/セッターのみを実装しているため、独自のオブジェクトAPIをすっきりさせることに関しては役に立ちません:-/
Jonny Buchanan

5

これはJavaScript専用ではありませんが、3行のコードのように保存されます。

check ? value1 : value2

値を割り当てない場合(例:fnName?fnName:defaultFn;)、これに相当するものはありますか?
まぶたのない2008年

1
いいえ、三項演算子は厳密に式用です。ステートメントなし
Josh Hinman

1
これを使用して、次のような無名関数を評価できます: "var myFunc =(browserIsIE?function(){...}:function(){...})"。個人的には、かなり紛らわしいのでお勧めしませんが、少なくとも可能です。
nickf 2008年

「評価する」は、おそらくその前のコメントで最高の言葉ではありません。うーん..割り当てますか?
nickf 2008年

@eyelidlessness:はい:fnName?fnName():defaultFn(); //単独で動作します
Ates Goral

4

levikの例についてもう少し:

var foo = (condition) ? value1 : value2;

4
かっこは必要ありません。三項演算子は、他の多くの言語にも共通しています。
Ates Goral

1
括弧は、条件ステートメントに構文上のあいまいさが存在する場合に役立ちます(たとえば、条件ステートメントのどのコンポーネントに?を適用するかを決定する)。
まぶたのない2009


4

次のobj || {デフォルト:true}構文:

これであなたの関数を呼び出す:こんにちは(neededOne && && neededTwo needThree)一つのパラメータが未定義またはfalseをされている場合、それは、(偽)ハロー呼び出します時々便利


4

構成部品の固定セットを使用して状況を解析する場合:

var str = "John Doe";

「destructuringassignment」synatxを使用して、結果を変数に直接割り当てることができます。

var [fname, lname] = str.split(" ");
alert(lname + ", " + fname);

これは、次よりも少し読みやすくなっています。

var a = str.split(" ");
alert(a[1] + ", " + a[0]);

代わりに:

var [str, fname, lname] = str.match(/(.*) (.*)/);

これはJavascript1.7の機能であることに注意してください。現時点では、これがMozilla2.0以降およびChrome6以降のブラウザです。


Safari Javascriptコンソールでこれを試しましたが、解析エラーが発生しました。
まぶたのない2010年

スナップ、私はこれをFirefoxでのみ使用したと思います。ブラウザの互換性に関する注意事項を追加しました。
Chris Noe

Chrome6では動作しませんSyntaxError: Unexpected token [
RaYell 2010年

少し調べてみると、chromeの1.7が完全に標準ではないことが明らかになりました。伝えられるところによると、letにも問題があります:stackoverflow.com/questions/300185/…–
Chris Noe

Chrome 13ではまだ機能しません。これがいつ実装されるかについての手がかりはありますか?
pimvdb 2011



2

単純に:({})で匿名オブジェクトリテラルを作成します。

例:オブジェクトにvalueOfメソッドがあるかどうかを知る必要があります。

var hasValueOf = !!({})。valueOf

ボーナスシンタックスシュガー:ダブルではなく '!!' ほぼすべてのものを非常に簡潔にブール値に変換してくれました。


1

json文字列をeval()して、完全に入力されたデータ構造を取り戻すことができるのが大好きです。私はすべてを少なくとも2回書く必要があるのが嫌いです(1回はIE用、もう1回はMozilla用)。


1

頻繁に使用されるキーワード(または任意のメソッド)をthsのような単純な変数に関連付ける

  var $$ = document.getElementById;

  $$('samText');

3
this値が失われるため、これは(少なくともChromeでは)機能しません。代わりに、を使用する必要がありますdocument.getElementById.bind(document)bindそれがなければ、単にHTMLDocument.prototype.getElementById関数を割り当てるだけであり、それを呼び出す必要があるという情報はありませんdocument
pimvdb 2011

1

半「流暢なインターフェース」を提供するJavaScriptのDateクラス。これは、Dateクラスから日付部分を直接抽出できないことを補います。

var today = new Date((new Date()).setHours(0, 0, 0, 0));

以下は実際にはDateオブジェクトではない数値のみを提供するため、完全に流暢なインターフェイスではありません。

var today = new Date().setHours(0, 0, 0, 0);

1

デフォルトのフォールバック:

var foo = {}; // empty object literal

alert(foo.bar) // will alert "undefined"

alert(foo.bar || "bar"); // will alert the fallback ("bar")

実用的な例:

// will result in a type error
if (foo.bar.length === 0)

// with a default fallback you are always sure that the length
// property will be available.
if ((foo.bar || "").length === 0) 

1

これが私が今発見したものです:関数を呼び出す前のnullチェック:

a = b && b.length;

これは、以下と同等の短いものです。

a = b ? b.length : null;

最良の部分は、プロパティチェーンを確認できることです。

a = b && b.c && b.c.length;

1

リストを操作するのがいかに簡単かが大好きです。

var numberName = ["zero", "one", "two", "three", "four"][number];

そしてハッシュ:

var numberValue = {"zero":0, "one":1, "two":2, "three":3, "four":4}[numberName];

他のほとんどの言語では、これは非常に重いコードになります。値のデフォルトも素敵です。たとえば、エラーコードの報告:

var errorDesc = {301: "Moved Permanently",
                 404: "Resource not found",
                 503: "Server down"
                }[errorNo] || "An unknown error has occurred";

それはすごいですね、これの技術的な名前は何ですか?
trySpace 2014年


0
element.innerHTML = "";  // Replaces body of HTML element with an empty string.

要素のすべての子ノードを削除するためのショートカット。


6
これは実際にはJavascriptではなくDOMであり、現在は非標準です。
まぶたのない2009

0

文字列を整数に変換し、不可能な場合はデフォルトで0にします。

0 | "3" //result = 3
0 | "some string" -> //result = 0
0 | "0" -> 0 //result = 0

ほとんどの場合、0が悪い結果と見なされる場合に、役立つことがあります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.