(Translated by https://www.hiragana.jp/)
JavaScript - Wikipedia

JavaScript

プログラミングにもちいるスクリプト言語げんごひと

JavaScript(ジャバスクリプト)は、プログラミング言語げんごであり、HyperText Markup Language(HTML)やCascading Style Sheets(CSS)とならぶ World Wide Web(WWW)の中核ちゅうかく技術ぎじゅつひとつである。

JavaScript
JavaScript
logo.jsによるJavaScriptの非公式ひこうしきロゴ
パラダイム マルチパラダイム
登場とうじょう時期じき 1995ねん (29ねんまえ) (1995)
設計せっけいしゃ ブレンダン・アイク
開発かいはつしゃ ネットスケープコミュニケーションズMozilla Foundation
最新さいしんリリース ECMAScript 2023[1] ウィキデータを編集/ 2023ねん6がつ (14かげつまえ)
評価ひょうかばんリリース ECMAScript 2025[2] ウィキデータを編集 / 2024ねん3がつ27にち (4かげつまえ)
型付かたつ ダック・タイピング
おも処理しょりけい JavaScriptCoreKJSNitroRhinoSpiderMonkeyV8ほか
方言ほうげん JScript
影響えいきょうけた言語げんご SchemeSelfJavaLuaPerlAWKHyperTalkPython ウィキデータを編集
影響えいきょうあたえた言語げんご DartObjective-Jフランス語ふらんすごばんGoogle Apps ScriptTypeScript
プラットフォーム クロスプラットフォーム
ウェブサイト www.ecma-international.org/publications-and-standards/standards/ecma-262/ ウィキデータを編集
拡張子かくちょうし .js.cjs.mjs
テンプレートを表示ひょうじ
HTMLなかのJavaScript。scriptタグかこまれている。

プロトタイプベースオブジェクト指向しこうスクリプト言語げんごであるが、クラスなどのクラスベースられる機能きのうんでいる。

利用りようされる場面ばめんウェブサイトウェブアプリケーション、バックエンド、デスクトップアプリケーションモバイルアプリケーションなど、ウェブブラウザからサーバ、デスクトップからスマートフォンまで多岐たきにわたっている。

Java名称めいしょうつが、ことなるプログラミング言語げんごである(#歴史れきし参照さんしょう)。

概要がいよう

編集へんしゅう

JavaScriptはWebブラウザNetscape Navigator起源きげんち、現在げんざいでは様々さまざま用途ようと利用りようされるプログラミング言語げんごである。

JavaScriptの言語げんご仕様しようECMAScriptとして標準ひょうじゅんされ、実装じっそう各種かくしゅのJavaScriptエンジンによって提供ていきょうされている。JavaScriptエンジンのれいとしてChromiumけいブラウザのV8Mozilla FirefoxSpiderMonkeySafariのJavaScriptCoreがげられる。

言語げんご仕様しよう定義ていぎするECMAScriptのほかに、WebブラウザへアクセスするためのAPI仕様しようDOMなどがある。これらはECMAScriptから独立どくりつしており、JavaScriptからも独立どくりつした概念がいねんである。

プログラミング言語げんごとしての特徴とくちょう

編集へんしゅう

JavaScriptは以下いかのような様々さまざまなスタイルのプログラミングが可能かのうである。

これらを可能かのうにしているプログラミング言語げんごとしての特徴とくちょうに、以下いかのことがげられる。オブジェクト指向しこうめんでは、JavaScriptのオブジェクトはクラスベースではなくプロトタイプベースである[注釈ちゅうしゃく 1]関数かんすうがためんでは、だいいちきゅう関数かんすうをサポートし関数かんすうだいいちきゅうオブジェクトとしてあつかえる。

AptanaEclipse, NetBeans, IntelliJ IDEAなどの統合とうごう開発かいはつ環境かんきょうはJavaScriptをサポートしており、だい規模きぼ開発かいはつ可能かのうになっている。さらにExt JSなどの本格ほんかくてきGUIライブラリの登場とうじょうにより、デスクトップアプリケーションと遜色そんしょくないユーザインタフェースの構築こうちく可能かのうになった。

並行へいこう処理しょり

編集へんしゅう

JavaScriptではしばしば、ネットワークをかいしたリクエストのような "ち" がある処理しょりおこな[注釈ちゅうしゃく 2]。これに対処たいしょするために非同期ひどうき処理しょりをサポートし並行へいこう処理しょり可能かのうとなる。標準ひょうじゅん用意よういされている処理しょり機能きのうにも非同期ひどうき処理しょりされるものがある。

非同期ひどうき処理しょり記述きじゅつする方法ほうほうとしてコールバック関数かんすうがある。JavaScriptはコールバック関数かんすう記法きほうをラップするPromisePromise同期どうきてきなコードのように記述きじゅつできるAsync/await構文こうぶんをもつ。

またJavaScriptは並列へいれつ処理しょりによる並行へいこう処理しょりもサポートしている(下記かき参照さんしょう)。

並列へいれつ処理しょり

編集へんしゅう

JavaScriptでは複数ふくすうスレッドもちいた並列へいれつ処理しょり可能かのうである。共有きょうゆうメモリじょうのバッファを表現ひょうげんするSharedArrayBuffer、バッファ操作そうさオブジェクトAtomics定義ていぎされている。スレッドそのものの仕様しよう環境かんきょうごとにことなる(ECMAScriptでは定義ていぎされていない)。ブラウザの場合ばあいWorkerNode.js場合ばあいworker_threads定義ていぎされている。ただこの2環境かんきょうではほぼ共通きょうつう仕組しくみとなっており、たとえばpostMessageによるメッセージングが両者りょうしゃでサポートされている。

誕生たんじょう

編集へんしゅう

JavaScriptはネットスケープコミュニケーションズブレンダン・アイクによって、1995ねん5がつ10日とおかあいだ開発かいはつされた。上司じょうしからの指示しじに「Javaのような外観がいかんにしてくれ」「初心者しょしんしゃやさしく」「Netscapeブラウザのほとんどなんでも制御せいぎょできるように」との注文ちゅうもんがあった[3]。Netscape Navigator 2.0で実装じっそうされた。

開発かいはつ当初とうしょLiveScriptばれていたが、1995ねんサン・マイクロシステムズげんオラクル)が開発かいはつしたプログラミング言語げんごJava当時とうじおおきな注目ちゅうもくびており、ネットスケープとサン・マイクロシステムズが業務ぎょうむ提携ていけいしていたこともあったため、JavaScriptという名前なまえ変更へんこうされた[4][5]最初さいしょJavaScriptエンジンはブレンダン・アイクによりNetscape Navigatorのために作成さくせいされたものであった。このエンジンはSpiderMonkeyばれており、C言語げんご実装じっそうされていた。また、すべてJavaで記述きじゅつされたJavaScriptエンジンであるRhinoおなじくNetscapeのNorris Boyd(のちGoogle移籍いせき)らにより作成さくせいされた。

1996ねんマイクロソフトInternet Explorer 3.0にJScriptという名前なまえ搭載とうさいされるようになると、その手軽てがるさからJavaScriptは急速きゅうそく普及ふきゅうしていく。1997ねん通信つうしんかんする標準ひょうじゅん策定さくていする国際こくさい団体だんたいEcmaインターナショナルによってJavaScriptの中核ちゅうかくてき仕様しようECMAScriptとして標準ひょうじゅんされ[6]おおくのウェブブラウザで利用りようできるようになった。

ネットスケープは、ウェブアプリケーション開発かいはつ言語げんごとして自社じしゃのサーバ製品せいひん実装じっそうしたLiveWire JavaScriptも発表はっぴょうしたが[5]、こちらはあまり普及ふきゅうしなかった。

JavaScriptの登場とうじょう初期しょきは、ブラウザベンダーあいだ言語げんご仕様しよう独自どくじ拡張かくちょうおこなわれていたため、ブラウザあいだ互換ごかんせいきわめてひくかった。ECMAScriptの策定さくてい以降いこう実装じっそうあいだ互換ごかんせい向上こうじょうし、DOMなど関連かんれん仕様しよう実装じっそうかんする互換ごかんせいたかくなっていった。

かつてはJavaScriptという言葉ことばが「ECMAScript標準ひょうじゅん」をす、あるいは「独自どくじ実装じっそうふくんだ広義こうぎのJavaScript」を幅広はばひろ意味いみ使つかわれていた。ゆえにどちらの意味いみでJavaScriptという言葉ことば使つかわれているかは文脈ぶんみゃく判断はんだんする必要ひつようがあった[7]。たとえばかつてマイクロソフトによる実装じっそうJScriptばれたが、JScriptをJavaScriptとぶような場面ばめんがあった。

ECMAScriptは仕様しよう自体じたい独自どくじ拡張かくちょう条件じょうけんきでみとめる記述きじゅつがあり[8]、ブラウザが実装じっそうしているスクリプト言語げんごはすべてECMAScriptに準拠じゅんきょしていることになる。広義こうぎ意味いみでこれをJavaScriptと場合ばあい主要しゅようなブラウザが実装じっそうしているスクリプト言語げんごはマイクロソフトやGoogle、Apple実装じっそうふくめてJavaScriptである。

実装じっそうあいだでの差異さい吸収きゅうしゅうするためにPrototype JavaScript Frameworkなどのライブラリもちいられた。

発展はってん

編集へんしゅう

市場いちばのブラウザあいだ互換ごかんせいがある程度ていど確立かくりつされた2000ねんごろには、GoogleやAmazonなどのGAFAMもJavaScriptを積極せっきょくてき利用りようはじめた。

また、JavaScriptはウェブブラウザの拡張かくちょう機能きのう開発かいはつするための言語げんごとしても使つかわれるようになった。当初とうしょ拡張かくちょう機能きのうようのAPIが統一とういつされていなかったが、互換ごかんせいたかめようとするうごきがある[9]

当初とうしょインタプリタ方式ほうしき実行じっこうされることが一般いっぱんてきであったためJavaScriptの実行じっこう速度そくどはさほどはやくなかったが、現在げんざいではJITコンパイルなどを利用りようした各種かくしゅ最適さいてきがなされており、かくウェブブラウザのベンダーともに高速こうそくはかってしのぎをけずっている。さらには、この高速こうそくけるかたちで、Node.jsのようにサーバサイドでもJavaScriptを使つかうごきがられるようになった。

次世代じせだいのJavaScriptとして、"JavaScript 2.0" をつくろうとしたうごきは2あったが、いずれもまとまらなかった。

1度目どめはECMAScript 3が完成かんせいしたのち2000ねんから2003ねんにかけて発生はっせいしたが、ネットスケープとマイクロソフトの対立たいりつでまとまらなかった。当時とうじネットスケープが提案ていあんしていたあんアドビActionScript 2.0にがれ、マイクロソフトのあんJScript .NETへとがれた。

そのもネットスケープおよMozilla FoundationはECMAScriptの策定さくてい並行へいこうしてJavaScriptを拡張かくちょうし、JavaScript 1.x系列けいれつとしてバージョンアップをかえしていた。ECMAScriptがわではECMAScript 4の策定さくていが1999ねん以降いこうすすめられており[10]、2006ねん時点じてんMozilla FoundationはこれにもとづいてJavaScript 2.0を作成さくせいすることを表明ひょうめいしていた。MozillaはECMAScript 4の策定さくていにあたって、Python文法ぶんぽう一部いちぶんだあん提案ていあんしており、自身じしんでもこれを実装じっそうしていた[11]

しかしその、ECMAScriptの標準ひょうじゅん作業さぎょうがMozilla, Adobe, Opera, Googleらがす ECMAScript 4 と、Microsoft, Yahoo! らがす ECMAScript 3.1 に事実じじつじょう分裂ぶんれつしてしまった影響えいきょうから、2008ねん8がつおおきな方針ほうしん転換てんかんがあり、ECMAScript 4は破棄はきされ後者こうしゃがECMAScript 5として2009ねん標準ひょうじゅんされた。ECMAScript 4にはい予定よていだった機能きのうあらたに発足ほっそくした「ECMAScript Harmony」に先送さきおくりとなった[12]。これはのちにECMAScript 2015として標準ひょうじゅん完了かんりょうした。

なお、ECMAScript 5が標準ひょうじゅんされて以降いこう、MozillaのJavaScript実装じっそうはECMAScriptへの準拠じゅんきょうたうようになった[13]。そしてバージョン番号ばんごうでの呼称こしょうおこなわれなくなり、JavaScript 2.0は事実じじつじょう死語しごとなった。

文法ぶんぽう

編集へんしゅう

基本きほんてき文法ぶんぽう

編集へんしゅう

JavaScriptの変数へんすうvar[14], let[15]およびconst[16] キーワードを使用しようして宣言せんげんできる。

let x; // 変数へんすうxの宣言せんげん指定していのため、特殊とくしゅである undefined がはいった状態じょうたいとなる。
let y = 2; // 変数へんすうyの宣言せんげん同時どうじに 2 が代入だいにゅうされる。
const z = 5; // 定数ていすうzの宣言せんげん同時どうじに 5 が代入だいにゅうされる。定数ていすうであるため、えることはできない。

上記じょうきれいスラッシュ2文字もじ以降いこうコメントである。

JavaScriptは言語げんご仕様しようI/Oまれておらず、それらは実行じっこう環境かんきょうにより提供ていきょうされる。ECMAScript 5.1の仕様しようでは以下いかのように言及げんきゅうされている。[17]

この仕様しようなかでは外部がいぶデータの入力にゅうりょくまたは計算けいさん結果けっか出力しゅつりょく供給きょうきゅうしない。
(… indeed, there are no provisions in this specification for input of external data or output of computed results.)

しかし、ほとんどの実行じっこう環境かんきょうはConsole Standard[18]規定きていされている console オブジェクトをっており[19]、そこにコンソール出力しゅつりょくおこなえる。以下いか最小さいしょうHello worldプログラムをしめす。

console.log("Hello World!");

再帰さいき関数かんすう以下いかのようにける。

function factorial(n) {
    if (n == 0) {
        return 1;
    }
    return n * factorial(n - 1);
}

無名むめい関数かんすう(またはラムダしき)の構文こうぶんクロージャれい以下いかである。

// ECMAScript 5以前いぜん記法きほう
var displayClosure = function() {
    let count = 0;
    // ECMAScript 2015以降いこう可能かのう記法きほう
    return ()=> {
        return ++count;
    };
}
var inc = displayClosure();
inc(); // 1 がかえ
inc(); // 2 がかえ
inc(); // 3 がかえ

可変長かへんちょう引数ひきすう以下いかのように記述きじゅつする[20]

var sum = function(...args) {
    let x = 0;
    for (const v of args) {
        x += v;
    }
    return x;
}
sum(1, 2, 3); // 6 がかえ

即時そくじ実行じっこう関数かんすうしき (IIFE) のれい関数かんすうもちいることで変数へんすうクロージャめることができる。

var v;
v = 1;
var getValue = (function(v) {
  return function() {return v;};
})(v);

v = 2;

getValue(); // 1 がかえ

複雑ふくざつれい

編集へんしゅう

以下いかのサンプルコードは、様々さまざまなJavaScriptの機能きのうしめしたものである。

"use strict"; // strictモードの宣言せんげん
/* 2つの数値すうち最小公倍数さいしょうこうばいすうもとめる */
function LCMCalculator(x, y) { // コンストラクタ関数かんすう
    const checkInt = (x)=> { // 関数かんすう
        if (x % 1 !== 0) {
            throw new TypeError(x + " is not an integer"); // 例外れいがいのスロー
        }
        return x;
    };
    //   行末ゆくすえのセミコロンは省略しょうりゃく可能かのう場合ばあいがあるが、省略しょうりゃく推奨すいしょうされない。
    this.a = checkInt(x)
    this.b = checkInt(y);
}
// オブジェクトのプロトタイプはコンストラクタ関数かんすうの prototype プロパティに格納かくのうする
LCMCalculator.prototype = { // オブジェクトリテラル
    constructor: LCMCalculator, // このようにプロトタイプを上書うわがきする場合ばあいは、
                                // constructorプロパティにコンストラクタ関数かんすうめいさい指定していする
    gcd: function () { // 最大公約数さいだいこうやくすう計算けいさんするメソッド
        // 「ユークリッドの互除ほう」アルゴリズムで計算けいさん
        let a = Math.abs(this.a), b = Math.abs(this.b);
        if (a < b) {
            // 変数へんすう
            const t = b;
            b = a;
            a = t;
        }
        while (b !== 0) {
            const t = b;
            b = a % b;
            a = t;
        }
        // 最大公約数さいだいこうやくすう計算けいさんいちでよいため、自分じぶん自身じしん計算けいさんみの結果けっかかえすメソッドでさい定義ていぎ上書うわがき)する。
        // (これにより LCMCalculator.prototype.gcd のわりに this.gcd がばれるようになる。
        //   ただし、計算けいさんにプロパティ a や b が変更へんこうされてしまうと、結果けっかあやまりとなる。)
        // なお 'gcd' === "gcd", this['gcd'] === this.gcd である。
        this['gcd'] = function () {
            return a;
        };
        return a;
    },
    lcm : function () { // 最小公倍数さいしょうこうばいすう計算けいさんするメソッド
        // 変数へんすうめいは、オブジェクトのプロパティと衝突しょうとつしない。れい)lcm は this.lcm とはことなる。
        // 以下いかでは、浮動ふどう小数しょうすう精度せいど問題もんだいけるために this.a * this.b としていない。
        const lcm = this.a/this.gcd()*this.b;
        // 最小公倍数さいしょうこうばいすう計算けいさんいちでよいため、自分じぶん自身じしん計算けいさんみの結果けっかかえすメソッドでさい定義ていぎ上書うわがき)する。
        this.lcm = function () {
            return lcm;
        };
        return lcm;
    },
    toString: function () { // toStringはオブジェクトを文字もじれつ変換へんかんするときにばれるメソッド。
        // テンプレート文字もじれつにより文字もじれつちゅうむことができる。
        return `LCMCalculator: a = ${this.a}, b = ${this.b}`;
    }
};

// 汎用はんよう出力しゅつりょく関数かんすう定義ていぎ。この実装じっそうはWebブラウザじょうでのみ動作どうさする。
function output(x) {
    document.body.appendChild(document.createTextNode(x));
    document.body.appendChild(document.createElement('br'));
}

// 無名むめい関数かんすうはさまざまなかた可能かのう
[[25, 55], [21, 56], [22, 58], [28, 56]].map(([a, b])=> new LCMCalculator(a, b)) // 配列はいれつリテラル + マッピング関数かんすう
.sort((a, b)=> a.lcm() - b.lcm()) // 指定していした比較ひかく関数かんすうもちいたソート
.forEach(obj=> {
    output(obj + ", gcd = " + obj.gcd() + ", lcm = " + obj.lcm());
});

上記じょうきコードをウェブブラウザじょう実行じっこうすると、以下いか結果けっか表示ひょうじされる。

LCMCalculator: a = 28, b = 56, gcd = 28, lcm = 56
LCMCalculator: a = 21, b = 56, gcd = 7, lcm = 168
LCMCalculator: a = 25, b = 55, gcd = 5, lcm = 275
LCMCalculator: a = 22, b = 58, gcd = 2, lcm = 638

グローバルオブジェクト

編集へんしゅう

JavaScriptはコードの最上階さいじょうかいそうぞくするグローバルオブジェクトを提供ていきょうしている。JavaScriptにおけるグローバルオブジェクトはglobalThisである[21]

エコシステム

編集へんしゅう

実行じっこう環境かんきょうAPI

編集へんしゅう

それぞれのJavaScript実行じっこう環境かんきょうにおいて様々さまざまなAPIが存在そんざいしており、JavaScriptからそれらをすことができる。

HTML要素ようそをJavaScriptから操作そうさするためのDOM APIれい: document.querySelector)、HTTPリクエストを送信そうしんするFetch API、マルチスレッドを可能かのうにするWorkerなどが定義ていぎされている。これらは言語げんご仕様しようであるECMAScriptからは独立どくりつした各々おのおの仕様しようしょでAPIが定義ていぎされ、ブラウザ実装じっそうがJavaScriptバインディングを提供ていきょうすることでJavaScriptからのしが可能かのうになっている。

