javascriptタイプシステム——包装対象

6971 ワード

×
目次[1]定義[2]生存期間[3]明示的作成[4]変換関数[5]比較演算
前の話
javascriptオブジェクトは、属性または名前付き値のセットです.'.'記号で属性値を参照します.属性値が関数の場合、方法と呼びます.o.m()によりオブジェクトo中のメソッドを呼び出します.文字列も同様に属性と方法を持つことを発見した.
    var s = 'hello world';
    console.log(s.length);//11
文字列は対象ではないのに、なぜ属性があるのですか?今日紹介した内容を引き出しました.包装の対象です.
 
定義
JavaScriptでは、「すべてのオブジェクト」は、元のタイプの3つの値(数値、文字列、ブール値)まで、一定の条件の下で、自動的にオブジェクトに変換されます.つまり、元のタイプの「包装対象」です.
包装対象は特殊な参照タイプです.文字列、数字、またはブール値の属性または方法を読み取るたびに作成された一時的なオブジェクトをラッピングオブジェクトと呼びます.
文字列の属性と方法を参照するために、javascriptはnew String()を呼び出すことによって文字列値をオブジェクトに変換し、このオブジェクトは文字列の属性と方法を継承し、属性と方法の参照を処理するために使用される.属性や方法の参照が終了すると、この新規作成の対象は破棄されます.数字やブール値も同様です.
[注意]実際にはこの一時的なオブジェクトを作成または廃棄する必要はありませんが、全体のプロセスはこのように見えます.
var s1 = 'some text';
var s2 = s1.substring(2);
//              
var s1 = new String('some text'); //(1)  String         
var s2 = s1.substring(2); //(2)           
s1 = null; //(3)      
 
生存期
引用タイプと基本包装タイプの主な違いは対象の生存期間です.newオペレータによって作成された参照タイプの例は、現在のスコープからストリームが離れる前にメモリに保存されています.自動的に作成された基本包装タイプのオブジェクトは、行コードの実行瞬間だけに存在し、すぐに廃棄されます.これは、実行時にベースタイプの値に属性と方法を追加できないことを意味します.
var s1 = 'some text';
s1.color = 'red';
alert(s1.color);//undefined
var s2 = new Boolean('some text');
s2.color = 'red';
alert(s2.color);//'red'
 
明示的な作成
new操作で明示的に包装対象を作成することができますが、絶対必要な場合はこのようにするべきです.このようなやり方では、基本のタイプを扱うか、それとも引用のタイプを扱うかが分かりにくいです.
二つの方式で明示的にパッケージタイプを作成する方法があります.
【1】Object方式
var s = new Object('abc');
var b = new Object(true);
var n = new Object(123);
【2】コンストラクタ方式
var s = new String('abc');
var b = new Boolean(true);
var n = new Number(123);
 
変換関数
直接呼び出しの変換関数は、newを使用して基本的な包装タイプを呼び出すコンストラクタとは異なり、変換関数を使用して戻るのは基本的なタイプの値です.
var s = 'abc';
var s1 = String(s);
var s2 = new String(s);
var s3 = new Object(s);
console.log(typeof s,typeof s1,typeof s2,typeof s3);//string string object object
 
比較演算
【1】演算子'=''は、元の値とその包装対象を等しくしていると見なします.その一つの操作数は対象であり、対象のvalueOf()メソッドを呼び出す必要があります.Numberオブジェクト、Booleanオブジェクト、StringオブジェクトのvalueOf()方法は、それぞれの元の値を返します.
var s1 = new String('abc');
var s2 = 'abc';
var n1 = new Number(123);
var n2 = 123;
var b1 = new Boolean(true);
var b2 = true;
console.log(s1 == s2, n1 == n2, b1 == b2);//true true true
【2】全等演算子'=='は、元の値とその包装対象を等しくないと見なします.すべての演算子はタイプと値を比較しますので、元の値はそのパッケージの種類とは異なります.
var s1 = new String('abc');
var s2 = 'abc';
var n1 = new Number(123);
var n2 = 123;
var b1 = new Boolean(true);
var b2 = true;
console.log(s1 === s2, n1 === n2, b1 === b2);//false false false
 
参考資料
【1】「javascript高級プログラム設計(第3版)」第3章基本概念第5章引用タイプ【2】「javascript権威ガイド(第6版)」第3章タイプ、値と変数