サンプルプログラム2(PL JavaScript編)

文字列の操作(第4回の3 プログラムの発展)

(文字列 "hello" が入力され、変数 s に保持されているとして)以下のような操作を施すコード(入出力部分は前ページ参照):

補足

  1. バックスラッシュについて:
    バックスラッシュ( \ )に関する事情は日本ではプログラミング言語によらず共通のもの。

  2. 文書へのアクセス

  3. クラスの概念と、機能の調べ方

  4. メソッドと、メソッドチェーン

    ドキュメントに記されたものがすべてということになる。

  5. 文字コード:

    改行文字 ‘’ に関しては、特にプログラミング言語に依存せず共通の話だと理解していい。

  6. 継承:

    JavaScriptもオブジェクト指向言語なので、継承の概念はある。が、以下のように昨今の主要(オブジェクト指向)言語との差異があることを知っておいて下さい。

  1. クラス名のように認識できる String や Array 等は、実体は Function である。

    String
    // => [Function: String]
    Array
    // => [Function: Array]
  2. これらの関数を呼び出すとそれぞれに対応するデータを生成する(以下の例では引数なしで呼び出して空っぽのデータが生成されているが、 引数を渡して具体的なデータを生成することも勿論可能)。

    String()
    // => ''
    Array()
    // => []
  3. これらのデータに対して呼び出せるメソッド等は、String.prototypeArray.prototype で表されるオブジェクトの メンバー(属性、フィールドとも呼ぶ)として保持されている。 例えば(これまでに見てきたが)配列を反転させるメソッドは、 Array.prototype.reverse() がドキュメントの見出しになっている。

  4. これらのメソッドの中(ソースコード上)では、メソッド呼出のレシーバ(ピリオドの左に置かれていたオブジェクト)が、変数 this として与えられていて(Rubyのメソッドの中では self だったものに相当する)、 this に対する処理としてプログラムが書かれている。

  5. Array() が返す値と、String()が返す値は、以下のように違いがある。

    typeof []
    // => 'object'
    typeof ''
    // => 'string'
    
    // 以下はブラウザでの応答例
    []
    // => ▶ []             // オブジェクトとして表示される
    ’’
    // => ””               // 文字列はプリミティブ型なのでシンプルな表示

    が、プリミティブ型の文字列は必要に応じてStringオブジェクトに内部で変換されるので、 "".length 等の式(ここで length はメソッドではなく、オブジェクトの属性)を書いても大丈夫。

  6. 関数は、(これまで見てきたように)括弧を後置して(必要なら引数を与えて)呼び出すという使い方に加えて、 new 演算子を前置して、コンストラクタとして呼び出すという使い方もできる (これが元来のJavaScriptでのオブジェクト指向の実現方法だった)。

    String
    // => [Function: String]
    String("abc")
    // => "abc"                // プリミティブ型の文字列
    new String("abc")
    // => [String: 'abc']      // String オブジェクト
    new String
    // => [String: '']         // 括弧なしでも呼べる
    
    Array
    // => [Function: Array]
    Array(2,3,4)
    // => [ 2, 3, 4 ]
    new Array(2,3,4)
    // => [ 2, 3, 4 ]          // ここでは同じ結果になる
    new Array
    // => []
    
    Date
    // => [Function: Date]
    Date()
    // => 'Mon Dec 28 2020 20:15:50 GMT+0900 (日本標準時)'  // …のような文   字列
    typeof Date()
    // => 'string'
    new Date()
    // => 2020-12-28T11:16:23.411Z     // のように表示される(処理系によって違う)
    typeof new Date()
    // => 'object'
    new Date
    // => 2020-12-28T11:16:23.411Z     // やはり括弧は省略しても同じだった

    これらの実行例からわかるように、呼び出し方によって結果が変わる(場合と変わらない場合がある)ことと、 new の使い方の詳細はここでは省くが、 (単なる関数呼出しはその関数定義のコードに書かれたことだけを行うのに対し) new では、必ずオブジェクトを作って返すことを知っておいて下さい。