ファイルシステムにアクセスするためのfs API(モジュール)や実行じっこうプロセスと相互そうご作用さようするprocess APIなどが定義ていぎされている。Webブラウザがもつつよいサンドボックス要件ようけん緩和かんわされているてんがNode.js APIの特徴とくちょうの1つである。

alternative JavaScript (altJS) はJavaScriptへトランスパイルされるプログラミング言語げんご総称そうしょうである。

JavaScriptへあらたな機能きのう追加ついかする方法ほうほうの1つに、あたらしい言語げんご定義ていぎしそのコードをJavaScriptへ変換へんかんする方法ほうほうがある。そのようなJavaScriptへトランスパイルされる言語げんごaltJS総称そうしょうされる。altJSのれいとしてCoffeeScriptTypeScriptPureScriptげられる。altJSをもちいることで、あらたな演算えんざん記法きほう導入どうにゅう効率こうりついJavaScript開発かいはつおこなうことができる。もとのJavaScriptはaltJSと対比たいひしてVanilla JSとしばしばばれる[22]

たとえばTypeScriptはかた導入どうにゅう可能かのうにする。JavaScriptは動的どうてき型付かたつけである。静的せいてきコード解析かいせきでJavaScriptコードへのかた検査けんさ実行じっこう可能かのうだが、コードじょうかた表記ひょうきをおこなうことはできない。altJSの1つであるTypeScriptはJavaScriptへかたノーテーションを導入どうにゅうしトランスパイルかた検査けんさをおこなうことで、かたをもったJavaScriptを実現じつげんしている。

