JavaScript 推移 ECMScript2024まで

(2025/2更新)JavaScriptが出た時はブラウザでしか実行できなくて、MicrosoftのVisual Basicとよく似てて簡単だなぁって思ってましたが、今ではNodeJS等バックエンドでも動作し、インタラクティブなAngular、React、VueやElectronなどもあり、更にバージョンの進化も早く、今では多様な事をこなせる言語になっていますね。 C++に近づいておりJavaScriptも難解になってきています。

JavaScriptの生い立ち

JavaScriptはNetscape社が開発し1996年にJavaScript1.0を出しましたが、1997年からECMA(European Computer Manufacturers Association)が標準化を進め、ECMAScript(ECMA-262)となった。 その後、ECMA Internationalになり欧州だけでなく国際標準となった。

ECMAScript2024 (ES15), ECMA-262, 15th edition

因みに2023/2~2024/1に決まったのが2024年版となるようです。

  • Promise.withResolvers
    • resolve/rejectを外で実行できる。
  • ArrayBuffer.resize()
    • サイズ変更できるようになりました。
  • Object.groupBy()とMap.groupBy()
  • .isWellFormed()
    • “\u3042”.isWellFormed();で正しいかどうかみれるようになった。
  • RegExp にvフラグが使えるようになった。 絵文字検索?
  • Atomics.waitAsync()

ECMAScript2023 (ES14), ECMA-262, 14th edition

  • array.findLast(), array.findLastIndex()
    • 条件に合う最後の値や、Indexを探すもの。 array.findは先頭を探す。
  • Hashbang文法
    • ファイルの先頭の『#!』だけをコメントとして扱う。 2行目以降に書くとコード扱いされる。
  • array.with(), array.toSorted(), array.toReverse()
    • 普通のarrayのコピーは参照なので、コピーして一方のarrayの要素の1つを変えるともう一方も変わってしまいます。 しかしこのコマンドでコピーすると元のarrayは変更されません。
  • WeakMapのキーにSymbolを使える。

ECMAScript2022 (ES13), ECMA-262, 13th edition

  • Top level await
  • class フィールド宣言 constructor(){}内でthis.name =’ichiri’としなくてもよくなった
  • プライベート宣言 変数やメソッドの先頭に#を付けるとprivateとなる
  • static classで初期化用の式(equation)はclass外部で処理していたが、class内で処理できるようになった
  • #brand in obj  instanceの親classの確認正確化
  • 正規表現 /…/d
  • try catchのエラーチェーン {cause:e}  e.cause  これからは、throw new Error()の中には、必ずエラーメッセージと{cause:e}の両方を入れる必要がある。
  • at(-n)  ---Pythonみたい
  • Object.hasOwn(object, property)

ECMAScript2021 (ES12), ECMA-262, 12th edition

  • 論理代入演算子 ||=, &&~, ??=
  • 数値セパレータ 1_000_000, 0b_1110_1001, 0x_abcd_123f
  • string.replaceAll()
  • Promise.any()
  • 弱参照 WeakRefs

ECMAScript2020 (ES11), ECMA-262, 11th edition

  • BitInt
  • for in の順序保証
  • null合体演算子 ??
  • オプショナル連結 ?
  • globalThis
  • string.matchAll()
  • Dynamic Inport
  • export * as ns from module 構文
  • import.meta
  • Promise.allSettled()

ECMAScript2019 (ES10), ECMA-262, 10th edition

  • flat(), flatMap()
  • Object.fromEntries()
    • オブジェクト生成時にキー名と値を指定できる。
  • trimStart(),trimEnd()
  • Symbol().description
  • try~catchの(error)の省略
  • .toString 仕様変更
    • コメントなど文字列が保持される。
  • JSONの挙動と同じに仕様変更(行区切りや段階切り文字のエスケープ無し扱い)
  • JSON.stringify()の仕様変更(エスケープされたまま出力される)

ECMAScript2018 (ES9), ECMA-262, 9th edition

  • テンプレート文字列強化 \u
  • オブジェクトスプレッドとレスト構文 …obj
  • 正規表現のフラグ /…/s
  • 正規表現の名前付きキャプチャーグループ ?<…>
  • 正規表現の前方マッチ ?<=… , ?<!…
  • 正規表現のUnicodeプロパティマッチ \p{…}
  • Promise の finally()
  • Promiseのfor await … of …

ECMAScript2017 (ES8), ECMA-262, 8th edition

  • オブジェクト参照 object.values(), object.entries()
  • パディング string.padStart(), string.padEnd()
  • プロパティ記述し参照 object.getOwnPropertyDescriptors()
  • 関数末尾のカンマ , ?????
  • async, await
  • 共有メモリ —>meltdown and Spectre対応として全てのブラウザで一時無効化

ECMAScript2016 (ES7), ECMA-262, 7th edition

  • array.includes()
  • べき乗演算子 **

ECMAScript2015(ES6), ECMA-262, 6th edition

  • class
  • let, const
  • モジュール import, export —それまではrequire
  • アロー関数
  • 関数の初期値引数  func1(var1=10, var2=1)
  • 関数の可変長引数 func1(…arg)={}
  • スプレッド構文 …arg
  • Mapオブジェクト
  • Setオブジェクト
  • 配列関数 from(), of()
  • 型付配列 Unit8Array etc
  • for ~ of
  • シンボルオブジェクト(Symbol)
  • 文字列でバッククオート(変数を入れる事ができる)
  • 8進数 0o、2進数 0b
  • Promise
  • 言語依存フォーマット NumberFormat()
  • IE11ではES6以降は使えない

ECMAScript 5.1th Edition(ES5.1)

  • array.isArray()

ECMAScript 5th Edition(ES5)

  • strict モード
  • getter, setter
  • JSON.stringify(object), JSON.parse(string)
  • 最後のオブジェクトの末尾のカンマ
  • trim()
  • Objectのメソッド強化?
  • Arrayのメソッド強化?

ECMAScript 4th Edition(ES4)

ECMAScript 3rd Edition(ES3) —1999/12

TypeScript

MicrosoftがJavaScriptのSuperset(上位互換)として開発したAlternative JavaScript(AltJS)。 静的型付けけやinterfaceなどの定義で可読性・デバッグ性を向上したもの。 静的型付けができるので、Web Asssemblyに変換して高速実行も可能。 近年はJavaScriptから学習し、TypeScriptに移行する人が増加中。 JavaScriptが大好きでNodeJSの開発者Ryan Dahlさんが、NodeJSの後悔から新たに開発したDenoもTypeScriptが中心で、Ryan DahlさんもTypeScripを絶賛。

  • 静的型付け
  • type, interfaceなどオブジェクトの型付け
  • ジェネリクス
  • private, public, protect, readOnly

最近のライブラリやアプリはTypeScriptのものが多く、ソースコードを読み解き様々なヒントにするにもJavaScriptプログラマはTypeScriptを学ぶ方が良いと思います。

コメント