これら2つの情報源から私が推測できることから:
オブジェクトのコンテキストでプリミティブ データ型が使用されると、JavaScript では内部的にオブジェクトに変換されます。ただし、オブジェクトは使用後にメモリから削除されるため、これは一時的な変換にすぎません。
私の質問は、そのようなアプローチを使用する利点は何ですか? メモリを節約するだけですか?それとも他のアドバンテージがありますか?
これら2つの情報源から私が推測できることから:
オブジェクトのコンテキストでプリミティブ データ型が使用されると、JavaScript では内部的にオブジェクトに変換されます。ただし、オブジェクトは使用後にメモリから削除されるため、これは一時的な変換にすぎません。
私の質問は、そのようなアプローチを使用する利点は何ですか? メモリを節約するだけですか?それとも他のアドバンテージがありますか?
JavaScriptがプロトタイプベースのプログラム言語だからです。
プロトタイプベースのプログラミングは、プログラマーがいくつかの例の動作に焦点を合わせ、後でクラスと同様の方法で使用される典型的なオブジェクトにこれらのオブジェクトを分類することを後で心配するように促すものと見なされます。そのため、多くのプロトタイプベースのシステムは、実行時にプロトタイプを変更することを推奨しています。
それはあなたがこのようなことをすることができることを決定します:
var str = 'foo'
str.weight // just return 'undefined'
var yes = true, no = false
yes.__proto__.length = function() { return this.toString().length; }
yes.length() // 4
no.length() // 5
var num = 10, amount = 0
num.__proto__.plus = function(num) { return this + num; }
amount.plus(num) // 10
しかし、残念ながら、JavaScriptの一部の機能は、Javaの影響を受けていました。たとえば、プリミティブとオブジェクトの区別などです。そのため、次のような有線のものが得られます。
var str = 'foo'
str.weight = 42
str.weight // undefined
str = new String('foo')
str.weight = 42
str.weight // 42
1.toString() // error!
var n = 1
n.toString() // '1'
JavaScript が提供する利点の 1 つは、あなたが言及したことのおかげで簡単な型強制だと思います。
あるコメントが以前に暗示していたように、JavaScript は緩く型付けされています。変数の種類を宣言しなくても変数を宣言できるため、その変数で何をしているのかを知らなくてもかまいません。これには、次のように記述できるなどの単純な利点があります。
var str = 'hello user #',
num = 3,
sayhello = str + num;
alert(sayhello); // alerts 'hello user #3'
ここで、それ自体が文字列であるかのように、数値を文字列に単純に追加できることに注意してください。
したがって、より強く型付けされた言語ではおそらくそれほど簡単に使用できないであろう、多くの演算子とメソッドが利用可能です。parseInt
最初に引数の型をチェックまたは変換しなくても、引数に対してメソッドを使用できます。
var returnWholeNumber = function (arg) {
return parseInt(arg, 10);
},
str = '5 is the answer',
num = 8.19437;
alert(returnWholeNumber(str)); // alerts number 5
alert(returnWholeNumber(num)); // alerts number 8
JavaScript は、一時的なオブジェクト ラッパーを提供することで、自分で変換を行う必要がなくなります。実行しようとしていることに基づいてラッパーを提供し、それを破棄するだけです。その結果、JavaScript はより厳密に型付けされた言語よりもはるかに動的で表現力に優れています。
これは、条件にも役立ちます。一部の値 (0
または空の string''
など) は、falseyと呼ばれるものです。そうすれば、単純なブール チェックを行うことができ、JavaScript はプリミティブ データ型をブール ラッパーでラップします。
if (!userInput) {
alert('no input');
}
ただし、型強制は混乱を招く可能性があり、注意が必要です。
alert('1' + 2 + 3); // alerts 123
alert('1' + '2' + '3'); // alerts 123
alert(1 + 2 + 3); // alerts 6
条件にも。意図しない強制を避けるために、型をチェックするときにトリプル イコールを使用します。
var i = '3';
if (i == 3) { // type-coercing conditional; i can be a string or a number and this will be true
alert('i is 3'); // will successfully alert
}
if (i === 3) { // type-checking conditional; i has to be an actual number (and the value must be 3)
alert('i is a number 3'); // will not alert because i is a string
}