TypeScript String(文字列)
TypeScriptでは、文字列(String)はテキストデータを表すための基本的なデータ型であり、JavaScriptの文字列の特性を継承および拡張し、同時に静的型チェックを追加します。
構文
var txt = new String("string");
またはより簡単な方法:
var txt = "string";
2つの作成方法と本質のな違い
TypeScriptで文字列を作成するには2つの方法がありますが、両者には型、パフォーマンス、使用シーンにおいて本質的な違いがあります:
方法1:文字列リテラル(推奨)
これはTypeScript/JavaScriptで最も一般的に使用され、パフォーマンスが最適な方法であり、プリミティブ文字列型(string)を作成します。これはTypeScriptの型システムにおけるデフォルトの文字列型でもあります。
// 原始字符串(推荐使用) const txt1: string = "Hello TypeScript"; // 显式指定类型 const txt2 = "Hello JavaScript"; // 类型推导为 string
方法2:Stringオブジェクト(非推奨)
によってnew String()作成されるのはラッパーオブジェクト型(String)であり、本質的にはオブジェクトであってプリミティブ値ではありません。型の混乱とパフォーマンスの低下を引き起こします。
// String 对象(不推荐)
const txtObj: String = new String("Hello Object"); // 类型为 String(对象)
Stringオブジェクトと文字列リテラルは型が異なります:
- 文字列リテラルは基本データ型であり
string、文字列値を直接格納するために使用されます。 StringオブジェクトはString型であり、実際にはオブジェクトであって、プリミティブな文字列値ではありません。
例
let strObject: String = new String("Hello");
console.log(typeof strLiteral); // 出力:"string"
console.log(typeof strObject); // 出力:"object"
| 特性 | 文字列リテラル(string) | Stringオブジェクト(String) |
|---|---|---|
| 型の本質 | プリミティブ値 | 参照型(オブジェクト) |
| パフォーマンス | 効率的で、追加のメモリオーバーヘッドがない | 非効率的で、オブジェクトインスタンスを作成する |
| 型チェック(TypeScript) | TSの基本型の仕様に準拠している | 型が一致しない(例:string型の変数にStringオブジェクトを代入できない) |
| 比較方法 | 値を直接比較する | 参照アドレスを比較する(valueOf()でプリミティブ値を取得する必要がある) |
文字列リテラルとStringオブジェクトの型互換性
TypeScriptでは、stringリテラル型とStringオブジェクト型は完全には互換性がありません。
例えば、string型の変数はStringオブジェクトのメソッドを直接使用できず、逆も同様です。したがって、通常はStringオブジェクトを使用する必要はありません。
例
let strObject: String = new String("Test");
console.log(strLiteral === strObject); // 出力:false、内容は同じだが型が異なる
console.log(strLiteral == strObject); // 出力:true、内容は同じ
console.log(strLiteral === strObject.valueOf()); // 出力:true、オブジェクトをプリミティブ文字列に変換してから比較
strLiteralはプリミティブ文字列型(string)であり、strObjectはStringオブジェクト型(String)です。つまり、それらの型は異なります。
上記のコードをJavaScriptコードに変換すると次のようになります:
例
var strObject = new String("Test");
console.log(strLiteral === strObject); // 出力:false、内容は同じだが型が異なる
console.log(strLiteral == strObject); // 出力:true、内容は同じ
console.log(strLiteral === strObject.valueOf()); // 出力:true、オブジェクトをプリミティブ文字列に変換してから比較
Stringオブジェクトのプロパティ
次の表は、Stringオブジェクトがサポートするプロパティを示しています:
| 番号 | プロパティ & 説明 | 例 |
|---|---|---|
| 1. | constructor
このオブジェクトを作成した関数への参照。 |
var str = new String( "This is string" );
console.log("str.constructor is:" + str.constructor)
出力結果: str.constructor is:function String() { [native code] }
|
| 2. | length
文字列の長さを返します。 |
var uname = new String("Hello World")
console.log("Length "+uname.length) // 输出 11 |
| 3. | prototype
オブジェクトにプロパティとメソッドを追加できます。 |
function employee(id:number,name:string) {
this.id = id
this.name = name
}
var emp = new employee(123,"admin")
employee.prototype.email="[email protected]" // 添加属性 email
console.log("员工号: "+emp.id)
console.log("员工姓名: "+emp.name)
console.log("员工邮箱: "+emp.email)
|
Stringメソッド
次の表は、Stringオブジェクトがサポートするメソッドを示しています:
| 番号 | メソッド & 説明 | 例 |
|---|---|---|
| 1. | charAt()
指定された位置にある文字を返します。 |
var str = new String("サンプル");
console.log("str.charAt(0) 为:" + str.charAt(0)); // R
console.log("str.charAt(1) 为:" + str.charAt(1)); // U
console.log("str.charAt(2) 为:" + str.charAt(2)); // N
console.log("str.charAt(3) 为:" + str.charAt(3)); // O
console.log("str.charAt(4) 为:" + str.charAt(4)); // O
console.log("str.charAt(5) 为:" + str.charAt(5)); // B
|
| 2. | charCodeAt()
指定された位置にある文字のUnicodeエンコーディングを返します。 |
var str = new String("サンプル");
console.log("str.charCodeAt(0) 为:" + str.charCodeAt(0)); // 82
console.log("str.charCodeAt(1) 为:" + str.charCodeAt(1)); // 85
console.log("str.charCodeAt(2) 为:" + str.charCodeAt(2)); // 78
console.log("str.charCodeAt(3) 为:" + str.charCodeAt(3)); // 79
console.log("str.charCodeAt(4) 为:" + str.charCodeAt(4)); // 79
console.log("str.charCodeAt(5) 为:" + str.charCodeAt(5)); // 66
|
| 3. | concat()
2つ以上の文字列を連結し、新しい文字列を返します。 |
var str1 = new String( "サンプル" );
var str2 = new String( "GOOGLE" );
var str3 = str1.concat( str2 );
console.log("str1 + str2 : "+str3) // サンプルGOOGLE
|
| 4. | indexOf()
指定された文字列値が文字列内で最初に出現する位置を返します。 |
var str1 = new String( "サンプル" );
var index = str1.indexOf( "OO" );
console.log("查找的字符串位置 :" + index ); // 3
|
| 5. | lastIndexOf()
文字列を後方から検索し、開始位置(0)から計算して、文字列が最後に出現する位置を返します。 |
var str1 = new String( "This is string one and again string" );
var index = str1.lastIndexOf( "string" );
console.log("lastIndexOf 查找到的最后字符串位置 :" + index ); // 29
index = str1.lastIndexOf( "one" );
console.log("lastIndexOf 查找到的最后字符串位置 :" + index ); // 15
|
| 6. | localeCompare()
ロケール固有の順序で2つの文字列を比較します。 |
var str1 = new String( "This is beautiful string" );
var index = str1.localeCompare( "This is beautiful string");
console.log("localeCompare first :" + index ); // 0
|
| 7. | match() 1つ以上の正規表現のマッチを見つけます。 |
var str="The rain in SPAIN stays mainly in the plain"; var n=str.match(/ain/g); // ain,ain,ain |
| 8. | replace()
正規表現にマッチする部分文字列を置き換えます。 |
var re = /(\w+)\s(\w+)/; var str = "zara ali"; var newstr = str.replace(re, "$2, $1"); console.log(newstr); // ali, zara |
| 9. | search()
正規表現にマッチする値を検索します。 |
var re = /apples/gi;
var str = "Apples are round, and apples are juicy.";
if (str.search(re) == -1 ) {
console.log("Does not contain Apples" );
} else {
console.log("Contains Apples" );
}
|
| 10. | slice()
文字列の一部を抽出し、抽出された部分を新しい文字列として返します。 |
|
| 11. | split()
文字列を部分文字列の配列に分割します。 |
var str = "Apples are round, and apples are juicy.";
var splitted = str.split(" ", 3);
console.log(splitted) // [ 'Apples', 'are', 'round,' ]
|
| 12. | substr()
開始インデックス番号から文字列内の指定された数の文字を抽出します。 |
|
| 13. | substring()
文字列内の2つの指定されたインデックス番号の間の文字を抽出します。 |
var str = "サンプル GOOGLE TAOBAO FACEBOOK";
console.log("(1,2): " + str.substring(1,2)); // U
console.log("(0,10): " + str.substring(0, 10)); // サンプル GOO
console.log("(5): " + str.substring(5)); // B GOOGLE TAOBAO FACEBOOK
|
| 14. | toLocaleLowerCase()
ホストのロケールに基づいて文字列を小文字に変換します。数少ない言語(トルコ語など)のみがロケール固有の大文字小文字のマッピングを持っています。 |
var str = "サンプル Google"; console.log(str.toLocaleLowerCase( )); // サンプル google |
| 15. | toLocaleUpperCase()
ホストのロケールに基づいて文字列を大文字に変換します。数少ない言語(トルコ語など)のみがロケール固有の大文字小文字のマッピングを持っています。 |
var str = "サンプル Google"; console.log(str.toLocaleUpperCase( )); // サンプル GOOGLE |
| 16. | toLowerCase()
文字列を小文字に変換します。 |
var str = "サンプル Google"; console.log(str.toLowerCase( )); // サンプル google |
| 17. | toString()
文字列を返します。 |
var str = "サンプル"; console.log(str.toString( )); // サンプル |
| 18. | toUpperCase()
文字列を大文字に変換します。 |
var str = "サンプル Google"; console.log(str.toUpperCase( )); // サンプル GOOGLE |
| 19. | valueOf()
指定された文字列オブジェクトのプリミティブ値を返します。 |
var str = new String("サンプル");
console.log(str.valueOf( )); // サンプル
|
Stringオブジェクトの使用に関する推奨事項
TypeScriptでは、Stringオブジェクトの使用は通常不要であり、stringリテラルを直接使用する方が効率的で、TypeScriptのベストプラクティスに沿っています:
- パフォーマンス:
Stringオブジェクトは参照型であるため、より多くのメモリを占有し、新しいオブジェクトを作成するたびにパフォーマンスのオーバーヘッドが大きくなります。 - 型安全性:TypeScriptはより
stringリテラル型の使用を推奨し、コードの簡潔さと一貫性を保ちます。
どうしてもStringオブジェクトのメソッドを使用する必要がある場合は、valueOf()メソッドを使用してオブジェクトをプリミティブ文字列に変換してから、処理を続行できます。
通常、TypeScriptはstringリテラル型を直接使用することを推奨し、コードを簡素化してパフォーマンスを向上させ、不要な型変換と複雑さを回避します。
例
let strObject: String = new String("Avoid using String objects.");
console.log(strLiteral); // 出力:"Use string literals whenever possible!"
console.log(strObject.valueOf()); // 出力:"Avoid using String objects."