JavaScriptの中のstringの持ち方の原因について話します.

4668 ワード

誘引子
私達はすべて知っています.JavaScriptデータの種類は二つの種類に分けられています.基本タイプ(またはオリジナルタイプ)と引用タイプです.
基本タイプの値は、スタックメモリに保存されている簡単なデータセグメントで、値によってアクセスされます.JSには5種類の基本タイプがあります.Unidefined、Null、Boolean、Number、Stringです.
参照タイプの値は、スタックメモリに保存されているオブジェクトで、その値は参照でアクセスされます.引用タイプは主にObject、Aray、Funct、RegExp、Dateがあります.
オブジェクトは属性と方法を持っているので、次のコードを見てもおかしくないです.

var favs=['  ','  '];
favs.push('  ');
console.log(favs);//["  ", "  ", "  "]
console.log(favs.length);//3
Arayは引用タイプなので、自然と属性と方法を持つことができます.この当たり前の意味で夏には必ずアイスクリームを食べます.しかし、下記のコードを見て、よく考えてみてください.これは合法ですか?

var realMessage="Said I love you but I lied";
var myMessage=realMessage.substring(5,15);
console.log(myMessage); //"I love you"
別れの文字列をわがままに「substring」という方法を実行しました.そして楽しく編集版を見て寝ました.しかし、しかし、stringが基本的なタイプというわけではないですが、なぜそれは方法を持っていますか?王法がありますか?青天様!
実は、これらは全部「基本包装タイプ」というものがあるからです.この基本的な包装のタイプはとてもまっすぐで、本当の「事了回服去、深蔵功と名」です.
基本包装の種類
最初に言及したObject、Arayなどの引用タイプを除いて、JavaScriptは三つの特殊な引用タイプを提供してくれました.
上のクリップ文字列の例を見ていくと、substring方法を使っても、realMessage自体の値は変わらないということに気づきました.この方法を呼び出して、新しい文字列を返しただけです.
これが基本包装タイプの役割です.もともとあなたは方法がないですが、方法を使いたい時は、調整しても大丈夫です.対応する基本包装のタイプはこの方法があればいいです.例えば上のsubstringの方法では、stringという基本的なタイプはこの方法があり得ませんが、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; //        
したがって、基本的なタイプのstringではなく、バックグラウンドはそれに対応する基本的な包装タイプのStringを作成していることが分かりました.これは基本的なタイプの値に基づいて具体化された例です.この例を指定方法を呼び出して、一番後に自分を廃棄して、感覚的に木があります.
最後の段階に注意して、基本包装のタイプは「廃棄されます」という特性があります.これは基本タイプの値にカスタム属性と方法を追加できないことを決めました.

var me="sunjing";
me.age=18;
console.log(me.age);//undefined
私は「私」に「この文字列にはage属性が添加されています.素晴らしい18歳に設定されています.しかし、卵を並べて、再び訪問する時、この属性はもう見えなくなりました.
コード属性付与を2行目に実行した場合、バックグラウンドは基本パッケージタイプの例を作成しました.このage属性は確かにインスタンスにかけられましたが、続いてこのインスタンスは破棄されました.3行目に実行した場合、新たな基本パッケージタイプのインスタンスが新たに作成されました.もちろん、age属性はありません.
基本包装の種類を表示します.
文字列が読み取りモードにある以外に、バックグラウンドは基本的なパッケージタイプのインスタンスを作成してくれます.私たち自身も表示して作成できます.

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"
締め括りをつける
基本的な包装タイプのおかげで、私たちはstring、bollan、numberの3つの基本タイプを操作することがより便利になりました.この3つの基本タイプの値を読むたびに、バックグラウンドは対応するパッケージタイプのインスタンスを作成します.この例は指定方法を呼び出して、呼び出したら破棄されます.この短いライフサイクルは基本タイプにカスタム属性と方法を追加することができません..
javascriptのString類のsubString()方法とslice()方法を見に来ました.
最近は「Javascript高級プログラム設計」を読んでいますが、本の中で以前に触れたことのない、実用的な技術と知識点を発見しました.ブログを通じて記録して、記憶を深めたいです.
この本では2.8.4節において、String類のsubString()方法とslice()方法について述べましたが、その使い方と返却結果は基本的に同じです.

var strObj = new String("hello world");
alert(strObj.slice(3));      //     :"ol world"
alert(strObj.subString(3));    //     :"ol world"
alert(strObj.slice(3, 7));    //     :"lo w"
alert(strObj.subString(3,7));   //     :"lo w"
以上のコードの出力結果から、slice()方法とsubString()が見られます.コールメソッドと出力結果は全く同じです.この2つの方法は処理する文字列のサブストリングで、1つまたは2つのパラメータを受け入れます.最初のパラメータは取得するサブストリングの開始位置で、2つ目のパラメータはサブストリングの終了位置を取得します.2つ目のパラメータが省略されると文字列の長さがデフォルトです.両方の方法はSを変更しません.tringオブジェクト自体の値です.
なぜ二つの機能が完全に同じな方法があるのですか?実は、この二つの方法は全く同じではありませんが、パラメータがマイナスの場合は、パラメータの扱い方がちょっと違っています.
負数パラメータに対して、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)は、String(String)とString-3)は同じように変換されます.前の例と同様に「lo w」を返します.subString()方法は、この二つのパラメータをsubString(0,3)と解釈します.実際には、subString(0,3)は、subString()が小さいパラメータを常に先頭としているため、大きな数字が終端ビットとなります.