JavaScript

ページは半保護されています
この記事を聞く

JavaScript
JavaScriptソースコードのスクリーンショット
パラダイムマルチパラダイム:イベント駆動型関数型命令型手続き型オブジェクト指向
家族ECMAスクリプト
デザイン:最初はNetscapeBrendan Eich氏、その後他のメンバーがECMAScript標準に貢献した。
初登場1995年12月4日[ 1 ] (1995年12月4日
安定版リリース
ECMAScript 2024 [ 2 ] ウィキデータで編集する / 2024年6月 (2024年6月
プレビューリリース
ECMAScript 2025 [ 3 ] ウィキデータで編集する / 2024年3月27日 (2024年3月27日
タイピングの規律ダイナミック弱いアヒル
メモリ管理ガベージコレクション
範囲語彙
ファイル名拡張子.js.mjs.cjs[ 4 ]
Webサイトecma-international .org /出版物と標準/標準/ecma-262 /
主要な実装
V8JavaScriptCoreSpiderMonkeyChakra(非推奨)
影響を受けた
Java[ 5 ] [ 6 ] Scheme[ 6 ] Self[ 7 ] AWK[ 8 ] HyperTalk [ 9 ]
影響を受けた
ActionScriptArkTSAssemblyScriptCoffeeScriptDartHaxeJS++OpaTypeScript

JavaScriptJS[ a ]は、 HTMLCSSと並んでWebの中核技術であり、プログラミング言語です。 1995年にブレンダン・アイクによって開発されました。[ 6 ] 2025年現在、ウェブサイトの圧倒的多数(98.9%)がクライアント側のウェブページ動作にJavaScriptを使用しています。[ 10 ]

ウェブブラウザには、クライアントコードを実行する専用のJavaScriptエンジンが搭載されています。これらのエンジンは、一部のサーバーや様々なアプリでも利用されています。ブラウザ以外での利用で最も普及しているランタイムシステムはNode.jsです。[ 11 ]

JavaScriptは、ECMAScript標準に準拠した、高水準で、多くの場合ジャストインタイムコンパイル(JIT)方式の言語です。[ 12 ]動的型付けプロトタイプベースのオブジェクト指向、そして第一級関数を備えています。また、マルチパラダイムに対応し、イベント駆動型関数型、命令型といったプログラミングスタイルをサポートしています。テキスト、日付、正規表現、標準データ構造、そしてドキュメントオブジェクトモデル(DOM) を扱うためのアプリケーションプログラミングインターフェース(API)を備えています。

ECMAScript標準には、ネットワークストレージグラフィックス機能といった入出力(I/O)は含まれていません。実際には、Webブラウザやその他のランタイムシステムがI/O用のJavaScript APIを提供しています。

Javaと JavaScript は名前と構文が似ていますが、2 つの言語は別個のものであり、設計は大きく異なります。

歴史

Netscapeでの創造

グラフィカルユーザーインターフェースを備えた最初の人気ウェブブラウザであるMosaicは1993年にリリースされました。Mosaicの主任開発者はその後Netscape社を設立し、同社は1994年にさらに洗練されたブラウザであるNetscape Navigatorをリリースしました。これはすぐに最も使用されるブラウザとなりました。[ 13 ]

Webの黎明期、Webページは静的なものであり、ブラウザにページが読み込まれた後の動的な動作は不可能でした。当時活況を呈していたWeb開発シーンでは、この制約を解消したいという要望が高まり、1995年、NetscapeはNavigatorにプログラミング言語を追加することを決定しました。同社はこれを実現するために、2つの方法を採用しました。1つはSun Microsystemsと提携してJava言語を組み込み、もう1つはBrendan Eichを雇用してScheme言語を組み込むというものでした。[ 6 ]

その目標は「大衆のための言語」[ 14 ] 、 「プログラマー以外の人が動的でインタラクティブなWebサイトを作成できるようにする」ことだった。[ 15 ] Netscapeの経営陣はすぐに、Javaに似た構文を持ち、Schemeや他の既存のスクリプト言語に似ていない新しい言語をアイヒが考案するのが最善の選択肢であると判断した。[ 5 ] [ 6 ]新しい言語とそのインタープリタ実装は、1995年9月にNavigatorベータ版の一部として最初に出荷されたときにはLiveScriptと呼ばれていたが、12月の正式リリースではJavaScriptに名前が変更された。[ 6 ] [ 1 ] [ 16 ] [ 17 ]

JavaScriptという名称の選択は、Javaと直接関連しているという印象を与え、混乱を招きました。当時、ドットコム・ブームが始まり、Javaは人気の高い新しい言語であったため、アイヒ氏はJavaScriptという名称はNetscapeのマーケティング戦略だと考えました。[ 14 ]

マイクロソフトによる採用

マイクロソフトは1995年にInternet Explorerを発表し、Netscapeとのブラウザ戦争を引き起こしました。JavaScriptに関しては、マイクロソフトはJScriptと呼ばれる独自のインタープリタを開発しました。[ 18 ]

マイクロソフトは1996年にJScriptを初めてリリースし、同時にCSSHTML拡張機能も初期サポートしました。これらの実装は、 Netscape Navigatorの対応するものとは大きく異なっていました。[ 19 ] [ 20 ]これらの違いにより、開発者はウェブサイトを両方のブラウザで適切に動作させることが困難になり、「Netscapeで最適表示」および「Internet Explorerで最適表示」というロゴが長年にわたり広く使用されました。[ 19 ] [ 21 ]

JScriptの台頭

ブレンダン・アイクは後にこの時期についてこう述べている。「まだ一種の脇役言語です。遅い、あるいは煩わしいと考えられています。ポップアップや、古いブラウザの下部にある古いステータスバーにスクロールするメッセージが表示されるのです。」[ 14 ]

1996年11月、NetscapeはJavaScriptをEcma Internationalに提出しました。これは、すべてのブラウザベンダーが準拠できる標準仕様の出発点となるものでした。これにより、1997年6月に最初のECMAScript言語仕様が正式にリリースされました。

標準化プロセスは数年間継続され、1998年6月にECMAScript 2、1999年12月にECMAScript 3がリリースされました。ECMAScript 4の作業は2000年に始まりました。[ 18 ]

しかし、言語の完全標準化に向けた努力は、Microsoftがブラウザ市場でますます支配的な地位を築いたことにより、損なわれました。2000年代初頭には、Internet Explorerの市場シェアは95%に達しました。[ 22 ]これは、 JScriptがWeb上の クライアントサイドスクリプティングの事実上の標準となったことを意味します。

マイクロソフトは当初、標準化プロセスに参加し、JScript言語にいくつかの提案を実装しましたが、最終的にはECMAの活動への協力を中止しました。こうしてECMAScript 4は廃止されました。

成長と標準化

標準の維持に責任を持つEcma国際技術委員会39のロゴ
標準の維持に責任を持つEcma国際技術委員会39のロゴ

2000年代初頭のInternet Explorerの優位性により、クライアントサイドスクリプティングは停滞していました。しかし、2004年にNetscapeの後継であるMozillaがFirefoxブラウザをリリースしたことで、状況は変化し始めました。Firefoxは多くの人々に好評を博し、Internet Explorerから大きな市場シェアを奪いました。[ 23 ]

2005年、MozillaはECMA Internationalに加盟し、ECMAScript for XML (E4X) 標準の策定作業を開始しました。これにより、Mozillaは、ECMAScript 4の草案をベースとしたActionScript 3言語にE4Xを実装していたMacromedia (後にAdobe Systemsに買収)と共同で作業を進めることになりました。目標は、ActionScript 3を新しいECMAScript 4として標準化することでした。この目標達成のため、Adobe SystemsはTamarin実装をオープンソースプロジェクトとして公開しました。しかし、TamarinとActionScript 3は既存のクライアントサイドスクリプティングとは大きく異なっており、Microsoftの協力なしにはECMAScript 4は実現しませんでした。

一方、ECMAの活動とは無関係のオープンソースコミュニティでは、非常に重要な進展が見られました。2005年、ジェシー・ジェームズ・ギャレットはホワイトペーパーを発表し、その中で「Ajax」という用語を考案し、JavaScriptを基盤とした一連の技術について説明しました。この技術は、バックグラウンドでデータを読み込み、ページ全体の再読み込みを必要とせずにWebアプリケーションを作成するためのものです。これがJavaScriptのルネサンス期のきっかけとなり、オープンソースライブラリとそれらを中心に形成されたコミュニティがその先駆けとなりました。jQuery 、PrototypeDojo ToolkitMooToolsなど、多くの新しいライブラリ作成されました。

Googleは2008年に競合他社よりも高速なV8 JavaScriptエンジンを搭載したChromeブラウザを発表しました。 [ 24 ] [ 25 ]重要な革新はジャストインタイムコンパイル(JIT)でした。[ 26 ]そのため、他のブラウザベンダーはJITのためにエンジンを全面的に改良する必要がありました。[ 27 ]

2008年7月、これらの異なる関係者はオスロで会議を開きました。その結果、2009年初頭に、関連するすべての作業を統合し、言語を前進させることで最終的に合意に達しました。その結果、2009年12月にECMAScript 5標準がリリースされました。

成熟に達する

この言語に関する野心的な作業は数年にわたって続けられ、 2015年にECMAScript 6が公開され、広範な追加と改良が正式に発表されました。[ 28 ]

2009年にライアン・ダールがNode.jsを開発したことで、ウェブブラウザ以外でのJavaScriptの利用が大幅に増加しました。Node.jsはV8エンジン、イベントループI/O APIを組み合わせ、スタンドアロンのJavaScriptランタイムシステムを提供しています。[ 29 ] [ 30 ] 2018年時点で、Node.jsは数百万人の開発者に利用されており、[ 31 ] npm世界で最も多くのモジュールを持つパッケージマネージャーとなっています。 [ 32 ]

ECMAScriptのドラフト仕様は現在GitHubで公開されており[ 33 ]、定期的に毎年スナップショットが公開されています。[ 33 ]言語の改訂案は包括的な提案プロセスを通じて審査されます。[ 34 ] [ 35 ]現在、開発者はエディション番号ではなく、今後の機能の状況を個別に確認しています。[ 33 ]

現在のJavaScriptエコシステムには、多くのライブラリフレームワーク、確立されたプログラミング手法、そしてウェブブラウザ以外でのJavaScriptの大幅な使用があります。[ 17 ]さらに、シングルページアプリケーションやその他のJavaScriptを多用するウェブサイトの増加に伴い、開発プロセスを支援するためにいくつかのトランスパイラが作成されています。[ 36 ]

商標

「JavaScript」は米国オラクル社商標です。 [ 37 ] [ 38 ]この商標は1997年5月6日にサン・マイクロシステムズ社に最初に発行され、2009年にオラクル社がサンを買収した際にオラクル社に譲渡されました。[ 39 ] [ 40 ]

2024年9月にはライアン・ダールが先頭に立ってオラクルにJavaScriptの商標を解放するよう求める書簡が回覧された。 [ 41 ] JavaScriptのオリジナル作者であるブレンダン・アイクもこの取り組みを支持した14,000人以上の署名者の一人でした。

ウェブサイトのクライアント側の使用

JavaScriptはWebのクライアント側スクリプト言語として主流で、Webサイトの99%がこの目的で使用しています。[ 10 ]スクリプトはHTML文書に埋め込まれたり、HTML文書から取り込まれたりして、 DOMと対話します。

すべての主要なWeb ブラウザには、ユーザーのデバイス上で コードを実行するJavaScript エンジンが組み込まれています。

スクリプト化された動作の例

ライブラリとフレームワーク

ウェブサイトの80%以上が、クライアントサイドスクリプトの一部としてサードパーティのJavaScriptライブラリまたはウェブフレームワークを使用しています。 [ 42 ]

jQueryは圧倒的に最も多く使用されています。[ 42 ]その他の注目すべきものとしては、AngularBootstrapLodashModernizrReactUnderscoreVueなどがあります。[ 42 ] jQueryとBootstrapのように、複数のオプションを組み合わせて使用​​​​することもできます。[ 43 ]

しかし、「Vanilla JS」という用語は、ライブラリやフレームワークを一切使用せず、代わりに標準的なJavaScript機能に完全に依存しているウェブサイトのために造られました。[ 44 ]

その他の用途

JavaScript の用途は、Web ブラウザの枠を超えて拡大しています。JavaScriptエンジンは現在、サーバーサイドのWeb サイト展開や非ブラウザアプリケーションなど、さまざまなソフトウェア システムに組み込まれています。

サーバーサイドJavaScriptの利用を促進する最初の試みはNetscape Enterprise ServerMicrosoftInternet Information Servicesであったが[ 45 ] [ 46 ]、これらはニッチな市場であった。[ 47 ]サーバーサイドの利用は、 Node.jsその他のアプローチの登場により、2000年代後半にようやく増加し始めた。[ 47 ]

ElectronCordovaReact Nativeなどのアプリケーションフレームワークは、JavaScriptで実装された動作を持つ多くのアプリケーションの作成に使用されてきました。ブラウザ以外のアプリケーションとしては、PDFドキュメントのスクリプト作成をサポートするAdobe Acrobat [ 48 ]や、 JavaScriptで記述されたGNOME Shell拡張機能[ 49 ]などがあります。

Oracleは、 Java開発キット(JDK) APIライブラリの一部として、JavaScriptインタープリタのNashornをJDKバージョン8のコマンドラインインタープリタのjjsとともに提供していました。これはJDK 15で削除されました。代替としてOracleは、 OpenJDKでも使用できるGraalJSを提供しました 。これにより、JavaScriptコードでJavaオブジェクトを作成および参照し、Javaで記述されたアプリケーションにJavaScriptのランタイムスクリプトを追加できます。[ 50 ] [ 51 ] [ 52 ] [ 53 ]

JavaScriptは、通常Node.jsを活用して、いくつかの組み込みシステムで使用されています。 [ 54 ] [ 55 ] [ 56 ]

実行

JavaScriptエンジン

JavaScript 用の最初のエンジンはソースコードの単なるインタープリターでしたが、最近の関連するエンジンはすべて、パフォーマンスを向上させるためにジャストインタイムコンパイルを使用しています。 [ 57 ] JavaScript エンジンは通常、ウェブブラウザーベンダーによって開発され、すべての主要なブラウザーに 1 つずつあります。ブラウザーでは、JavaScript エンジンは、ドキュメントオブジェクトモデルWeb IDLバインディングを介してレンダリングエンジンと連携して動作します。[ 58 ]ただし、JavaScript エンジンの使用はブラウザーに限定されません。たとえば、V8 エンジンは、 Node.jsランタイムシステムのコアコンポーネントです。[ 59 ]これらは、仕様の正式名称にちなんで、 ECMAScriptエンジンとも呼ばれます。WebAssembly登場により、一部のエンジンでは、このコードを通常の JavaScript コードと同じサンドボックスで実行できるようになりました。[ 60 ] [ 59 ]

ランタイムシステム

スクリプトがより広範な環境とやり取りできるようにするには、 JavaScriptエンジンをランタイムシステム( Webブラウザやスタンドアロンシステムなど)に組み込む必要があります。ランタイムシステムには、ネットワークストレージグラフィックスといった入出力操作に必要なAPIが含まれており、スクリプトをインポートする機能も提供しています。

JavaScriptはシングルスレッド言語です。ランタイムはキューからのメッセージを1つずつ処理し、各メッセージに関連付けられた関数を呼び出して、関数の引数ローカル変数を含むコールスタックフレームを作成します。コールスタックは関数の必要に応じて縮小または拡大します。関数の完了時にコールスタックが空になると、JavaScriptはキュー内の次のメッセージに進みます。これはイベントループと呼ばれ「完了まで実行する」と表現されます。これは、各メッセージが完全に処理されてから次のメッセージが検討されるためです。しかし、JavaScriptの並行性モデルでは、イベントループは非ブロッキングとして記述されます。つまり、プログラムI/Oはイベントコールバック関数を用いて実行されます。つまり、例えばJavaScriptは、データベースクエリが情報を返すのを待っている間にマウスクリックを処理できます。[ 61 ]

注目すべきスタンドアロン ランタイムとしては、Node.jsDenoBunなどがあります。

特徴

以下の機能は、明示的に指定されない限り、すべてのECMAScript準拠実装に共通です。引用されている予約語の数はキーワードを含めて50~60個で、実装によって異なります。

命令形で構造化された

JavaScriptはC言語の構造化プログラミング構文の多くをサポートしています(例:文、ループ、文、ループなど)。部分的な例外として、スコープがあります。JavaScriptは元々、関数スコープ( )のみをサポートしていましたが、ECMAScript 2015ではキーワード と によってブロックスコープが追加されました。C言語と同様に、JavaScriptはを区別します。C言語との構文上の違いの一つは、セミコロンの自動挿入です。これにより、文の末尾となるセミコロンを省略できます。[ 62 ]ifwhileswitchdo whilevarletconst

弱い型付け

JavaScriptは弱い型付けであり、使用される操作に応じて特定の型が暗黙的にキャストされることを意味します。[ 63 ]

  • 二項+演算子は、両方のオペランドが数値でない限り、両方のオペランドを文字列に変換します。これは、加算演算子が連結演算子としても機能するためです。
  • 二項-演算子は常に両方のオペランドを数値に変換します
  • 単項演算子 ( +, -) はどちらも常にオペランドを数値に変換します。ただし、は常に( binary64 )+に変換されますが、 は( integer )を維持します[ 64 ]Number-BigInt

値は次のように文字列に変換される。[ 63 ]

  • 文字列はそのまま残されます
  • 数値は文字列表現に変換されます
  • 配列の要素は文字列に変換され、その後にコンマ(,)で結合されます。
  • 他のオブジェクトは、オブジェクトのコンストラクタの名前で[object Object]ある文字列に変換されます。Object

値を数値に変換するには、まず文字列にキャストし、次に文字列を数値にキャストします。これらの処理は、プロトタイプにそれぞれ文字列キャストと数値キャストの関数を定義toStringすることで変更できます。 valueOf

JavaScriptは、これらの変換の実装方法について、ルールの複雑さが矛盾と誤解される可能性があるとして批判を受けています。[ 65 ] [ 63 ]たとえば、文字列に数値を加算する場合、連結を実行する前に数値を文字列に変換しますが、文字列から数値を減算する場合、減算を実行する前に文字列を数値に変換します。

JavaScriptの型変換
左オペランド オペレーター 右オペランド 結果
[](空の配列) +[](空の配列) ""(空の文字列)
[](空の配列) +{}(空のオブジェクト) "[object Object]"(弦)
false(ブール値) +[](空の配列) "false"(弦)
"123"(弦) +1(番号) "1231"(弦)
"123"(弦) -1(番号) 122(番号)
"123"(弦) -"abc"(弦) NaN(番号)

よく言及されるのは、{} + []結果として0(数値) が生成されるという点です。これは誤解を招きます。(数値){}は空のオブジェクトではなく空のコードブロックとして解釈され、空の配列は残りの単項演算子によって数値に変換されます+。式が括弧 ( - ({} + [])- ) で囲まれている場合、中括弧は空のオブジェクトとして解釈され、式の結果は"[object Object]"期待どおりになります。[ 63 ]

動的

タイピング

JavaScriptは他のほとんどのスクリプト言語と同様に動的型付けされます型は式ではなくに関連付けられます。例えば、最初は数値にバインドされていた変数は、文字列に再割り当てされることがあります。[ 66 ] JavaScriptは、ダックタイピングを含む、オブジェクトの型をテストする様々な方法をサポートしています。[ 67 ]

実行時評価

JavaScript には、eval実行時に文字列として提供されたステートメントを実行できる関数が含まれています。

オブジェクト指向(プロトタイプベース)

JavaScript におけるプロトタイプ継承は、Douglas Crockfordによって次のように説明されています。

プロトタイプオブジェクトを作成し、それから…​​新しいインスタンスを作成します。JavaScriptではオブジェクトは可変なので、新しいインスタンスに新しいフィールドやメソッドを追加して拡張することができます。そして、それらはさらに新しいオブジェクトのプロトタイプとして機能します。多数の類似したオブジェクトを作成するためにクラスは必要ありません…オブジェクトはオブジェクトを継承します。これ以上にオブジェクト指向的なことがあるでしょうか?[ 68 ]

JavaScriptでは、オブジェクト連想配列であり、プロトタイプ(下記参照)が追加されています。各キーはオブジェクトのプロパティ名を表しますプロパティ名を指定する構文には、ドット記法(obj.x = 10)と角括弧記法(obj["x"] = 10)の2種類があります。プロパティは実行時に追加、再バインド、または削除できます。オブジェクトのほとんどのプロパティ(およびオブジェクトのプロトタイプ継承チェーンに属するすべてのプロパティ)は、ループを使用して列挙できますfor...in

プロトタイプ

JavaScriptは、他の多くのオブジェクト指向言語が継承クラスを使用するのに対し、プロトタイプを使用します。 [ 69 ]しかし、プロトタイプシステムを使用して、クラスベースの機能のほとんどをシミュレートすることは依然として可能です。[ 70 ]さらに、ECMAScriptバージョン6 (2015年6月リリース)では、 classextendssuperというキーワードが導入されました。これらは、より従来的なインターフェースを使用して、基盤となるプロトタイプ継承システムを抽象化する構文糖として機能します。コンストラクタはconstructorというメソッドを指定して宣言され、Javaと同様に、すべてのクラスは自動的に基本クラスObjectのサブクラスになります。

クラスPerson {コンストラクター( name ) { this . name = name ; } }クラスStudent はPersonを拡張します{コンストラクター( name id ) { super ( name ); this . id = id ; } }const bob = new Student ( "Robert " , 12345 ); console . log ( bob . name ); // Robert

基盤となるオブジェクト機構は依然としてプロトタイプに基づいていますが、新しい構文は他のオブジェクト指向言語に似ています。プライベート変数は、フィールド名の前に番号記号(#)を付けて宣言されます。ポリモーフィズムは直接サポートされていませんが、引数の数と型に応じて異なる関数を手動で呼び出すことでエミュレートできます。[ 71 ]

オブジェクトコンストラクタとしての関数

関数は、その典型的な役割に加えて、オブジェクトコンストラクタとしても機能します。関数呼び出しの前にnewを付けると、プロトタイプのインスタンスが作成され、コンストラクタからプロパティとメソッド(Objectプロトタイプのプロパティを含む)が継承されます。[ 72 ] ECMAScript 5 ではObject.createメソッドが提供されており、プロトタイプから自動的に継承することなく、明示的にインスタンスを作成できますObject(古い環境ではプロトタイプを に割り当てることができますnull)。[ 73 ]コンストラクタのprototypeプロパティは、新しいオブジェクトの内部プロトタイプに使用されるオブジェクトを決定します。コンストラクタとして使用される関数のプロトタイプを変更することで、新しいメソッドを追加できます。

// このコードは、前のスニペットfunction Person ( name ) { this . name = name ; }と完全に同等です。関数Student ( name , id ) { Person . call ( this , name ); this . id = id ; }var bob = new Student ( "Robert " , 12345 ); console . log ( bob . name ); // Robert

JavaScript の組み込みクラス( や など)にArrayObject、変更可能なプロトタイプがあります。しかし、組み込みオブジェクトを変更することは一般的に悪い習慣とされています。サードパーティのコードがこれらのオブジェクトのメソッドやプロパティを使用または継承する可能性があり、プロトタイプが変更されることを想定していない可能性があるためです。[ 74 ]

メソッドとしての関数

多くのオブジェクト指向言語とは異なり、JavaScriptでは関数定義とメソッド定義の区別はありません。むしろ、関数呼び出し時に区別が行われます。関数がオブジェクトのメソッドとして呼び出されると、その関数のローカルなthisキーワードは、その呼び出しの間、そのオブジェクトにバインドされます。

機能的

JavaScript関数は第一級関数であり、関数はオブジェクトとみなされます。[ 75 ]そのため、関数には.call()やなどのプロパティやメソッドがある場合があります.bind()[ 76 ]

語彙の閉鎖

ネストされた関数とは、別の関数内で定義された関数です。外側の関数が呼び出されるたびに作成されます。

さらに、各ネストされた関数はレキシカルクロージャを形成します。つまり、外側の関数のレキシカルスコープ(定数、ローカル変数、引数値を含む)は、外側の関数の実行が終了した後でも、内側の関数オブジェクトの内部状態の一部になります。[ 77 ]

匿名関数

JavaScript は匿名関数もサポートしています。

委任型

JavaScript は暗黙的および明示的な委任をサポートします。

役割としての機能(特性とミックスイン)

JavaScriptは、Traits [ 79 ] [ 80 ]Mixin [ 81 ]といった、 Role [ 78 ]パターンの様々な関数ベースの実装をネイティブにサポートしています。このような関数は、その本体内でキーワードにバインドされた少なくとも1つのメソッドによって追加の動作を定義します。Roleは、プロトタイプチェーンで共有されない追加の動作を必要とするオブジェクト に対して、明示的に委譲する必要があります。thisfunctioncallapply

オブジェクトの構成と継承

JavaScriptにおける明示的な関数ベースの委譲は合成をカバーしますが、暗黙的な委譲はプロトタイプチェーンを辿るたびに既に行われています。例えば、オブジェクトと関連している可能性があるものの、直接所有されていないメソッドを見つける場合などです。メソッドが見つかると、そのオブジェクトのコンテキスト内で呼び出されます。このように、 JavaScriptにおける継承は、コンストラクタ関数のプロトタイププロパティに結び付けられた委譲の自動化によってカバーされています。

その他

ゼロベースの番号付け

JavaScript はゼロインデックス言語です。

可変個引数関数

関数には、無制限の数のパラメータを渡すことができます。関数は、仮パラメータとローカルargumentsオブジェクトの両方を介して、これらのパラメータにアクセスできます。また、メソッドを使用することで、可変長引数関数を作成することもできますbind

配列とオブジェクトリテラル

多くのスクリプト言語と同様に、配列とオブジェクト(他の言語では連想配列)はそれぞれ簡潔なショートカット構文で作成できます。実際、これらのリテラルはJSONデータ形式の基礎となっています。

正規表現

JavaScriptはテキストの検索と操作のための正規表現をサポートしています。 [ 72 ]:139

約束

組み込みの Promise オブジェクトは、Promise を処理し、非同期アクションの最終結果にハンドラーを関連付ける機能を提供します。JavaScript にはコンビネータメソッドが用意されており、開発者は複数の JavaScript Promise を組み合わせ、さまざまなシナリオに基づいた操作を実行できます。導入されているメソッドは、Promise.race、Promise.all、Promise.allSettled、Promise.any です。

非同期/待機

async/await を使用すると、非同期の非ブロッキング関数を通常の同期関数と同様の構造にすることができます。非同期の非ブロッキングコードは、最小限のオーバーヘッドで、従来の同期のブロッキングコードと同様の構造で記述できます。

ベンダー固有の拡張機能

歴史的に、一部のJavaScript エンジンは次のような非標準機能をサポートしていました。

  • 配列の内包表記とジェネレータ式(Python のような)
  • 簡潔な関数式(function(args) expr; この実験的な構文は矢印関数より前からあった)
  • ECMAScript for XML (E4X) は、ECMAScript にネイティブ XML サポートを追加する拡張機能です (Firefox バージョン 21 以降ではサポートされていません[ 82 ] )

構文

JavaScriptの変数はvar[ 83 ] let[ 84 ]またはconst[ 85 ]キーワードを使用して定義できます。キーワードを使用せずに定義された変数は、グローバルスコープで定義されます。

アロー関数は、第6版(ECMAScript 2015 )で初めて導入されました。JavaScriptで関数を記述する際の構文を短縮します。アロー関数は匿名関数であるため、括弧で囲んで即時実行しない限り、作成後に呼び出すには変数への参照が必要です。

以下は JavaScript 構文の例です。

// 関数スコープの変数 `x` を宣言し、暗黙的に特別な値 `undefined` を割り当てます。値のない変数は自動的にundefined に設定されます。// var は一般的に悪い習慣と考えられており、let と const が推奨されます。var x ;// 変数は次のように手動で `undefined` に設定できます。let x2 = undefined ;// ブロックスコープの変数 `y` を宣言し、暗黙的に`undefined` に設定します。`let` キーワードは ECMAScript 2015 で導入されました。let y ;// ブロックスコープで再代入不可能な変数 `z` を宣言し、文字列リテラルに設定します。`const` キーワードも ECMAScript 2015 で導入され、明示的に代入する必要があります。// キーワード `const` は定数を意味するため、値が `constant` であるため、変数を再割り当てすることはできません。const z = "この値再割り当てできません!" ;// グローバルスコープの変数を宣言し、3 を割り当てます。これは通常、悪い習慣と考えられており、厳密モードがオンの場合は機能しません。t = 3 ;// `myNumber` という名前の変数を宣言し、数値リテラル (値`2`) を割り当てます。let myNumber = 2 ;// `myNumber` を再割り当てし、文字列リテラル (値 `"foo"`) に設定します。// JavaScript は動的型付け言語なので、これは有効です。myNumber = " foo" ;

上記の例のコメントはすべて 2 つのスラッシュで始まっていることに注意してください。

さらに多くの例については、Wikibooks の JavaScript 構文例のページをご覧ください。

安全

JavaScriptとDOMは、悪意のある作成者がWeb経由でクライアントコンピュータで実行するスクリプトを配信する危険性をはらんでいます。ブラウザの開発者は、2つの制限を設けることでこのリスクを最小限に抑えています。まず、スクリプトはサンドボックス内で実行されます。サンドボックス内では、ファイル作成などの汎用プログラミングタスクではなく、Web関連のアクションのみを実行できます。次に、スクリプトは同一オリジンポリシーによって制約されます。つまり、あるウェブサイトのスクリプトは、別のサイトに送信されたユーザー名、パスワード、Cookieなどの情報にアクセスできません。JavaScript関連のセキュリティバグの多くは、同一オリジンポリシーまたはサンドボックスのいずれかの違反によるものです。

一般的なJavaScriptのサブセットであるADsafe、Secure ECMAScript(SES)は、特に第三者が作成したコード(広告など)に対してより高いレベルのセキュリティを提供します。[ 86 ] [ 87 ] Closure Toolkitは、サードパーティのJavaScriptとHTMLを安全に埋め込み、分離するための別のプロジェクトです。[ 88 ]

コンテンツ セキュリティ ポリシーは、Web ページ上で信頼できるコードのみが実行されるようにするための主な方法です。

クロスサイトスクリプティング

JavaScript関連の一般的なセキュリティ問題の一つに、クロスサイトスクリプティング(XSS)があります。これは、同一オリジンポリシー違反です。XSS脆弱性は、攻撃者がオンラインバンキングなどの標的ウェブサイトのウェブページに悪意のあるスクリプトを組み込むことで発生します。この例のスクリプトは、被害者の権限でバンキングアプリケーションにアクセスでき、機密情報の漏洩や、被害者の許可なく送金が行われる可能性があります。XSS脆弱性に対する重要な解決策の一つは、HTMLサニタイズです。

一部のブラウザには、攻撃者が悪意のあるスクリプトを含むURLを提供するリフレクション型XSS攻撃に対する部分的な保護機能が搭載されています。しかし、これらのブラウザのユーザーであっても、悪意のあるコードがデータベースに保存されるなど、他のXSS攻撃に対しては脆弱です。XSSを完全に防ぐには、サーバー側のWebアプリケーションを適切に設計する必要があります。

XSS脆弱性はブラウザ作者の実装ミスによっても発生する可能性がある。[ 89 ]

クロスサイトリクエストフォージェリ

クロスサイト脆弱性のもう1つは、クロスサイトリクエストフォージェリ(CSRF)です。CSRFでは、攻撃者のサイト上のコードが被害者のブラウザを騙し、ユーザーが意図しない操作(銀行での送金など)をターゲットサイトで実行させます。ターゲットサイトがリクエスト認証にCookieのみに依存している場合、攻撃者のサイト上のコードから発信されたリクエストには、開始ユーザーの有効なログイン認証情報が含まれる可能性があります。一般的に、CSRFの解決策は、永続的な影響を与える可能性のあるリクエストを認証するために、Cookieだけでなく、隠しフォームフィールドにも認証値を要求することです。HTTPリファラーヘッダーをチェックすることも有効です。

「JavaScriptハイジャック」はCSRF攻撃の一種で、<script>攻撃者のサイト上のタグが被害者のサイト上のページを悪用し、JSONやJavaScriptなどの個人情報を返します。考えられる解決策としては、以下のようなものがあります。

  • 個人情報を返すすべての応答に対して、POSTおよびGETパラメータで認証トークンを要求します。

クライアントへの誤った信頼

クライアントサーバーアプリケーションの開発者は、信頼できないクライアントが攻撃者の制御下にある可能性があることを認識する必要があります。アプリケーションの開発者は、JavaScriptコードが意図したとおりに(あるいは全く)実行されると想定すべきではありません。コードに埋め込まれた秘密は、攻撃者によって抽出される可能性があるからです。その影響としては、以下のようなものが挙げられます。

  • ウェブサイト作成者は、JavaScriptの動作を完全に隠蔽することはできません。なぜなら、生のソースコードをクライアントに送信する必要があるからです。コードは難読化できますが、難読化はリバースエンジニアリングされる可能性があります。
  • JavaScript によるフォーム検証は、ユーザーの利便性向上にのみ寄与し、セキュリティ向上には寄与しません。サイトがユーザーが利用規約に同意したかどうかを確認したり、数字のみを入力するべきフィールドから無効な文字を除外したりする場合には、クライアント側だけでなくサーバー側でも検証を行う必要があります。
  • スクリプトは選択的に無効にすることができるため、画像を右クリックして保存するなどの操作をJavaScriptに依存して防ぐことはできません。[ 90 ]
  • パスワードなどの機密情報をJavaScriptに埋め込むことは、攻撃者によって抽出される可能性があるため、非常に悪い習慣と考えられています。[ 91 ]
  • プロトタイプ汚染は、攻撃者がオブジェクトのプロトタイプ内の任意のプロパティを上書きできる実行時の脆弱性です。

開発者への誤った信頼

npmやBowerなどのパッケージ管理システムは、JavaScript開発者に人気があります。これらのシステムを使用すると、開発者は自身のプログラムが他の開発者のプログラムライブラリに依存しているかどうかを容易に管理できます。開発者はライブラリのメンテナーがライブラリを安全かつ最新の状態に保ってくれると信頼していますが、必ずしもそうとは限りません。この盲目的な信頼が、脆弱性を生み出しています。依存しているライブラリが新しいリリースをリリースすると、そのライブラリを利用するすべてのプログラムにバグや脆弱性が現れることがあります。逆に、ライブラリがパッチ適用されずに、既知の脆弱性がそのまま放置されることもあります。13万3000のウェブサイトをサンプルとして調査した研究では、ウェブサイトの37%に少なくとも1つの既知の脆弱性を持つライブラリが含まれていることが判明しました。[ 92 ]「ALEXAでは、各ウェブサイトで使用されている最も古いライブラリバージョンとそのライブラリの最新バージョンとの間の平均遅延は1,177日であり、現在も使用されているライブラリの中には、開発が何年も前に終了しているものもあります。」[ 92 ]もう一つの可能​​性は、ライブラリのメンテナーがライブラリを完全に削除することです。これは2016年3月にAzer Koçulu氏がnpmからリポジトリを削除した際に発生しました。これにより、彼のライブラリに依存していた数万ものプログラムやウェブサイトが機能しなくなりました。[ 93 ] [ 94 ]

ブラウザとプラグインのコーディングエラー

JavaScriptは幅広いブラウザ機能へのインターフェースを提供しますが、その一部にはバッファオーバーフローなどの脆弱性が存在する可能性があります。これらの脆弱性を利用することで、攻撃者はユーザーのシステム上で任意のコードを実行するスクリプトを作成できる可能性があります。このコードは、他のJavaScriptアプリケーションに限定されるものではありません。例えば、バッファオーバーランの脆弱性を悪用することで、攻撃者はスーパーユーザー権限でオペレーティングシステムのAPIにアクセスできるようになります。

これらの欠陥はFirefox、[ 95 ]、 Internet Explorer [ 96 ]、Safari [ 97 ]などの主要なブラウザに影響を与えています。

ビデオプレーヤー、Adobe Flash、Microsoft Internet Explorerでデフォルトで有効になっているさまざまなActiveXコントロールなどのプラグインにも、JavaScriptを介して悪用される可能性のある欠陥がある可能性があります(このような欠陥は過去に悪用されたことがあります)。[ 98 ] [ 99 ]

Windows Vistaでは、マイクロソフトはInternet Explorerのプロセスを制限された権限で実行することで、バッファオーバーフローなどのバグのリスクを抑制しようとしました。[ 100 ] Google Chromeも同様にページレンダラーを独自の「サンドボックス」内に制限しています。

サンドボックス実装エラー

ウェブブラウザは、サンドボックス外でJavaScriptを実行することができ、例えばファイルの作成や削除に必要な権限を持っています。しかし、このような権限はウェブ上のコードには付与されるべきではありません。

ウェブからJavaScriptに誤って権限を与えることが、Internet Explorer [ 101 ]とFirefox [ 102 ]の両方の脆弱性の一因となっています。Windows XP Service Pack 2では、MicrosoftはInternet ExplorerでのJScriptの権限を降格しました。[ 103 ]

Microsoft Windowsでは、コンピュータのハードドライブ上のJavaScriptソースファイルを、サンドボックス化されていない汎用プログラムとして起動できます(Windows Script Hostを参照)。そのため、JavaScript(VBScriptなど)は理論的にはトロイの木馬の攻撃ベクトルとなり得ますが、実際にはJavaScriptトロイの木馬は稀です。[ 104 ]

ハードウェアの脆弱性

2015年には、セキュリティ研究者による論文で、 JavaScriptベースのRowhammer攻撃の概念実証実装が説明されました。 [ 105 ] [ 106 ] [ 107 ] [ 108 ]

2017年には、ブラウザを介したJavaScriptベースの攻撃がASLRを回避できることが実証されました。これは「ASLR⊕Cache」またはAnCと呼ばれます。[ 109 ] [ 110 ]

2018年に、Intelや他のプロセッサの投機的実行に対するSpectre攻撃を発表した論文にはJavaScriptの実装が含まれていました。[ 111 ]

開発ツール

重要なツールは言語とともに進化してきました。

ジャワ

JavaScriptはJavaと直接関連しているという誤解がよくあります。確かにどちらもC言語に似た構文を持っています(C言語は両者の最も直接的な共通祖先言語です)。また、どちらも一般的にサンドボックス化されており、JavaScriptはJavaの構文と標準ライブラリを念頭に置いて設計されています。特に、JavaのすべてのキーワードはオリジナルのJavaScriptでは予約語であり、JavaScriptの標準ライブラリはJavaの命名規則に従っており、JavaScriptのMathオブジェクトDateはJava 1.0のクラスに基づいています。[ 114 ]

どちらの言語も 1995 年に初めて登場しましたが、Java はSun Microsystems のJames Gosling氏によって開発され、JavaScript はNetscape Communications の Brendan Eich氏によって開発されました。

両言語の類似点よりも相違点の方が顕著です。Javaは静的型付けですが、JavaScriptは動的型付けです。Javaはコンパイルされたバイトコードから読み込まれますが、JavaScriptは人間が読めるソースコードとして読み込まれます。Javaのオブジェクトはクラスベースですが、JavaScriptはプロトタイプベースです。最後に、JavaはJava 8まで関数型プログラミングをサポートしていませんでしたが、JavaScriptはSchemeの影響を受け、当初から関数型プログラミングをサポートしています。

JSON

JSONはJavaScriptから派生したデータ形式であり、JavaScript Object Notation(JavaScriptオブジェクト表記)という名前が付けられています。JSONは広く利用されており、多くのプログラミング言語でサポートされています。

トランスパイラ

多くのウェブサイトはJavaScriptを多用しているため、他の言語で書かれたコードを変換して開発プロセスを支援するトランスパイラが作成されています。 [ 36 ]

TypeScriptCoffeeScript は、JavaScript にトランスパイルされる 2 つの有名な言語です。

Webアセンブリ

WebAssemblyは、JavaScript、特にウェブページスクリプトのパフォーマンスが重要な部分を補完するために設計されたバイトコード形式を持つ新しい言語です。主要なJavaScriptエンジンはすべてWebAssemblyをサポートしており、[ 115 ]通常のJavaScriptコードと 同じサンドボックス内で実行されます。

asm.jsはWebAssemblyの前身となったJavaScriptのサブセットです。[ 116 ]

注記

参考文献

  1. ^ a b「NetscapeとSun、企業ネットワークとインターネット向けのオープンでクロスプラットフォームなオブジェクトスクリプト言語JavaScriptを発表」(プレスリリース)。1995年12月4日。2007年9月16日時点のオリジナルよりアーカイブ。
  2. ^ 「ECMAScript® 2024 言語仕様」 . 2024年6月. 2024年8月30日閲覧
  3. ^ 「ECMAScript® 2025 言語仕様」 . 2024年3月27日. 2024年4月17日閲覧
  4. ^ “nodejs/node-eps” . GitHub . 2020年8月29日時点のオリジナルよりアーカイブ2018年7月5日閲覧。
  5. ^ a bセイベル、ピーター(2009年9月16日)『Coders at Work: Reflections on the Craft of Programming』Apress. ISBN 978-1-4302-1948-4. 2020年12月24日時点のオリジナルよりアーカイブ。2018年12月25日閲覧。Eich : Netscapeが当面懸念したのは、Javaのように見えなければならないということでした。
  6. ^ a b c d e f「第4章 JavaScriptの誕生」speakingjs.com2020年2月27日時点のオリジナルよりアーカイブ2017年11月21日閲覧
  7. ^ “人気 – ブレンダン・アイヒ” .
  8. ^ 「Brendan Eich: JavaScript入門、JSConf 2010」。YouTube 2013年1月20日。22分。2020年8月29日時点のオリジナルよりアーカイブ2019年11月25日閲覧。Eich :「function」は8文字で、AWKの影響を受けています。
  9. ^ Eich, Brendan (1998). 「序文」. Goodman, Danny (編). JavaScript Bible (第3版). John Wiley & Sons . ISBN 0-7645-3188-3. LCCN  97078208 . OCLC  38888873 . OL  712205M .
  10. ^ a b「ウェブサイトにおけるクライアント側プログラミング言語としてのJavaScriptの使用統計」 W3Techs 20242月27日閲覧
  11. ^ 「Stack Overflow開発者アンケート2025」 . Stack Overflow . 2025年10月10日閲覧
  12. ^ “ECMAScript 2020 言語仕様” . 2020年5月8日時点のオリジナルよりアーカイブ2020年5月8日閲覧。
  13. ^ Enzer, Larry (2018年8月31日). 「Webブラウザの進化」 . Monmouth Web Developers . 2018年8月31日時点のオリジナルよりアーカイブ2018年8月31日閲覧。
  14. ^ a b c Fin JS (2016年6月17日)、「Brendan Eich – BraveのCEO」YouTube 、 2018年2月7日閲覧。
  15. ^「Netscape Communications Corp.」ブラウザ拡張機能。ブリタニカ百科事典 2006 Ultimate Reference Suite DVD
  16. ^ 「TechVision: ネットのイノベーター: ブレンダン・アイクとJavaScript」 。2008年2月8日時点のオリジナルよりアーカイブ
  17. ^ a b Han, Sheon (2024年3月4日). 「JavaScriptが世界を動かす—文字通りかもしれない」 . Wired . 2024年8月21日閲覧
  18. ^ a b「第5章 標準化:ECMAScript」 . speakingjs.com . 2021年11月1日時点のオリジナルよりアーカイブ。 2021年11月1日閲覧
  19. ^ a b Champeon, Steve (2001年4月6日). 「JavaScript, How Did We Get Here?」oreilly.com . 2016年7月19日時点のオリジナルよりアーカイブ。 2016年7月16日閲覧
  20. ^ “Microsoft Internet Explorer 3.0 Beta Now Available” . microsoft.com . Microsoft. 1996年5月29日. 2020年11月24日時点のオリジナルよりアーカイブ。 2016年7月16日閲覧
  21. ^ McCracken, Harry (2010年9月16日). 「「Internet Explorerで閲覧することをお勧めします」の不本意な復活」technologizer.com . 2018年623日時点のオリジナルよりアーカイブ。2016年7月16日閲覧。
  22. ^ Baker, Loren (2004年11月24日). 「Mozilla Firefoxインターネットブラウザの市場シェアが7.4%に増加」 . Search Engine Journal . 2021年5月7日時点のオリジナルよりアーカイブ。 2021年5月8日閲覧
  23. ^ Weber, Tim (2005年5月9日). 「ソフトウェア大手マイクロソフトへの攻撃」 . BBCニュース. 2017年9月25日時点のオリジナルよりアーカイブ
  24. ^ 「大規模ブラウザ比較テスト:Internet Explorer vs. Firefox、Opera、Safari、Chrome」。PCゲームハードウェア。Computec Media AG。2009年7月3日。 2012年5月2日時点のオリジナルよりアーカイブ。 2010年6月28日閲覧
  25. ^ Purdy, Kevin (2009年6月11日). 「Lifehacker Speed Tests: Safari 4, Chrome 2」 . Lifehacker . 2021年4月14日時点のオリジナルよりアーカイブ2021年5月8日閲覧。
  26. ^ 「TraceMonkey: JavaScript Lightspeed、Brendan Eichのブログ」2015年12月4日時点のオリジナルよりアーカイブ2020年7月22日閲覧。
  27. ^ 「Mozilla はこう問いかける。『我々はもう速いのか?』」 . Wired . 2018年6月22日時点のオリジナルよりアーカイブ。 2019年1月18日閲覧
  28. ^ 「ECMAScript 6: 新機能:概要と比較」 es6-features.org . 2018年3月18日時点のオリジナルよりアーカイブ2018年3月19日閲覧。
  29. ^ Professional Node.js: JavaScript ベースのスケーラブルなソフトウェアの構築Archived 2017-03-24 at the Wayback Machine、John Wiley & Sons、2012年10月1日
  30. ^ Sams Teach Yourself Node.js in 24 Hours Archived 2017-03-23 at the Wayback Machine、Sams Publishing、2012年9月5日
  31. ^ Lawton, George (2018年7月19日). 「npmとNodeの成功の裏に隠された秘密の歴史」 . TheServerSide . 2021年8月2日時点のオリジナルよりアーカイブ。 2021年8月2日閲覧
  32. ^ Brown, Paul (2017年1月13日). 「State of the Union: npm」 . Linux.com . 2021年8月2日時点のオリジナルよりアーカイブ。 2021年8月2日閲覧
  33. ^ a b c Branscombe, Mary (2016年5月4日). 「JavaScript Standard Moves to Yearly Release Schedule; Here is What's New for ES16」 . The New Stack . 2021年1月16日時点のオリジナルよりアーカイブ。 2021年1月15日閲覧
  34. ^ 「TC39プロセス」 tc39.es. Ecma International. 2021年2月7日時点のオリジナルよりアーカイブ。 2021年1月15日閲覧
  35. ^ “ECMAScript proposals” . TC39. 2020年12月4日時点のオリジナルよりアーカイブ2021年1月15日閲覧。
  36. ^ a b Ashkenas, Jeremy . 「JSにコンパイルできる言語のリスト」 . GitHub . 2020年1月31日時点のオリジナルよりアーカイブ。 2020年2月6日閲覧
  37. ^ 「US Trademark Serial No. 75026640」 . uspto.gov .米国特許商標庁. 1997年5月6日. 2021年7月13日時点のオリジナルよりアーカイブ。 2021年5月8日閲覧
  38. ^ 「法的通知」 . oracle.com . Oracle Corporation . 2021年6月5日時点のオリジナルよりアーカイブ。 2021年5月8日閲覧
  39. ^ 「オラクル、74億ドルでサンを買収へ」エコノミック・タイムズ、2009年4月21日。
  40. ^ Claburn, Thomas (2024年9月17日). 「Oracle、JavaScriptの商標を放棄するよう再び要請」 . The Register . 2025年2月2日閲覧
  41. ^ Krill, Paul (2024年9月20日). 「JavaScriptコミュニティがOracleのJavaScript商標に異議を唱えるInfoWorld .
  42. ^ a b c「ウェブサイト向けJavaScriptライブラリの使用統計」 W3Techs 20214月9日閲覧
  43. ^ 「BootstrapでjQueryを使用する」 . clouddevs.com . 2019年6月10日. 2024年3月17日閲覧
  44. ^ “Vanilla JS” . vanilla-js.com . 2020年6月16日. 2020年6月16日時点のオリジナルよりアーカイブ。 2020年6月17日閲覧
  45. ^ 「サーバーサイドJavaScriptガイド」 . oracle.com . Oracle Corporation . 1998年12月11日. 2021年3月11日時点のオリジナルよりアーカイブ。 2021年5月8日閲覧
  46. ^ Clinick, Andrew (2000年7月14日). 「JScript .NETの紹介」 . Microsoft Developer Network . Microsoft. 2017年11月10日時点のオリジナルよりアーカイブ2018年4月10日閲覧。1996年のJScriptバージョン1.0の導入以来、サーバー上でのJScriptの利用は着実に増加しており、特にActive Server Pages (ASP)で顕著です。
  47. ^ a bマヘモフ、マイケル (2009年12月17日). 「サーバーサイドJavaScript、復活で復活」 . readwrite.com . 2016年6月17日時点のオリジナルよりアーカイブ。 2016年7月16日閲覧
  48. ^ 「JavaScript for Acrobat」 adobe.com 2009年8月7日。2009年8月7日時点のオリジナルよりアーカイブ。 2009年8月18日閲覧
  49. ^ treitter (2013年2月2日). 「GNOME用アプリを開発するにはどうすればいいですか?」という質問への回答" . livejournal.com . 2013年2月11日時点のオリジナルよりアーカイブ。2013年2月7日閲覧。
  50. ^ Ponge, Julien (2018年4月19日). 「Oracle Nashorn: JVM向け次世代JavaScriptエンジン」 . oracle.com . Oracle Corporation . 2025年2月17日閲覧
  51. ^ 「NashornからGraalJSへの移行ガイド」 . graalvm.org . 2025年2月17日閲覧
  52. ^ "GraalJS" . GraalVM . 2025年2月17日閲覧
  53. ^ 「Java相互運用性」 . oracle.com . Oracle . 2025年2月17日閲覧
  54. ^ 「Tessel 2…Node.JSのすべてのライブラリを活用して、Tesselで数分で便利なデバイスを作成」 . tessel.io . 2021年5月26日時点のオリジナルよりアーカイブ2021年5月8日閲覧。
  55. ^ “Node.js Raspberry Pi GPIO Introduction” . w3schools.com . 2021年8月13日時点のオリジナルよりアーカイブ2020年5月3日閲覧。
  56. ^ 「Espruino – マイクロコントローラー向けJavaScript」espruino.com . 2020年5月1日時点のオリジナルよりアーカイブ2020年5月3日閲覧
  57. ^ Looper, Jen (2015年9月21日). 「初心者向けJavaScriptエンジンガイド」 . Telerik Developer Network. 2018年12月8日時点のオリジナルよりアーカイブ。 2018年12月8日閲覧
  58. ^ 「Blinkの仕組み」 。 2024年3月12日閲覧
  59. ^ a b「Documentation · V8」 . Google . 2024年3月3日閲覧
  60. ^ Nelaturu, Keerthi (2020年9月). 「WebAssembly: What's the big deal?」 . medium.com . 2024年3月3日閲覧
  61. ^ 「並行性モデルとイベントループ」。Mozilla Developer Network2015年9月5日時点のオリジナルよりアーカイブ2015年8月28日閲覧。
  62. ^ Flanagan, David (2006年8月17日). JavaScript: The Definitive Guide . O'Reilly Media, Inc. p. 16. ISBN 978-0-596-55447-7. 2020年8月1日時点のオリジナルよりアーカイブ。2019年3月29日閲覧。
  63. ^ a b c d Korolev, Mikhail (2019年3月1日). 「インターネット上の1枚の画像におけるJavaScriptの不具合」 . The DEV Community . 2019年10月28日時点のオリジナルよりアーカイブ。 2019年10月28日閲覧
  64. ^ "Proposal-bigint/ADVANCED.md at master · tc39/Proposal-bigint" . GitHub .
  65. ^ Bernhardt, Gary (2012). 「Wat」 . Destroy All Software . 2019年10月28日時点のオリジナルよりアーカイブ2019年10月28日閲覧。
  66. ^ 「JavaScript のデータ型とデータ構造」 MDN 2017年2月16日. 2017年3月14日時点のオリジナルよりアーカイブ。 2017年2月24日閲覧
  67. ^フラナガン 2006、176–178頁。
  68. ^ Crockford, Douglas. 「JavaScriptにおけるプロトタイプ継承」 . 2013年8月13日時点のオリジナルよりアーカイブ2013年8月20日閲覧。
  69. ^ 「継承とプロトタイプチェーン」。Mozilla Developer Network2013年4月25日時点のオリジナルよりアーカイブ2013年4月6日閲覧。
  70. ^ハーマン、デイビッド (2013). 『効果的なJavaScript』. アディソン・ウェスレー. p. 83. ISBN 978-0-321-81218-6
  71. ^ガンジー、ラジュ (2019). JavaScript 次へ。ニューヨーク市:Apress Media。159 ~ 171ページ 。ISBN 978-1-4842-5394-6
  72. ^ a b Haverbeke、Marijn (2024 年 9 月)。Eloquent JavaScript (PDF) (第 4 版)。サンフランシスコ:スターチプレスはありません97-98ページ ISBN 978-1-71850-411-02025年3月12日時点のオリジナルよりアーカイブ(PDF)
  73. ^ Katz, Yehuda (2011年8月12日). 「JavaScriptにおける「プロトタイプ」を理解する」 . 2013年4月5日時点のオリジナルよりアーカイブ2013年4月6日閲覧。
  74. ^ハーマン、デイビッド (2013). 『効果的なJavaScript』. アディソン・ウェスレー. pp.  125– 127. ISBN 978-0-321-81218-6
  75. ^ 「Function – JavaScript」 . MDN Web Docs . 2021年10月30日閲覧
  76. ^ 「関数オブジェクトのプロパティ」 . Es5.github.com. 2013年1月28日時点のオリジナルよりアーカイブ2013年5月26日閲覧。
  77. ^フラナガン 2006、141ページ。
  78. ^特性やミックスインのようなロール指向プログラミングのアプローチを一般化する JavaScript の多くの才能、Wayback Machineに 2017 年 10 月 5 日にアーカイブ、Peterseliger.blogspot.de、2014 年 4 月 11 日。
  79. ^ JavaScript の Traits、Wayback Machineで 2010 年 7 月 24 日にアーカイブ
  80. ^ “Home | CocktailJS” . Cocktailjs.github.io . 2017年2月4日時点のオリジナルよりアーカイブ2017年2月24日閲覧。
  81. ^ Croll, Angus (2011年5月31日). 「JavaScript Mixinsの新たな見方」 . JavaScript, JavaScript… . 2020年4月15日時点のオリジナルよりアーカイブ。
  82. ^ 「E4X – 廃止コンテンツのアーカイブ」 Mozilla Developer Network、Mozilla Foundation、2014年2月14日。2014年7月24日時点のオリジナルよりアーカイブ。 2014年7月13日閲覧
  83. ^ "var – JavaScript" . Mozilla Developer Network . 2012年12月23日時点のオリジナルよりアーカイブ。 2012年12月22日閲覧
  84. ^ "let" . MDN Webドキュメント. Mozilla. 2019年5月28日時点のオリジナルよりアーカイブ2018年6月27日閲覧。
  85. ^ "const" . MDN Webドキュメント. Mozilla. 2018年6月28日時点のオリジナルよりアーカイブ2018年6月27日閲覧。
  86. ^ 「広告におけるJavaScriptの安全性確保」 ADsafe. 2021年7月6日時点のオリジナルよりアーカイブ2021年5月8日閲覧。
  87. ^ “Secure ECMA Script (SES)” . 2013年5月15日時点のオリジナルよりアーカイブ2013年5月26日閲覧。
  88. ^ “Google Caja Project” . Google . 2021年1月22日時点のオリジナルよりアーカイブ2021年7月9日閲覧。
  89. ^ 「Mozilla クロスサイトスクリプティング脆弱性が報告され、修正されました – MozillaZine Talkback」Mozillazine.org2011年7月21日時点のオリジナルよりアーカイブ2017年2月24日閲覧
  90. ^ Kottelin, Thor (2008年6月17日). 「右クリックの「保護」?もう忘れて」 . blog.anta.net . 2011年8月9日時点のオリジナルよりアーカイブ2022年7月28日閲覧。
  91. ^ Rehorik, Jan (2016年11月29日). 「JavaScriptに機密データを入れてはいけない理由」 . ServiceObjects Blog . ServiceObjects. 2019年6月3日時点のオリジナルよりアーカイブ。 2019年6月3日閲覧
  92. ^ a bラウインガー、トビアス;チャバネ、アブデルベリ。アルシャド、サジャド。ロバートソン、ウィリアム。ウィルソン、クリスト。 Kirda、Engin (2016 年 12 月 21 日)、「Thou Shalt Not depend on Me: Analyzing the Use of Outdated JavaScript Libraries on the Web」(PDF)ノースイースタン大学arXiv : 1811.00918doi : 10.14722/ndss.2017.23414ISBN 978-1-891562-46-4, S2CID  17885720 , 2017年3月29日時点のオリジナル(PDF)からアーカイブ、 2022年7月28日閲覧{{citation}}: CS1 maint: ISBNによる作業パラメータ(リンク
  93. ^コリンズ、キース (2016年3月27日). 「あるプログラマーが小さなコードを削除してインターネットを破壊した方法」 . Quartz . 2017年2月22日時点のオリジナルよりアーカイブ。 2017年2月22日閲覧
  94. ^ SC Magazine UK、開発者の11行の削除されたコードが「インターネットを壊す」 2017年2月23日アーカイブ、 Wayback Machine
  95. ^ Mozilla Corporation、 crypto.signText() のバッファオーバーフロー、 2014年6月4日アーカイブ、 Wayback Machine
  96. ^ Festa, Paul (1998年8月19日). 「IEのバッファオーバーフローバグ」 . CNET . 2002年12月25日時点のオリジナルよりアーカイブ
  97. ^ SecurityTracker.com、 Apple SafariのJavaScriptバッファオーバーフローによりリモートユーザーが任意のコードを実行可能、HTTPリダイレクトバグによりリモートユーザーがファイルにアクセスできる、Wayback Machineで2010年2月18日にアーカイブ
  98. ^ SecurityFocus、 Microsoft WebViewFolderIcon ActiveX コントロールのバッファオーバーフロー脆弱性、Wayback Machineに 2011-10-11アーカイブ
  99. ^ Fusion Authority、 Macromedia Flash ActiveX バッファオーバーフロー 、 2011年8月13日アーカイブ、 Wayback Machine
  100. ^ 「Vista IE7の保護モード - IEBlog」。Blogs.msdn.com2006年2月9日。2010年1月23日時点のオリジナルよりアーカイブ2017年2月24日閲覧。
  101. ^ US CERT、脆弱性ノート VU#713878: Microsoft Internet Explorer はリダイレクトされたフレームのソースを適切に検証しない 2009年10月30日アーカイブ、 Wayback Machine
  102. ^ Mozilla Foundation、 Mozilla Foundation セキュリティアドバイザリ 2005–41: DOM プロパティのオーバーライドによる権限昇格Archived 2014-06-04 at the Wayback Machine
  103. ^ Andersen, Starr (2004年8月9日). 「パート5:強化されたブラウジングセキュリティ」 . TechNet . Microsoft Docs . Windows XP Service Pack 2 における機能の変更点. 2021年10月20日閲覧.
  104. ^まれなJavaScriptトロイの木馬の例としては、Symantec CorporationのJS.Seeker.K( 2011年9月13日アーカイブ、 Wayback Machine)を参照。
  105. ^ Gruss, Daniel; Maurice, Clémentine; Mangard, Stefan (2015年7月24日). 「Rowhammer.js: JavaScriptにおけるリモートソフトウェア誘導フォールト攻撃」. arXiv : 1507.06955 [ cs.CR ].
  106. ^ Jean-Pharuns, Alix (2015年7月30日). 「Rowhammer.jsは私が今まで見た中で最も独創的なハックだ」 .マザーボード. Vice . 2018年1月27日時点のオリジナルよりアーカイブ。 2018年1月26日閲覧
  107. ^ Goodin, Dan (2015年8月4日). 「DRAMの『ビットフリッピング』エクスプロイトでPCを攻撃:JavaScriptを追加するだけ」 Ars Technica . 2018年1月27日時点のオリジナルよりアーカイブ。 2018年1月26日閲覧
  108. ^ Auerbach, David (2015年7月28日). 「Rowhammer セキュリティエクスプロイト:新たなセキュリティ攻撃が真に恐ろしい理由」 . slate.com . 2015年7月30日時点のオリジナルよりアーカイブ2015年7月29日閲覧。
  109. ^ AnC 2017年3月16日アーカイブWayback Machine VUSec、2017
  110. ^新しいASLR破壊JavaScriptは、ドライブバイエクスプロイトをより厄介なものにしようとしている。 2017年3月16日にWayback Machineアーカイブ。Ars Technica、2017年
  111. ^ Spectre Attack Archived 2018-01-03 at the Wayback Machine Spectre Attack
  112. ^ "Benchmark.js" . benchmarkjs.com . 2016年12月19日時点のオリジナルよりアーカイブ2016年11月6日閲覧。
  113. ^ JSBEN.CH. 「JSBEN.CH Performance Benchmarking Playground for JavaScript」 . jsben.ch . 2021年2月27日時点のオリジナルよりアーカイブ。 2021年8月13日閲覧
  114. ^ Eich, Brendan (2008年4月3日). 「Popularity」 . 2011年7月3日時点のオリジナルよりアーカイブ2012年1月19日閲覧。
  115. ^ 「EdgeブラウザがWebAssemblyを「オン」に切り替え -- Visual Studio Magazine」。Visual Studio Magazine2018年2月10日時点のオリジナルよりアーカイブ。 2018年2月9日閲覧
  116. ^ 「よくある質問」 . asm.js. 2014年6月4日時点のオリジナルよりアーカイブ2014年4月13日閲覧。

さらに読む