3 と new Number(3) は完全に異なる値であり、一方は Number型で、もう一方は Object 型であることを認識する必要があります。
Number、String、Boolean の 3 つのコンストラクターは二重の目的を持ち、new と共に使用するとオブジェクトを生成し、直接呼び出すと必須の型変換を表します。
Symbol 関数は特別で、new で直接呼び出すとエラーがスローされますが、それでも Symbol オブジェクトのコンストラクターです。
多くの慣行では、 「==」の使用を禁止し、明示的な型変換後に比較するためにプログラマーが === を使用することを要求することが推奨されています。
文字列から数値への型変換:
2 番目のパラメーターが渡されない場合、parseInt は 16 進数のプレフィックス "0x" のみをサポートし、数字以外の
文字を無視し、科学表記法をサポートしません。一部の古いブラウザー環境では、parseInt は 0 で始まる数字を 8 進プレフィックスとしてサポートしており、これが多くのエラーの原因となっています。したがって、どの環境でも、parseInt の 2 番目のパラメーターを渡すことをお勧めします。
また、parseFloat は元の文字列を decimal として直接解析します。他の基数は導入されません。
ほとんどの場合、Number は parseInt および parseFloat よりも適切な選択です。
ボクシング変換:
Number、String、Boolean、Symbol の 各基本型には、オブジェクト内に対応するクラスがあり、基本型を対応する object に変換することをいわゆるボックス変換といい、型変換において非常に重要な型です。
グローバルな Symbol 関数を new で呼び出すことはできませんが、ボックス化メカニズムを使用して Symbol オブジェクトを取得したり、関数のcall メソッドを使用してボックス化を強制したりできます。
//我们定义一个函数,函数里面只有 return this. //然后我们调用函数的 call 方法到一个Symbol 类型的值上. //这样就会产生一个 symbolObject。 var symbolObject = (function(){ return this; }).call(Symbol("a")); console.log(typeof symbolObject); //object console.log(symbolObject instanceof Symbol); //true console.log(symbolObject.constructor == Symbol); //true
The boxing mechanism will often generate temporary objects. 高パフォーマンスが必要なシナリオでは、基本型のボックス化変換を避けるようにする必要があります。
組み込みオブジェクト関数を使用して、JavaScript コードで明示的にボックス化機能を呼び出すことができます。
var symbolObject = Object(Symbol("a")); console.log(typeof symbolObject); //object console.log(symbolObject instanceof Symbol); //true console.log(symbolObject.constructor == Symbol); //true
JavaScript ではプライベート Class プロパティを変更する方法がないため、
Object.prototype.toString はオブジェクトに対応する基本型を正確に識別できるメソッドであり、
instanceof よりも正確です。ただし、 call 自体が boxing operation を生成するため、typeof と連携して基本型とオブジェクト型を区別する必要があることに
注意してください。
開梱変換:
ボックス化解除変換は、 valueOfおよびtoStringを呼び出して、ボックス化されていないプリミティブ型を取得しようとします。valueOf も
toString も存在しない場合、またはプリミティブ型が返されない場合は、TypeError が発生します。o*2 の操作を実行すると、最初に valueOf が実行され、次に toString が実行され、最後に TypeError がスローされることがわかります。これは、ボックス化解除の変換が失敗したことを意味します。
var o = { valueOf : () => {console.log("valueOf"); return {}}, toString : () => {console.log("toString"); return {}} } o * 2 // valueOf // toString // TypeError
String へのボックス化解除変換では、toString の呼び出しが優先されます。前の操作を o*2 から String(o) に変更すると、
呼び出しの順序が変更されていることがわかります。var o = { valueOf : () => {console.log("valueOf"); return {}}, toString : () => {console.log("toString"); return {}} } String(o) // toString // valueOf // TypeError
練習問題:
ネイティブの Number と parseInt を使用せず、JS コードを使用して String を Number に変換する場合、どうすればよいでしょうか?
let StringToNumber = (str)=>{ let arr = str.trim().split('') let sign = arr[0] === '-' ? -1 : 1 //sign标记符号 if (sign === -1 || str[0] === '+') { //如果有符号就删除 arr.shift() } return sign * arr.reduce((total, cur)=>( total * 10 + (cur >= '0' && cur <= '9' ? (cur - '0') : NaN) )) }