パッケージ管理かんり

編集へんしゅう

JavaScriptエコシステムには多様たようなライブラリ(パッケージ)が存在そんざいする。パッケージの導入どうにゅう・バージョン調整ちょうせい廃棄はいきにな管理かんりソフトウェアとしてnpmyarnがある。

WebブラウザにおけるHTML操作そうさ目的もくてきとしてつくられたJavaScriptは、2020ねん現在げんざい幅広はばひろ領域りょういき利用りようされている。

Webページでの利用りよう

編集へんしゅう

JavaScriptのもっと歴史れきしなが使用しようほうはHTMLページにクライアントがわのふるまいをたせることである。これは当初とうしょダイナミックHTML (DHTML) としてられていた。JavaScriptはHTMLに直接ちょくせつまれまたはべつのファイルからインクルードされ、WebブラウザじょうのJavaScript実行じっこう環境かんきょう動作どうさする。Webブラウザは通常つうじょうDocument Object Model (DOM) をあつかうためのホストオブジェクトを提供ていきょうする。

JavaScriptの使用しようれいとしては、以下いかのようなものがある。

JavaScriptはユーザーのブラウザじょう動作どうさできることから、ユーザーの操作そうさたいして素早すばや反応はんのうすることができ、アプリケーションをよりレスポンシブにすることができる。さらにJavaScriptはHTML単独たんどくでは対応たいおうできない操作そうさたとえばキー入力にゅうりょくなどにも応答おうとうすることができる。Gmailのようなアプリケーションでは、JavaScriptでUIロジックを実装じっそうし、さらにJavaScriptでサーバから情報じょうほうたとえばeメールのメッセージ)を取得しゅとくすることで、こうしたメリットを享受きょうじゅしている。このような利点りてんからAjaxおおきなトレンドとなった[よう出典しゅってん]

