var a = 1;
var b = Number(1);
var c = new Number(1);
私はこれらの3つのステートメントの違いは何だろうと思っていました。if(a===b)
を与えるように、最初と2番目のステートメントは同じであることを理解していますtrue
が、 3番目のステートメントはタイプ番号のオブジェクトを作成します。
私が知りたいのは、これらの方法がどのように異なるか、そして一方が他方に対して与える利点は何ですか?
var a = 1;
var b = Number(1);
var c = new Number(1);
私はこれらの3つのステートメントの違いは何だろうと思っていました。if(a===b)
を与えるように、最初と2番目のステートメントは同じであることを理解していますtrue
が、 3番目のステートメントはタイプ番号のオブジェクトを作成します。
私が知りたいのは、これらの方法がどのように異なるか、そして一方が他方に対して与える利点は何ですか?
のような値1
はプリミティブであり、オブジェクトではありません。JavaScriptは通常Number
、必要に応じて数値をオブジェクトにプロモートします。明示的に作成する理由はめったになく、特に「利点」はありません。コンストラクターは値を数値に強制するいくつかの方法の1つですがNumber(1)
、のような理由もありません。Number
つまり、トラブルの世界を救いたいのであれば、コンストラクターnew String()
とコンストラクターは無視されます。ここで紹介する最初の2つのメソッドは、変数に数値定数を割り当てます。3番目の方法は、あなたが言うように、オブジェクトを作成します。そのオブジェクトの値はになりますが、オブジェクトに設定した特定のメソッドを失うことなく、その値を変更できます。new Number()
1
オブジェクトに数値や文字列を格納することには、それほど多くの利点はありません。AFAIK、あなたが「得る」唯一のことは、などの特定のメソッドを呼び出すときの定数に対する非常に、非常に、非常にわずかなパフォーマンスの違いtoExponential
です...
私の見解では、それはあなたのすべての数のオブジェクトを作成する手間をかける価値はありません'使用する必要があります。私はそれをJSの悪い部分の1つと考えており、Javaアプレットの開発者に言語を親しみやすくすることを目的としています。
2つ目は、新しいキーワードを使用せずに、型キャストの並べ替えを可能にします。Number(document.getElementById('formElem').value) === 123;
その用途があります(私の経験では、主にDateオブジェクトを使用します)。しかし、繰り返しになりますが、数値への変換は、+
演算子を使用して行うこともできます。+document.getElementById('formElem').value) === 123
全体として、これらのプリミティブコンストラクターには近づかないでください。それらがまだ存在する唯一の理由は、それらがオブジェクトであり、したがってプロトタイプを持っているためです。これが利点です。
Number.prototype.addOneToString = function()
{
return (1+this).toString();
};
String.prototype.UpperFirst = function()
{
return this.charAt(0).toUpperCase() + this.slice(1);
}
var foo = new Number(3);
foo.addOneToString();//returns "4"
foo = new String('foo');
foo.UpperFirst();//Foo
JSは、対応するオブジェクトのインスタンスで定数オペランドをラップするため、ステートメントで必要な場合は、任意の定数にプロトタイプメソッド(ネイティブメソッドまたは自作メソッド)を適用できます。(これについてはPointyに感謝し、+ 1)
(3).addOneToString();//"4"
'foo'.UpperFirst();//Foo
ですから、それらをレガシーの癖と見なしてください。それは、プロトタイプのためにまだ存在しています。
ES12以降では、以下の方法を使用して多数を宣言できます。
const oneMillion = 1_000_000;
var oneMillion1 = 1_000_000;
_
苦い読みやすさのために、セパレータを使用することができます