基本
ご存じないかもしれませんが、JavaScriptでは、文字列、数値、ブールプリミティブを操作するたびに、オブジェクトのシャドウと強制の隠された世界に入ります。
文字列、数値、ブール、null、未定義、およびシンボル。
JavaScriptでは7つのプリミティブ型があります:undefined
、null
、boolean
、string
、number
、bigint
とsymbol
。それ以外はすべてオブジェクトです。プリミティブ型boolean
、string
およびnumber
対応するオブジェクトによってラップすることができます。これらのオブジェクトはBoolean
、それぞれ、String
およびNumber
コンストラクタのインスタンスです。
typeof true; //"boolean"
typeof new Boolean(true); //"object"
typeof "this is a string"; //"string"
typeof new String("this is a string"); //"object"
typeof 123; //"number"
typeof new Number(123); //"object"
プリミティブにプロパティがない場合、なぜ"this is a string".length
値を返すのですか?
JavaScriptはプリミティブとオブジェクトの間で容易に強制するからです。この場合、プロパティの長さにアクセスするために、文字列値は文字列オブジェクトに強制変換されます。文字列オブジェクトは、ほんの一瞬だけ使用され、その後、ガベージコレクションの神々に捧げられます。しかし、テレビの発見番組の精神では、とらえどころのない生き物を閉じ込めて、さらに分析するために保存します…
これをさらに詳しく説明するために、新しいプロパティを文字列コンストラクタプロトタイプに追加する次の例を検討します。
String.prototype.sampleProperty = 5;
var str = "this is a string";
str.sampleProperty; // 5
これにより、プリミティブは、それぞれのオブジェクトコンストラクターによって定義されたすべてのプロパティ(メソッドを含む)にアクセスできます。
したがって、必要に応じて、プリミティブ型がそれぞれの対応するオブジェクトに適切に強制変換されることがわかりました。
toString()
メソッドの分析
次のコードを検討してください
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
myObj.toString(); // "[object Object]"
myFunc.toString(); // "function(){}"
myString.toString(); // "This is a sample String"
myNumber.toString(); // "4"
myArray.toString(); // "2,3,5"
上で説明したように、実際に起こっていることはtoString()
、プリミティブ型でメソッドを呼び出すときに、メソッドを呼び出す前に、対応するオブジェクトに強制変換する必要があることです。
つまり、他のプリミティブ型とmyNumber.toString()
同等でNumber.prototype.toString.call(myNumber)
あり、同様です。
しかし、プリミティブ型がtoString()
対応するオブジェクトコンストラクター関数の対応するメソッドに渡される代わりに、プリミティブ型がパラメーターとしてtoString()
オブジェクト関数コンストラクター(Object.prototype.toString.call(x)
)のメソッドに渡されるように強制した場合はどうなるでしょうか。
Object.prototype.toString()をよく見る
ドキュメントに従って、toStringメソッドが呼び出されると、次の手順が実行されます。
this
値がの場合undefined
、を返し"[object Undefined]"
ます。
this
値がの場合null
、を返し"[object Null]"
ます。
- この値が上記のいずれでもない場合、Let は、値を引数として渡して
O
呼び出した結果になります。toObject
this
- classをの
[[Class]]
内部プロパティの値としますO
。
- 3つの文字列を連結した結果であるString値を返します
"[object "
、class
と"]"
。
次の例からこれを理解してください
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
var myUndefined = undefined;
var myNull = null;
Object.prototype.toString.call(myObj); // "[object Object]"
Object.prototype.toString.call(myFunc); // "[object Function]"
Object.prototype.toString.call(myString); // "[object String]"
Object.prototype.toString.call(myNumber); // "[object Number]"
Object.prototype.toString.call(myArray); // "[object Array]"
Object.prototype.toString.call(myUndefined); // "[object Undefined]"
Object.prototype.toString.call(myNull); // "[object Null]"
参照:https
:
//es5.github.io/x15.2.html#x15.2.4.2 https://es5.github.io/x9.html#x9.9
https://javascriptweblog.wordpress.com/ 2010/09/27 / the-secret-life-of-javascript-primitives /