様々さまざま言語げんごやフレームワークをウェブブラウザじょう動作どうささせるために、JavaScriptはそれらのコンパイルさき出力しゅつりょく言語げんごとなっている(れい: TypeScript)。

以下いかはJavaScriptとDOMをふくむWebページのごく単純たんじゅんれいである。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <title>単純たんじゅんれい</title>
  </head>
  <body>
    <h1 id="header">これはJavaScriptです</h1>
    <script>
      document.body.appendChild(document.createTextNode('Hello World!'));

      let h1 = document.querySelector('#header'); // id='header'の<h1>要素ようそ参照さんしょう取得しゅとく
      h1 = document.querySelectorAll('h1')[0]; //または<h1>要素ようそすべ取得しゅとくしてそこから先頭せんとう取得しゅとく
    </script>
    <noscript>使つかいのブラウザはJavaScriptをサポートしていないか、無効むこうになっています。</noscript>
  </body>
</html>

登場とうじょう当初とうしょは、htmlの補助ほじょてきなスクリプトとして、クラス非同期ひどうき処理しょりなどの処理しょり貧弱ひんじゃくであったが、近年きんねんWebアプリケーション浸透しんとうともない、様々さまざま機能きのう拡張かくちょうされた。 現在げんざいでは、クラスの作成さくせい非同期ひどうき処理しょりなど、C#Javaでなければ実装じっそうできなかったものも手軽てがる実装じっそうできるようになっている。以下いかはクラスや非同期ひどうき処理しょりのごく単純たんじゅん実装じっそうれいである。

