はじめに
JavaScript のデータ型が、基本型 (またはプリミティブ型) と参照型の 2 つのカテゴリに分類されていることは誰もが知っています。
基本型の値はスタック メモリに格納される単純なデータ セグメントであり、値によってアクセスされます。 JS には、未定義、Null、Boolean、Number、String の 5 つの基本的な型があります。
参照型の値はヒープメモリに格納されたオブジェクトであり、その値は参照によってアクセスされます。参照型には主に、Object、Array、Function、RegExp、Date が含まれます。
オブジェクトにはプロパティとメソッドがあるため、次のコードが表示されても驚くべきことではありません。
var favs=['鸡蛋','莲蓬']; favs.push('秋葵'); console.log(favs);//["鸡蛋", "莲蓬", "秋葵"] console.log(favs.length);//3
配列は参照型なので、自然にプロパティ (長さ) とメソッド (プッシュ) を持つことができます。これは夏にアイスクリームを食べるのと同じくらい自然です。しかし、以下のコードを見てよく考えてみてください。これとこれは合法でしょうか?
var realMessage="Said I love you but I lied"; var myMessage=realMessage.substring(5,15); console.log(myMessage); //"I love you"
失恋した女の子が、別れるために使用した文字列に対して意図的に「部分文字列」メソッドを実行し、編集されたバージョンを観ながら幸せそうに眠りに落ちました。でも、でも、文字列は基本型だと言われていませんが、なぜメソッドを持つことができるのでしょうか? ?王道的な方法はありますか、チンティアン様?
実は、これはすべて「基本パッケージングタイプ」と呼ばれるもののせいです。この基本的なパッケージタイプは特に正立であり、まさに「功績と名声を隠して終わって去る」です!
基本的な梱包タイプ
冒頭で説明したオブジェクト、配列、その他の参照型に加えて、JavaScript は 3 つの特別な参照型 (String、Number、Boolean) も提供します。これにより、対応する基本型の操作が容易になります。
引き続き、文字列をクリップする上記の例を見ていきますが、substring メソッドを使用しているにもかかわらず、このメソッドを呼び出しても新しい文字列が返されるだけで、realMessage 自体の値は変更されないことに気づきましたか。
これが基本的なパッケージ化タイプの動作です。もともとメソッドはありませんが、メソッドを使用したい場合は、対応する基本パッケージのタイプにこのメソッドが用意されています。たとえば、上記の部分文字列メソッドは、基本型文字列ではこのメソッドを持つことは不可能ですが、パッケージ化型 String では可能であり、メソッドが実行されて結果が返されます。実行時:
realMessage.substring(5,15)
このコード行では多くのことが起こっています。
まず、メモリから realMessage の値を読み取ります。この読み取りモードでは、バックグラウンドが動作し始めます。 JS 昇格では、バックグラウンドで完了するこれらのアクションが次のように記述されます。
1. String 型のインスタンスを作成します。 2. インスタンスで指定されたメソッドを呼び出します。 3. このインスタンスを破棄します
上記の例は、次のようなコードで表すことができます:
var _realMessage=new String("Said I love you but I lied"); var myMessage=_realMessage.substring(5,15); _realMessgae=null; //方法调用后即销毁
var me="sunjing"; me.age=18; console.log(me.age);//undefined
基本的な包装タイプを使用した表示
文字列が読み取りモードの場合に加えて、バックグラウンドは基本的なパッケージング タイプのインスタンスを作成するのに役立ちます。また、それらを自分で明示的に作成することもできます。
var str=new String("hello"); var str2=str.toUpperCase(); console.log(str2);//"HELLO:
var str1=new String("hello"); var str2="hello"; typeof str1 //"object" typeof str2 //"string"
基本的なパッケージ化タイプのおかげで、文字列、ブール値、数値の 3 つの基本タイプを操作するのがより便利になりました。これら 3 つの基本タイプの値が読み取られるたびに、対応するパッケージング タイプのインスタンスがバックグラウンドで作成され、このインスタンスは指定されたメソッドを呼び出し、呼び出し後に破棄されます。この短いライフ サイクルにより、カスタム プロパティとメソッドを基本型に追加できないことが決まります。
JavaScriptのStringクラスのsubString()メソッドとslice()メソッドを見てみましょう
最近、「JavaScript による高度なプログラミング」という本を読んでいて、これまで出会ったことのない実践的なスキルや知識を見つけたので、記憶を深めるためにブログに記録したいと思います。
この本のセクション 2.8.4 では、次の例に示すように、String クラスの subString() メソッドとスライス() メソッドについて説明しました。その使用法と返される結果は基本的に同じです。
由以上代码的输出结果可已看出,slice()方法和subString()方调用方法法和输出结果完全一样,这两种方法返回的都是要处理的字符串的子串,都接受一个或两个参数,第一个参数是要获取的子串的起始位置,第二个参数是要获取子串的终止位置,如果第二个参数省略终止位置就默认为字符串的长度,且两个方法都不改变String对象自身的值。
为什么有两个功能完全相同的方法呢?事实上,这两个方法并不完全相同,不过只在参数为负值时,他们处理参数的方式稍有不同。
对于负数参数,slice()方法会用字符串的长度加上参数,subString()方法将其作为0处理,例如:
var strObj = new String("hello world"); alert(strObj.slice(-3)); // 输出结果:"rld" alert(strObj.subString(-3)); // 输出结果:"hello world" alert(strObj.slice(3,-4)); // 输出结果:"lo w" alert(strObj.subString(3,-4)) // 输出结果:"hel"
这样既可看到slice()和subString()方法的主要不同。当只有参数-3时,slice()返回"rld",subString()则返回"hello world"。这是因为对于字符串"hello world",slice(-3)将被转换成slice(8),而subString(-3)则转化成subString(0)。同样,使用3和-4差别也是很明显。slice()方法将被转换成slice(3,7),与前面的例子相同,返回"lo w"。而subString()方法则将这个两个参数解释为subString(0,3),实际上是:subString(0,3),因为subString()总是把较小的参数作为起始位,较大的数字最为终止位。