この記事は、Huaweiクラウドコミュニティ「TypeScriptでの文字列と文字列の違い」、作成者:gentle_zhouから共有されています。
バックグラウンド
JavaScript言語とは異なり、TypeScriptは静的型付けを使用します。つまり、変数が保持できるデータの型を指定します。次の図に示すように、変数がJSに保存できるデータ型を指定すると、「型注釈はTSファイルでのみ使用できます」というエラーが報告されます。
TypeScriptはJavaScriptのスーパーセットです。ブラウザで実行する前に、JavaScriptを生成するためにTypeScriptをコンパイル(構文変換)する必要があります。また、stringとStringの2つのデータ型を区別します。一般に、文字列はプリミティブ型を表し、文字列はオブジェクトを表します。
原生string
JavaScriptはES6標準で6つのプリミティブ型(数値)をサポートしており、文字列はその1つです。
ネイティブ文字列は、文字通り型が定義されていない、リテラルが定義された文字列、文字列が定義された文字列など、プロパティを含まない(つまり、プロパティがない)値です。文字列関数呼び出しから返される文字列の一部は、プリミティブ型として分類することもできます。
上記の3つの変数の型()typeof()
は文字列です。
オブジェクト文字列
オブジェクトはさまざまなプロパティの蓄積であり、1つのオブジェクトで多くの対応するメソッドを呼び出すことができます。let msg3: String = new String('Hello world!');
この変数msg3のタイプはオブジェクトです。console.log(typeof(msg3)); // object
Stringオブジェクトでサポートされるメソッド:
コード比較
次の4つの変数の型探索と比較を行います。
let msg: string = 'Hello world!';
let msg2: String = 'Hello world!';
let msg22 = 'Hello world!'; //字面上没有定义类型
let msg3: String = new String('Hello world!');
console.log(typeof(msg)); //string
console.log(typeof(msg2)); //string
console.log(typeof(msg22)); //string
console.log(typeof(msg3)); //object
console.log(msg === msg2); //true
console.log(msg === msg3); //false
console.log(msg2 === msg3); //false
复制代码
なぜStringオブジェクトが必要なのですか
まず、キーワードnewを使用して新しいStringオブジェクトを作成すると、TSは新しいオブジェクトを作成します。つまり、newを使用して2つの新しいStringオブジェクトを作成し、内容が同じであっても、それらは異なるメモリを指します。
次の2つの栗を取ります。
1. a1とb1を使用して同じ値の2つの変数を表す場合、それらは同じです。新しい2つのオブジェクトを新しいもので作成すると、値が同じであっても、それらは異なります(次の図は出力false, true
):
2. eval()関数の役割:式の値を計算するために使用されます。eval()をstringに直接割り当て、stringが計算された文字列である場合、計算された値を返します。eval()をStringに割り当てると、プリミティブ型ではないため、Stringオブジェクトのみが返されます。 (次の図が出力されます27, :"8 + 20", 28
):
次に、Stringオブジェクトはプロパティを持つことができるためです。Stringオブジェクトを使用して、プロパティに追加の値を保持できます。この使用法は一般的ではありませんが、それでもTSの機能です。
var prim = 'hello HW';
var obj = new String('hello HW Cloud');
prim.property = 'PaaS'; // Invalid
obj.property = 'PaaS'; // Valid
console.log(obj.property); //输出为PaaS
复制代码
2つの違いの要約
文字列プリミティブ型 | 文字列オブジェクト |
---|---|
広く使われています | めったに使われません |
値を保持するだけ | 値に加えてプロパティを保持する機能 |
値は不変であるため、スレッドセーフです | 文字列オブジェクトは変更可能 |
道はない | 文字列オブジェクトにはさまざまなメソッドがあります |
同じリテラル値で2つの別々の文字列を作成することはできません | new 2つのオブジェクトを作成できます |
ネイティブデータ型です | プリミティブデータ型をラップしてオブジェクトを作成します |
渡される値は、ネイティブデータ自体のコピーです | 渡される値は実際のデータへの参照です |
eval()関数を使用すると、ソースコードとして直接処理されます | eval()関数を使用すると、文字列に変換されます |