// クラスめい
class Cyber_Crusade {

  // コンストラクタ
  constructor(limit) {
    // 1びょうごとの送信そうしん頻度ひんど設定せってい
    this.CONCURRENCY_LIMIT = limit;
    // 非同期ひどうき関数かんすう定義ていぎ
    this.fetchWithTimeout = this.fetchWithTimeout.bind(this);   // リクエスト送信そうしん
    this.punish_heterodoxy = this.punish_heterodoxy.bind(this); // かくサイトにデータリクエストをおくる。
  }

  // 対象たいしょうのサイトを指定してい
  heresy_sites = {
       'https://example.com/': { number_of_requests: 0, number_of_errored_responses: 0 },   
       'https://www.example.com/': { number_of_requests: 0, number_of_errored_responses: 0 },  
  };

  // 1びょうごとの送信そうしん頻度ひんど
  CONCURRENCY_LIMIT = 1000;
  queue = [];

  // リクエスト送信そうしん
  async fetchWithTimeout(resource, options) {
    // コントローラーを取得しゅとく
    const controller = new AbortController();
    // IDを取得しゅとく
    const id = setTimeout(() => controller.abort(), options.timeout);
    // リクエスト処理しょりかえす。
    return fetch(resource, {
      method: 'GET',              // GET方式ほうしき
      mode: 'no-cors',            // CORS-safelisted methodsとCORS-safelisted request-headersだけを使つかったリクエストをおくる。
      signal: controller.signal   // オブジェクトのインスタンスをかえし
    }).then((response) => {       // 成功せいこうした場合ばあい
      clearTimeout(id);			  // タイムアウトをす。
      return response;			  // 応答おうとう結果けっかかえす。
    }).catch((error) => {		  // 失敗しっぱいした場合ばあい
      console.log(error.code);    // エラーコードを出力しゅつりょく
      clearTimeout(id);			  // タイムアウトをす。
      throw error;				  // エラーをげる。
    });
  }

