[解決済み] JavaScript の文字列連結における null または未定義の値に関する挙動
質問
ご存知のように、JavaScriptでは
'' + null = "null"
と
'' + undefined = "undefined"
(と表示されます(私がテストできるほとんどのブラウザ:Firefox、Chrome、IEで)。この奇妙な現象の原因 (Brendan Eich の頭の中は一体どうなっているのか!) と、ECMA の将来のバージョンでこれを変更する狙いがあるのかどうかを知りたいと思います。また、ECMA の将来のバージョンで変更する狙いがあるのかどうか知りたいです。
'sthg' + (var || '')
のようなサードパーティフレームワークを使用しなければならないのはかなり不満です。
アンダースコア
などのサードパーティフレームワークを使うのは、ゼリーの釘打ちにハンマーを使っているようなものです。
編集する。
StackOverflowが要求する基準を満たし、私の質問を明確にするために、それは3重のものである。
-
JS を変換する奇妙な現象の背景にはどのような歴史があるのでしょうか。
null
またはundefined
の文字列をString
を連結するのですか? - ECMAScript の将来のバージョンで、この動作が変更される可能性はありますか?
-
を連結する最もきれいな方法は何ですか?
String
と潜在的なnull
またはundefined
オブジェクトを、この問題に陥ることなく(いくつかの"undefined"
の"null"
を含む)ですか?主観的な基準で 一番きれい というのは、短い、きれい、効果的という意味です。というのは不要です。'' + (obj ? obj : '')
が本当にきれいでないことは言うまでもありません...
どのように解決するのですか?
<ブロッククオートこの問題に陥ることなく、NULLまたは未定義のオブジェクトを含む文字列を連結する最も美しい方法は何ですか[・・・]?
いくつかの方法がありますし、あなた自身もそれらに言及しています。手短に言うと だけ 関数です。
const Strings = {};
Strings.orEmpty = function( entity ) {
return entity || "";
};
// usage
const message = "This is a " + Strings.orEmpty( test );
もちろん、実際の実装は自分のニーズに合わせて変更することができます(そうすべきです)。そしてこれがすでに、カプセル化を導入したこの方法が優れていると思う理由です。
本当に、カプセル化されていない場合、最も美しい方法は何かと尋ねればいいのです。この質問を自分にするのは すでに というのは、実装をこれ以上変更できないような状況になることが分かっているので、すぐに完璧なものにしたいと思うからです。しかし、これが問題なのです。要件、見解、そして環境さえも変化するのです。進化するんです。だから、1行と、おそらく1つか2つのテストを適応させるだけで、実装を変更できるようにしてはどうでしょうか。
実際のロジックをどのように実装すればよいのか、本当に答えていないので、これを不正行為と呼ぶこともできます。しかし、それが私の言いたいことです:それは重要ではありません。まあ、少しはそうかもしれません。しかし、本当に、変更するのは簡単なので、心配する必要はありません。また、インライン化されていないため、この方法で実装するか、より洗練された方法で実装するかどうかにかかわらず、見た目もずっと美しくなります。
もし、コード全体で
||
を繰り返している場合、2つの問題に直面します。
- コードが重複する。
- そして、コードを重複させるので、将来の保守や変更が難しくなります。
そしてこれらは、高品質のソフトウェア開発に関して、一般にアンチパターンとして知られている2つのポイントです。
一部の人は、これはオーバーヘッドが多すぎると言い、パフォーマンスについて話すでしょう。それは非理性的なものです。1 つには、これはほとんどオーバーヘッドを追加しません。もしこれが心配なら、あなたは間違った言語を選択しました。jQueryだって関数を使っている。マイクロ最適化を克服する必要があります。
もうひとつは、コードコンパイラ=ミニファイアを使うことです。この分野の優れたツールは、コンパイルの段階で、どのステートメントをインライン化するかを検出しようとします。この方法では、コードをクリーンかつ保守的に保つことができ、また、まだそれを信じている場合、あるいは本当にこれが重要な環境である場合は、パフォーマンスの最後の一滴を得ることができます。
最後に、ブラウザーに対する信頼があります。ブラウザはコードを最適化し、最近ではかなり良い仕事をしてくれます。
関連
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] JavaScriptでクエリ文字列の値を取得するにはどうすればよいですか?
-
[解決済み] 変数が「未定義」または「NULL」であるかどうかを判断するにはどうすればよいですか?
-
[解決済み] JavaScriptのnullとundefinedの違いは何ですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] <Enter>でjQuery UIダイアログを送信する
-
[解決済み] Node.jsでbase64エンコードされた画像をAmazon S3へアップロードする
-
[解決済み] moment.jsでミュータビリティを回避するには?
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] javascriptでオプションのパラメータを扱う
-
[解決済み] JavaScriptのArray.sort()メソッドでシャッフルするのは正しいのか?
-
[解決済み] javascriptのキャンバスで画像をリサイズする (スムーズ)
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる