梱包の種類
典型的な実際の質問
- JavaScriptのラッパー型を理解していますか?
梱包の種類
ESでは、データは基本データ型と参照型に分類されます。
最新のES標準定義によれば、基本的なデータ型 (プリミティブ値) には、unknown、null、boolean、number、symbol、string、bigInt が含まれます。
参照タイプには、Object、Array、Date、RegExpなどが含まれます。
基本データ型と参照型の明らかな違いの 1 つは、参照型には独自の組み込みメソッドがあり、他のメソッドをカスタマイズしてデータを操作することもできるのに対し、基本データ型は参照型のような独自の組み込みメソッドを持つことができないことです。 . メソッドはデータに対してさらに多くの操作を実行します。
しかし、基本的なデータ型では本当にメソッドを使用できないのでしょうか? これは確かにいくつかの基本的なタイプに当てはまります。
ただし、 ESによって提供される、対応する特別な参照型 (パッケージ型) が3 つあります: Boolean、Number、および Stringです。
他の参照型と同様、基本的なラッパー型には、データに対して追加の操作を実行するためのメソッドが組み込まれています。次のように:
var str = 'hello'; // string 基本类型
var s2 = str.charAt(0);
console.log(s2); // h
上記の文字列は基本的な型ですが、charAt()メソッドを呼び出すことができます。
主な理由は、コードの 2 行目が実行されると、次の手順がバックグラウンドで自動的に実行されるためです。
- String型のインスタンスを自動的に作成します(基本型の値とは異なり、このインスタンスは基本パッケージ化型のオブジェクトです)。
- インスタンス(オブジェクト)上で指定されたメソッドを呼び出します。
- このインスタンスを破棄します
コードでの説明は次のとおりです。
//我们平常写程序的过程:
var str = 'hello'; // string 基本类型
var s2 = str.charAt(0); // 在执行到这一句的时候 后台会自动完成以下动作 :
(
var _str = new String('hello'); // 1 找到对应的包装对象类型,然后通过包装对象创建出一个和基本类型值相同的对象
var s2 = _str.charAt(0); // 2 然后这个对象就可以调用包装对象下的方法,并且返回结给 s2.
_str = null; // 3 之后这个临时创建的对象就被销毁了, str =null;
)
console.log(s2); // h
console.log(str); // hello
基本的な型の値に対して呼び出すことができるメソッドはありませんが、バックグラウンドで一時的に作成されたパッケージング オブジェクトには、メソッドを呼び出すことができる組み込みメソッドがあるため、次の 3 つの基本的なデータ型のデータを更新できます。文字列、値、ブール値、複数の操作。
バックグラウンドが対応する基本パッケージ タイプのオブジェクトをいつ自動的に作成するかは、現在実行されているコードがその値を取得するかどうかによって決まります。
基本型の値が読み取られるとき、つまり、その値をメモリから取得する必要があるとき (このアクセス プロセスを読み取りモードと呼びます)、基本パッケージ型のオブジェクトがバックグラウンドで自動的に作成されます。例えば:
var test = 'hhh'
console.log(test) // 读取模式,后台自动创建基本包装类型对象
var test2 = test // 赋值给变量 test2,也需要读取 test 的值,同上
基本パッケージ タイプのオブジェクトと参照タイプのオブジェクトの最大の違いは、オブジェクトの有効期間が異なることです。その結果、基本パッケージ タイプは独自のメソッドをカスタマイズできません。
参照型データの場合、実行フローが現在のスコープを離れる前にメモリに保存されますが、自動的に作成される基本パッケージ型オブジェクトの場合、データはコード行が実行される瞬間にのみ存在し、実行後すぐに破棄されます。
次のように:
var str = 'test'
str.test = 'hhh'
console.log(str.test) //undefined
上記のコードの 2 行目は、自動的に作成されたStringインスタンス オブジェクトにtest属性を追加します。この時点でコードが実行されると有効ですが、このコード行の実行直後にStringインスタンスが破棄され、テストが実行されます。 Stringインスタンスの
コードの 3 行目が実行されると、読み取りモードになっているため、新しいStringインスタンスが再度作成されますが、この新しく作成されたStringインスタンスには test属性がないため、結果はunknown になります。
コードでの説明は次のとおりです。
var str = 'hello';
str.number = 10; //假设我们想给字符串添加一个属性 number ,后台会有如下步骤
(
var _str = new String('hello'); // 1 找到对应的包装对象类型,然后通过包装对象创建出一个和基本类型值相同的对象
_str.number = 10; // 2 通过这个对象调用包装对象下的方法 但结果并没有被任何东西保存
_str =null; // 3 这个对象又被销毁
)
console.log(str.number); // undefined 当执行到这一句的时候,因为基本类型本来没有属性,后台又会重新重复上面的步骤
(
var str = new String('hello');// 1 找到基本包装对象,然后又新开辟一个内存,创建一个值为 hello 对象
str.number = undefined;// 2 因为包装对象下面没有 number 这个属性,所以又会重新添加,因为没有值,所以值是未定义;然后弹出结果
str =null; // 3 这个对象又被销毁
)
では、基本型にメソッドやプロパティを追加するにはどうすればよいでしょうか?
答えは、ベース ラッパー オブジェクトのプロトタイプの下に追加することです。各オブジェクトにはプロトタイプがあります。
//给字符串添加方法 要写到对应的包装对象的原型下才行
var str = 'hello';
String.prototype.last= fuction(){
return this.charAt(this.length);
};
str.last(); // 5 执行到这一句,后台依然会偷偷的干这些事
(
var _str = new String('hello');// 找到基本包装对象,new一个和字符串值相同的对象,
_str.last(); // 通过这个对象找到了包装对象下的方法并调用
_str =null; // 这个对象被销毁
)
本当の質問への答え
- JavaScriptのラッパー型を理解していますか?
参考回答:
オブジェクトのラップとは、基本型がオブジェクトとして使用されるときに、JavaScript がそれを対応するパッケージ化型に変換することを意味します。これは、新しいオブジェクトと同等です。内容は、基本型の内容と同じです。その後、操作が実行されると、完了して再度アクセスすると、この一時的なオブジェクトは破棄され、再度アクセスすると未定義になります。
数値、文字列、およびブール値にはすべて、対応するパッケージング タイプがあります。
プリミティブ ラッパー タイプのため、JavaScriptのプリミティブ値はオブジェクトとしてアクセスできます。
基本的なタイプの特性:
- 各ラッパー型は同じ名前の基本型にマップされます。
- 基本型の値が読み取りモードでアクセスされると、対応する基本ラッパー型のオブジェクトが作成され、データ操作が容易になります。
- 新しく作成されたラッパー オブジェクトは、プリミティブ型の値を操作するステートメントの実行が終了するとすぐに破棄されます。
-EOF- _ _