  // かくターゲットにデータ送信そうしんする。
  async punish_heterodoxy(target) {
    //forぶん使つかった無限むげんループ
    for (var i = 0;; ++i) {
      // リクエストのかず規定きていすうになったら
      if (this.queue.length > this.CONCURRENCY_LIMIT) {
        // 最初さいしょのリクエストを削除さくじょする。
        await this.queue.shift()
      }
      // 乱数らんすう生成せいせい
      var rand = i % 3 === 0 ? '' : ('?' + Math.random() * 2000)
      // 送信そうしんリクエストを追加ついかする。
      this.queue.push(
        // 関数かんすう実行じっこうする(時間じかん制限せいげん:1びょう)
        this.fetchWithTimeout(target+rand, { timeout: 1000 })
          // エラーがある場合ばあいはエラーを取得しゅとくする。
          .catch((error) => {
            if (error.code === 20 /* ABORT */) {
              return;
            }
            this.heresy_sites[target].number_of_errored_responses++;
          })
          // 処理しょり処理しょりをする。
          .then((response) => {
            // エラーがある場合ばあいはエラー処理しょりれる。
            if (response && !response.ok) {
              this.heresy_sites[target].number_of_errored_responses++;
            }
            // リクエストすう追加ついかする。
            this.heresy_sites[target].number_of_requests++;
          })
      )
    }
  }       
  // 実行じっこう関数かんすう
  inquisitio(){
   // すべてのターゲット要素ようそたいしてデータ送信そうしん処理しょり実行じっこうする。
   Object.keys(this.heresy_sites).map(this.punish_heterodoxy);
  }
}

