部分1-4)データ構造とデータ型-3)文字列

42906 ワード

文字型部分リンク:https://ko.javascript.info/string
JavaScriptでは、文字列は常にページエンコーディング方式に関係なくUTF-16形式に従います.

引用符


JavaScriptで引用符のタイプで最も注目されるのはbasic(`)です.
backticは、私たちがよく使う${value}構文を使用することができます.(テンプレート文字)
また、テンプレート関数ではbackticも使用されます.함수명`인자`という形で書かれているのが書き方です.
<script>
  const argValue1 = 'value1';
  const argValue2 = 'value2';

  const exam = (texts, ...values) => {
    console.log('texts==========>', texts);
    console.log('values=========>', values);
  }
  
  exam`예시 문구는 ${argValue1}${argValue2} 입니다.`; 
</script>
その結果、consoleウィンドウに['サンプル文は'、'および'です.']および['value 1'、'value 2']が出力されます.
テンプレート関数の最初のパラメータ(text)は、作文文の文の文字列を配列形式で格納し、2番目のパラメータ(values)は、作文文の文の${value}値を配列形式で格納します.
よく使う文法ではないそうです.初めて見たのは不思議ですね

特殊記号



特殊記号には複雑な使い方はありません.文字列の間に特殊な記号を挿入するだけで、特殊な記号が持つ機能を果たすことができます.
ex)

これらの特殊文字nは2文字であるが、特殊文字として扱われ、文字列長に1を占める.alert( `My\n`.length ); // 3注意!lengthは関数ではなくpropertyです!
str.length動作正常、str.length()エラー...!
lengthは関数ではなく、数値を格納するpropertyです.忘れないで!

特定の文字へのアクセス


文字列内の特定の位置の文字にアクセスするには、カッコ([index])またはcharat(index)メソッドを呼び出します.
(charatメソッドは後方互換性のために保持されるメソッドで、最近はカッコ方式がよく使われています.)
<script>
  let str = `Hello`;

  // 첫 번째 글자
  alert( str[0] ); // H
  alert( str.charAt(0) ); // H

  // 마지막 글자
  alert( str[str.length - 1] ); // o
</script>
2つの方式の違いは,返すことができる文字がない場合に現れる.パラメータに入るindexビットに文字がない場合、カッコはundefinedを返し、charatは空の文字列を返します.
<script>
  let str = `Hello`;

  alert( str[1000] ); // undefined
  alert( str.charAt(1000) ); // '' (빈 문자열)
</script>
for of構文を使用すると、文字列を構成する文字を繰り返し操作できます.(for inと混同しないで、for inはオブジェクトを読み出して、for ofは配列と文字列を読み出します!)
<script>
  for (let char of "Hello") {
    alert(char); // H,e,l,l,o (char는 순차적으로 H, e, l, l, o가 된다.)
  }
</script>

文字列の不変性


文字列は変更できません.文字列の中間文字を変更しようとすると、エラーが発生します.
解決策は、新しい文字列を作成し、既存の文字列に保存することです.(既存の文字列に新しい文字列値を保存)
<script>
  let str = 'Hi';

  str[0] = 'h'; // Error: Cannot assign to read only property '0' of string 'Hi'
  alert( str[0] ); // 동작하지 않는다.
  
  //============새 문자열을 기존 문자열에 할당============
  
  let str = 'Hi';

  str = 'h' + str[1]; // 문자열 전체를 교체

  alert( str ); // hi
</script>

部分文字列の検索

  • str.indexOf
    str.indexOf(「検索する文字」number);
    n番目の(number)の文字(「検索する文字」)を検索する方法.
  • <script>
      let str = 'Widget with id';
    
      alert( str.indexOf('id', 2) )
      // 12, 두번째로 등장하는 'id'는 인덱스 12번에 있음
    </script>
    文字列全体で値を変更する場合は、繰り返し文でindexOfを使用します.
    <script>
      let str = 'As sly as a fox, as strong as an ox';
    
      let target = 'as'; 
    
      let pos = 0; //1로 해도 상관은 없다
      
      while (true) {
        let foundPos = str.indexOf(target, pos); //index를 반환
        if (foundPos == -1) break;
    
        alert( `위치: ${foundPos}` ); // 7, 17, 27
        pos = foundPos + 1; // 다음 위치를 기준으로 검색을 이어감.
      }
    </script>
    もっと簡単に書けば、以下のようになります.
    <script>
      let str = "As sly as a fox, as strong as an ox";
      let target = "as";
    
      let pos = -1;
      while ((pos = str.indexOf(target, pos + 1)) != -1) {
        alert( `위치: ${pos}` );
      }
    </script>
    *str.lastIndexOf(substr,position)関数
    str.lastIndexOf(substr,position)は、文字列の末尾から部分文字列を検索するindexOfと同様の機能を有する.
    返される文字列の一部の位置は、文字列の末尾を基準にします.
    注意if文にindexOfと書く場合は注意してください.
    <script>
      let str = "Widget with id";
    
      if (str.indexOf("Widget")) {
          alert("찾았다!"); // 의도한 대로 동작하지 않는다.
      }
    </script>
    上記の例を実行すると、何も起こりません.
    str.indexOf("Widget");上記の例では、if文では0がfalseとみなされるため、if文では動作しないalert関数が機能しないWidget付きインデックス0を返します.

    ビットNOT演算子(~)を使うテクニック


    ビットNOT演算子は、演算子によって小数部がすべて破棄された整数に変換され、その後(+1)すべてのビット(−)が反転される.
    例えば、nが32ビット整数である場合、~nは−(n+1)である.
    <script>
      alert( ~2 ); // -3, -(2+1)과 같음
      alert( ~1 ); // -2, -(1+1)과 같음
      alert( ~0 ); // -1, -(0+1)과 같음
      alert( ~-1 ); // 0, -(-1+1)과 같음
    </script>
    上記の例に示すように、符号が存在する32ビット整数nのうち、~nを0とした場合、n==1は一意である.
    このビットNOT演算子を使用すると、条件文の条件を減らすことができます.
    例えば、indexOfが戻り−1を見つけた場合、~str.indexOf("...")を使用することができる.
    <script>
      let str = "Widget";
    
      if (~str.indexOf("Widget")) {
        alert( '찾았다!' ); // 의도한 대로 동작한다.
      }
      //str.indexOf("Widget")은 0을 반환하고 ~0은 -1이니까!
    </script>

    実はこのコードは直感的ではなく、お勧めしない方法です.
    ただし、古いシナリオでは簡単に見ることができるので、理解が必要です.
    if (~str.indexOf(...)) モードのコードが「部分文字列であることを確認する」コードであることを覚えておけばよい.
    -1以外にも、~演算子を適用したときに0を返す数字は複数あります.
    非常に大きな数値に~演算子を適用すると、32ビット整数に変換する過程で切り捨て現象が発生するからです.これらの数字の中で最大は4294967295です.(~4294967295は0).
    演算子は、文字列が長くない場合にのみ予想通りに動作することを知っておく必要があります.
    今は.主にincludeメソッドを使用して、一部の文字列が含まれているかどうかを決定します.

    includes, startsWith, endsWith


    str.include(substr,pos)は、strの一部の文字列substrに基づいてtrueまたはfalseを返す方法である.
    文字列の一部の位置情報を必要とせず、含まれているかどうかを知りたい場合は、これが適切な方法です.
    <script>
      alert( "Widget with id".includes("Widget") ); // true
    
      alert( "Hello".includes("Bye") ); // false
    </script>
    .includeメソッドはindexOfメソッドと同様に、2番目のパラメータを超える場合、その位置(2番目のパラメータが指す位置)の部分文字列を検索します.
    <script>
      alert( "Widget".includes("id") ); // true
      alert( "Widget".includes("id", 3) ); // false, 세 번째 위치 이후엔 "id"가 없다. (2를 넣어도 마찬가지)
    </script>
    str.startsWithメソッドとstr.endsWithメソッドは、strが特定の文字列で開始されるかどうか(start with)、および特定の文字列で終了するかどうかを決定するために使用されます.
    <script>
      alert( "Widget".startsWith("Wid") ); // true, "Widget"은 "Wid"로 시작.
      alert( "Widget".endsWith("get") ); // true, "Widget"은 "get"으로 끝남.
    </script>

    部分文字列の抽出


    JavaScriptでは,部分文字列の抽出に関する手法としてsubstring,substr,sliceの3つがある.
    1) str.slice(start [, end])
    文字列の始点から終点(終点を除く)を返します.
    <script>
      let str = "stringify";
      alert( str.slice(0, 5) ); // 'strin', 0번째부터 5번째 위치까지(5번째 위치의 글자는 포함하지 않음)
      alert( str.slice(0, 1) ); // 's', 0번째부터 1번째 위치까지(1번째 위치의 자는 포함하지 않음)
    </script>
    2番目のパラメータが指定されていない場合は、指定したパラメータを文字列の末尾に返します.
    <script>
      let str = "stringify";
      alert( str.slice(2) ); // ringify, 인덱스 2번부터 끝까지
    </script>
    start係数およびend係数は、負の数を含んでもよい.パラメータが負の場合は、文字列の後ろから検索を開始します.
    <script>
      let str = "stringify";
    
      // 끝에서 4번째부터 시작해 끝에서 1번째 위치까지
      alert( str.slice(-4, -1) ); // gif
    </script>
    2) str.substring(start [, end])
    startとendの間の文字列を返します.
    substringはsliceと非常に似ているが、startがendより大きくてもよいという違いがある.startが大きいにしてもendが大きいにしても、買収1~買収2~または買収2~買収1~の範囲内で使うから!
    <script>
      let str = "stringify";
    
      // 동일한 부분 문자열을 반환
      alert( str.substring(2, 6) ); // "ring"
      alert( str.substring(6, 2) ); // "ring"
    
      // slice를 사용하면 start가 end보다 클 경우 빈 문자열을 반환한다.
      alert( str.slice(2, 6) ); // "ring" (같음)
      alert( str.slice(6, 2) ); // "" (빈 문자열)
    </script>
    substringは負の引数を許可しません!負数はゼロに処理されます.
    3) str.substr(start [, length])
    startからlength文字を返します.
    substrは、端点ではなく長さの位置から文字列を抽出します.
    同様に、最初のパラメータが負の場合、文字列の後ろからカウントが開始されます.
    <script>
      let str = "stringify";
      alert( str.substr(2, 4) ); // ring, 두 번째부터 글자 네 개
      
      let str = "stringify";
    alert( str.substr(-4, 2) ); // gi, 끝에서 네 번째 위치부터 글자 두 개
    </script>

    比較文字列


    比較演算子で文字列を比較すると、特殊な結果が出る場合があります.
    1)小文字は常に大文字より大きい.
    2)発音区分記号(diacritical mark)を有する文字はアルファベット順の基準に従わない.
    <script>
    alert( 'a' > 'Z' ); // true
    
    alert( 'Österreich' > 'Zealand' ); // true (Österreich는 오스트리아를 독일어로 표기한 것)
    </script>
    JavaScriptはUTF-16を使用して文字列を符号化し、各文字はデジタルフォーマットのコードと一致する.
    コードから文字を取得したり、文字から関連コードを見つけたりする方法もあります.
    1) str.codePointAt(pos)
    posにある文字コードを返します.
    <script>
    // 글자는 같지만 케이스는 다르므로 반환되는 코드가 다르다.
    // 케이스가 뭘 의미하는 건지?? 호출부가 다르다는 의미로 추정된다.
    alert( "z".codePointAt(0) ); // 122
    alert( "Z".codePointAt(0) ); // 90
    </script>
    2) String.fromCodePoint(code)
    デジタル形式のcodeに対応する文字を生成します.alert( String.fromCodePoint(90) ); // Zuと16進コードを利用する方法もあります.
    <script>
      // 90을 16진수로 변환하면 5a
      alert( '\u005a' ); // Z
    </script>
    コード65~220の間には、ラテン文字と他の文字が含まれている.
    <script>
      let str = '';
    
      for (let i = 65; i <= 220; i++) {
        str += String.fromCodePoint(i);
      }
      alert( str );
      // ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„
      // ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜ
    </script>
    上の例では、大文字=>特殊文字=>小文字=>ほぼ最後にアクセント(?)アルファベットが出ていることを確認できます.
    文字は、文字に対応するデジタルフォーマットのコードを基準に比較されます.
    コードが大きいと対応する字も大きいと思われます.(a(コード:97)>Z(コード:90)
    小文字のコードは大文字のコードより大きいので、小文字は大文字の後ろにあります.
    「桶」のような字は普通のアルファベットから離れている.ケーキのコードは小文字のコードよりずっと大きい.

    文字列の正確な比較


    文字列を比較するには、ブラウザがページでどの言語を使用しているかを知る必要があります.
    最近のブラウザでは、国際化に関連する標準ECMA-402がサポートされています.(IE 10はInt.jsライブラリを使用する必要があります.)
    ECMA−402は、言語が異なる場合に適用可能な文字列比較規則と、これらの規則を遵守する方法を定義する.
    str.localeCompare(str 2)が呼び出されると、ECMA-402のルールに従ってstrがstrより小さいか、等しいか、strより大きいかを示す整数が返されます.
    strstr>str 2:羊水返却
    str=str 2:0戻り
    例)alert( 'Österreich'.localeCompare('Zealand') ); // -1上記の方法に加えて、str.trim、str.repeateなどの有用な方法もある.