3

私はjqueryプラグインを読んでいて、この興味深い構文を見つけました:

'sth'+ +new Date

作成者が一意の ID に使用した数値文字列を作成します。sth1237004731731

どんな構文なのか気になるのですが、それについての読み物があれば教えてください。ありがとう!

4

2 に答える 2

6

JavaScript の型強制のいくつかの副作用を使用して、(おそらく要素の) 一意の識別子を作成しています。紛らわしい部分は+new Date. ここで、new Date(またはnew Date()) はオブジェクトを返しDateます。+しかし、これの前に aまたは aを置くと-、JS インタープリターはこの値を強制的にNumberオブジェクトに強制し、JS が行う方法はDate>Number タイムスタンプ (またはgetTime()) を返すことです。

したがって、このコードは次のように別の方法で表現できます。

var date = new Date(), // "Mon May 14 2012 10:03:58 GMT-0400 (EST)"
    timestamp = date.getTime(), // 1337004238612
    identifierString = "sth" + timestamp.toString();

そんなに冗長にする必要はないと合理的に主張するかもしれないので、個人的にはおそらくこれを次のように書いたでしょう:

var identifier = "sth" + (new Date()).getTime();

ただし、誰かがあなたのコードを保守する必要があると予想される場合は、あなたの例のようなコーディングは避けてください。それがあなたの足を止めたなら、それはおそらく多くの人々を止めるでしょう. コーディング スタイルとは、単にインタプリタに意図を表現することではなく、人間の開発者に意図を表現することです。経験豊富な開発者の頭の中でコードがブラウザーで機能しても、構文エラーで失敗する場合は、単純明快で間違っています。

于 2012-05-14T14:20:28.703 に答える
5

これは、単項演算子の興味深い使い方です+。基本的に、この式を 3 つの部分に分解し、2 項+演算子で分割できます。

"sth"、そして+、そして+new Date

バイナリの最初のオペランド+は単なる一般的な文字列リテラルです。2 番目のオペランドは単項+演算子を使用します。これは、リンクされた標準状態として、そのオペランドを に変換しNumberます。

new演算子は優先順位が最も高いため、 unary よりも「強くバインド」されます。これは、最初に評価されること+を意味します。new Dateしたがって、単項のオペランドは+、式の結果ですnew Date。もちろん、new Date単に空のDateオブジェクトを作成します。§ 15.9.3.3 new Date() に従って:

新しく構築されたオブジェクトの [[PrimitiveValue]] 内部プロパティは、現在の時刻を識別する時刻値 (UTC) に設定されます。

つまり、 aは現在の時刻を表すオブジェクトnew Dateになります。Date次に、+new Date空白のDateオブジェクトを数値に変換します。

短い答え

仕様は長く、従うのは難しいです。つまり+new Date、現在の時刻に関連付けられた UNIX タイムスタンプを返します。

長い答え: 仕様に従う

仕様に従う長い答えは、評価されたオペランドである単項+呼び出しです。は単純に を返すので、式は になります。ToNumber(GetValue(expr))exprGetValue(dateObj)dateObjToNumber(dateObj)

の結果はToNumber、引数の型によって異なります。オブジェクトの場合は を返しますToNumber(ToPrimitive(input argument, hint Number))

ToPrimitive次に、 objectのvalueOfプロパティをDate呼び出します。これはNumber、オブジェクトに関連付けられた時間値ですDate。ついに、私たちが探していたものです! 次に、チェーンを上に戻ります。ToNumber(num)単純に を返しますnum

もちろん、そこから文字列"sth"と の結果+new Dateが連結され (必要に応じて仕様で見つけることができます)、探していた結果が得られます。

于 2012-05-14T14:24:34.537 に答える