// オブジェクト
var cyber_crusade = new Cyber_Crusade(500);
// 実行じっこう
cyber_crusade.inquisitio();

その環境かんきょうでの利用りよう

編集へんしゅう

ウェブブラウザ以外いがいのJavaScript実行じっこう環境かんきょう存在そんざいする(サーバーサイドJavaScript実装じっそう一覧いちらん英語えいごばん参照さんしょう)。データベースWebサーバまれ、それらのAPIやHTTPリクエストやレスポンスのアクセスが提供ていきょうされているものもある。

また、Node.jsのようにOS機能きのうネットワークファイルシステムなど)にアクセスできる環境かんきょう存在そんざいする。くわえてElectronなどのアプリケーションフレームワーク登場とうじょうにより、Atomなどのアプリケーションがひろまりつつある。

いくつかのアプリケーションではマクロ言語げんごとしても採用さいようされている。たとえばAdobe Acrobatは、JavaScriptによるマクロ機能きのう搭載とうさいしている。

バージョンとブラウザの対応たいおうひょう

編集へんしゅう
バージョン 日付ひづけ 規格きかく Netscape
Navigator
Mozilla
Firefox
Internet
Explorer
Opera Safari
1.0 1996ねん3がつ 2.0 3.0
1.1 1996ねん8がつ 3.0
1.2 1997ねん7がつ 4.0-4.05
1.3 1998ねん10がつ ECMA-262 1st edition / ECMA-262 2nd edition 4.06-4.7x 4.0 5.0
1.4 Netscape
Server
6.0
1.5 2000ねん11月 ECMA-262 3rd edition 6.0 1.0 5.5 (JScript 5.5),
6.0 (JScript 5.6),
7.0 (JScript 5.7),
8.0 (JScript 6.0)
1.6 2005ねん11月 1.5 + Array extras + Array and String generics + E4X 7.0-8.0 1.5 7.0-9.0 3.0, 3.1
1.7 2006ねん10がつ 1.6 + Pythonic generators + Iterators + let 2.0 3.2-5.1
1.8 2008ねん7がつ 1.7 + Generator expressions + Expression closures 3.0
1.8.1 1.8 + Minor Updates 3.5
1.9 1.8.1 + ECMAScript 5[24] Compliance 4.0-11.0

[25]

代表だいひょうてきなJavaScriptライブラリは以下いかのとおり。

脚注きゃくちゅう

編集へんしゅう

注釈ちゅうしゃく

