[解決済み] JavaScriptで("foo" === new String("foo")) が false に評価されるのはなぜですか?
質問
文字列を比較するときは常に === (トリプル等号、厳密比較) を使うようにしようと思っていましたが
"foo" === new String("foo")
はfalseで、これも同じ。
var f = "foo", g = new String("foo");
f === g; // false
もちろんです。
f == g; // true
では、文字列の比較には常に == を使用することが推奨されるのでしょうか、それとも常に変数を文字列に変換してから比較するのでしょうか?
どのように解決するのですか?
"foo"
は文字列
プリミティブ
. (この概念はC#やJavaには存在しません)
new String("foo")
はボックス化された文字列オブジェクトです。
は
===
演算子
は、プリミティブとオブジェクトで異なる振る舞いをします。
.
プリミティブ(同じ型)を比較する場合。
===
は両方が同じ値であれば真を返します。
オブジェクトを比較するとき
===
は同じオブジェクトを参照している場合のみ真を返します(参照による比較)。 したがって
new String("a") !== new String("a")
.
あなたの場合
===
は false を返します。オペランドが異なる型(一方はプリミティブ、他方はオブジェクト)であるためです。
プリミティブは全くオブジェクトではありません。
そのため
typeof
演算子は
"object"
を返しません。
プリミティブのプロパティにアクセスしようとすると(オブジェクトとして使用する)、Javascript言語はそれをオブジェクトにボックス化し、毎回新しいオブジェクトを作成します。 これについては の仕様です。 .
このため、プリミティブにプロパティを付けることはできません。
var x = "a";
x.property = 2;
alert(x.property) //undefined
と書くたびに
x.property
, a
異なる
ボックス型
String
オブジェクトが作成される。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptで文字列をbooleanに変換するにはどうしたらいいですか?
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] JavaScriptでクエリ文字列の値を取得するにはどうすればよいですか?
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み] JSXとLoadshを使用して、ある要素をn回繰り返す方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptの「new」キーワードとは何ですか?
-
[解決済み] <Enter>でjQuery UIダイアログを送信する
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] Chromeの拡張機能開発にWebStormを使用するにはどうすればよいですか?
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?
-
[解決済み] Java の文字列プールとは何ですか?また、"s" と new String("s") とはどう違うのですか?重複