編集へんしゅう
  1. ^ あたらしい (ES2015以降いこう) JavaScriptではクラスの構文こうぶんによりプロトタイプを意識いしきせずにオブジェクト指向しこうプログラミングをすることが可能かのうになったが、言語げんご設計せっけいプロトタイプベース設計せっけい維持いじしている。
  2. ^ もしもちのあいだにプログラムを停止ていし/sleep させると、そのあいだ処理しょりをそのスレッドでおこなうことが出来できない(ブロッキング)。もしネットワークリクエストがかえってくるまでブロッキングしたとすると、そのあいだブラウザのレンダリングも停止ていししてしまう。

出典しゅってん

編集へんしゅう
  1. ^ ECMAScript® 2023 Language Specification” (6がつ 2023). 2 3がつ 2024閲覧えつらん
  2. ^ ECMAScript® 2025 Language Specification” (27 3がつ 2024). 17 4がつ 2024閲覧えつらん
  3. ^ Effective JavaScript(しょうおよげしゃ、2013)iii。
  4. ^ Marc Andreessen. “INNOVATORS OF THE NET: BRENDAN EICH AND JAVASCRIPT”. 2008ねん7がつ4にち時点じてんオリジナルよりアーカイブ。2008ねん1がつ22にち閲覧えつらん
  5. ^ a b NETSCAPE AND SUN ANNOUNCE JAVASCRIPT, THE OPEN, CROSS-PLATFORM OBJECT SCRIPTING LANGUAGE FOR ENTERPRISE NETWORKS AND THE INTERNET”. 2008ねん5がつ28にち時点じてんオリジナルよりアーカイブ。2008ねん1がつ22にち閲覧えつらん
  6. ^ ECMA 262, ISO/IEC 16262, JIS X 3060
  7. ^ JavaScript だい5はんオライリー・ジャパン、2007)P2。
  8. ^ ECMA-262 だい5はん 2.Conformance
  9. ^ WebExtensions, Browser Extensions
  10. ^ ECMAScript® 2017 Language Specification (ECMA-262, 8th edition, June 2017) Introduction
  11. ^ Python and JavaScript” (英語えいご). Brendan's Roadmap Updates (2006ねん2がつ19にち). 2010ねん1がつ25にち時点じてんオリジナルよりアーカイブ。2007ねん9がつ5にち閲覧えつらん
  12. ^ 後藤ごとう大地だいち (2008ねん8がつ18にち). “JavaScript 2.0はECMAScript 3.1ベースに、ECMAScript 4は譲歩じょうほ”. マイナビニュース. 2013ねん3がつ1にち時点じてんオリジナルよりアーカイブ。2022ねん4がつ11にち閲覧えつらん
  13. ^ Mozilla における ECMAScript 5 のサポート”. 2021ねん4がつ20日はつか時点じてんオリジナルよりアーカイブ。2022ねん4がつ11にち閲覧えつらん
  14. ^ var – JavaScript – MDN”. The Mozilla Developer Network. 22 December 2012閲覧えつらん
  15. ^ let – JavaScript – MDN”. The Mozilla Developer Network. 24 January 2018閲覧えつらん
  16. ^ const – JavaScript – MDN”. The Mozilla Developer Network. 24 January 2018閲覧えつらん
  17. ^ ECMAScript Language Specification – ECMA-262 Edition 5.1”. Ecmaインターナショナル. 22 December 2012閲覧えつらん
  18. ^ Console Living Standard” (英語えいご). WHATWG (2017ねん5がつ18にち). 2017ねん5がつ24にち閲覧えつらん
  19. ^ console”. Mozilla Developer Network. Mozilla. 6 April 2013閲覧えつらん
  20. ^ “[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters Rest parameters - JavaScript]”. Mozilla Developer Network. Mozilla. 24 January 2018閲覧えつらん
  21. ^ 2020-04-10現在げんざい tc39 stage-4 (finished proposal). ECMAScript2020へ採用さいよう予定よてい tc39
  22. ^ Vanilla JS”. vanilla-js.com. June 16, 2020てんのオリジナルよりアーカイブ2021ねん9がつ4にち閲覧えつらん
  23. ^ JavaScript tracking – Piwik”. Piwik. 31 March 2012閲覧えつらん
  24. ^ 後藤ごとう大地だいち (2009ねん12月9にち). “JavaScriptのブラウザ互換ごかん解決かいけつのみとおし”. journal.mycom.co.jp. 2009ねん12月9にち閲覧えつらん
  25. ^ John Resig. “Versions of JavaScript”. Ejohn.org. 2009ねん5がつ19にち閲覧えつらん

関連かんれん項目こうもく

編集へんしゅう

外部がいぶリンク

編集へんしゅう