このページはECMAScript® 2020 Language Specification18 The Global Object章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。

グローバルオブジェクトは、次の特徴を持っています。

  • コントロールが実行コンテキストトに入る前に作成されます。
  • [[Construct]]内部メソッドがありません。そのため、new演算子のコンストラクターとして使用することはできません。
  • [[Call]]内部メソッドがありません。 そのため、関数として呼び出すことができません。
  • [[Prototype]]内部スロットがあり、その値は実装に依存します。
  • この仕様で定義されているプロパティの他に、ホストで定義されたプロパティを持つ場合があります。 これには、値がグローバルオブジェクト自体であるプロパティが含まれる場合があります。

18.1 グローバルオブジェクトの値プロパティ(Value Properties of the Global Object)

18.1.1 globalThis

レルムレコードrealm内のグローバルオブジェクト "globalThis" プロパティの初期値はrealm.[[GlobalEnv]]のEnvironmentRecordの[[GlobalThisValue]]です。

このプロパティの属性は{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:true}です。

18.1.2 Infinity

Infinityの値は+∞です(6.1.6.1を参照)。 このプロパティの属性は{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}です。

18.1.3 NaN

NaNの値はNaNです(6.1.6.1を参照)。 このプロパティの属性は{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}です。

18.1.4 undefined

undefinedの値はundefinedです(6.1.1を参照)。 このプロパティの属性は{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}です。

18.2 グローバルオブジェクトの関数プロパティ(Function Properties of the Global Object)

18.2.1 eval ( x )

eval関数は%eval%組み込みオブジェクトです。 引数xを指定してeval関数を呼び出すと、次の手順が実行されます。

  1. Assert: 実行コンテキストスタック は2つ以上の要素がある
  2. 実行コンテキストスタック の 上から2番目の要素を callerContext とする
  3. callerContextレルムcallerRealm とする
  4. ? PerformEval(x, callerRealm, false, false) を返す

18.2.1.1 ランタイムセマンティクス(Runtime Semantics): PerformEval ( x, callerRealm, strictCaller, direct )

引数x, callerRealm, strictCaller, directを指定した抽象操作PerformEvalは、次の手順を実行します。

  1. Assert: directfalse なら、 strictCallerfalse
  2. Type(x) が String型 でないなら、 x を返す
  3. 現在のレルムレコードevalRealm とする
  4. ? HostEnsureCanCompileStrings(callerRealm, evalRealm) を実行する
  5. ! GetThisEnvironment() を thisEnvRec とする
  6. thisEnvRec関数環境レコード なら、
    1. thisEnvRec.[[FunctionObject]] を F とする
    2. trueinFunction とする
    3. thisEnvRec. HasSuperBinding() を inMethod とする
    4. F.[[ConstructorKind]] が derived なら、 trueinDerivedConstructor とする。異なるなら、falseinDerivedConstructor とする
  7. 6. と異なるなら、
    1. falseinFunction とする
    2. falseinMethod とする
    3. falseinDerivedConstructor とする
  8. 次のサブステップを実装に依存する順序で実行する。解析とエラー検出をインターリーブする可能性があります。
    1. Scriptゴールシンボルとし、! UTF16DecodeString(x) の解析結果のECMAScriptコードをscript とする。解析が失敗した場合は、SyntaxError例外をスローする。 早期エラーが検出された場合は、SyntaxError例外をスローする(ただし、16章も参照)。
    2. script Contains ScriptBodyfalse なら、 undefined を返す
    3. scriptScriptBodybody とする
    4. inFunctionfalsebody Contains NewTarget なら SyntaxError例外をスローする
    5. inMethodfalsebody Contains SuperProperty なら、 SyntaxError例外をスローする
    6. inDerivedConstructorfalsebody Contains SuperCall なら、 SyntaxError例外をスローする
  9. strictCallertrue なら、 truestrictEval とする
  10. 9. と異なるなら、scriptIsStrictstrictEval とする
  11. 実行中の実行コンテキストrunningContext とする
  12. NOTE: runningContextdirecttrue なら、ダイレクトevalを実行した実行コンテキストfalse なら、 eval関数の呼び出しの実行コンテキスト
  13. directtrue なら、
    1. NewDeclarativeEnvironment(runningContextLexicalEnvironmentコンポーネント) を lexEnv とする
    2. runningContextVariableEnvironmentコンポーネントvarEnv とする
  14. 13. と異なるなら、
    1. NewDeclarativeEnvironment(evalRealm.[[GlobalEnv]]) を lexEnv とする
    2. evalRealm.[[GlobalEnv]] を varEnv とする
  15. strictEvaltrue なら、 lexEnvvarEnv にセットする
  16. runningContext が suspend していないなら、 runningContext を suspend する
  17. 新規 ECMAScriptコード実行コンテキストevalContext とする
  18. nullevalContextFunctionコンポーネント にセットする
  19. evalRealmevalContextRealmコンポーネント にセットする
  20. runningContextScriptOrModuleコンポーネントevalContextScriptOrModuleコンポーネント にセットする
  21. varEnvevalContextVariableEnvironmentコンポーネント にセットする
  22. lexEnvevalContextLexicalEnvironmentコンポーネント にセットする
  23. evalContext実行コンテキストスタック にプッシュする。evalContext実行中の実行コンテキスト になる
  24. EvalDeclarationInstantiation(body, varEnv, lexEnv, strictEval) を result とする
  25. result.[[Type]] が normal なら、
    1. body の評価結果を result にセットする
  26. result.[[Type]] が normalresult.[[Value]] が empty なら、
    1. NormalCompletion(undefined) を result にセットする
  27. evalContextSuspend し、実行コンテキストスタックから削除する
  28. 実行コンテキストスタックの最上位にあるコンテキストを実行中の実行コンテキストとして再開する
  29. Completion(result) を返す
evalコードは、呼び出しコンテキストが仮パラメーター初期化子を評価している場合、または呼び出しコンテキストのコードまたは評価コードがstrictモードコード である場合、evalを呼び出した呼び出しコンテキストの変数環境で変数または関数のバインディングをインスタンス化できません。 代わりに、そのようなバインディングは、評価コードにのみアクセスできる新しいVariableEnvironmentでインスタンス化されます。 let、const、またはclass宣言によって導入されたバインディングは、常に新しいLexicalEnvironmentでインスタンス化されます。

18.2.1.2 HostEnsureCanCompileStrings ( callerRealm, calleeRealm )

HostEnsureCanCompileStringsは、開発者が文字列をECMAScriptコードにコンパイルできるようにする特定のECMAScript関数を、ホスト環境がブロックできるようにする、実装定義の抽象操作です。

HostEnsureCanCompileStringsの実装は、正常に完了することも、突然の完了することもあります。 突然の完了は、その呼び出し元に伝播されます。 HostEnsureCanCompileStringsのデフォルトの実装は、空の通常の完了を無条件に返すことです。

18.2.1.3 ランタイムセマンティクス(Runtime Semantics): EvalDeclarationInstantiation ( body, varEnv, lexEnv, strict )

抽象操作EvalDeclarationInstantiationが引数body, varEnv, lexEnv, strictを指定して呼び出されると、次の手順が実行されます。

  1. bodyVarDeclaredNamesvarNames とする
  2. bodyVarScopedDeclarationsvarDeclarations とする
  3. lexEnvEnvironmentRecordlexEnvRec とする
  4. varEnvEnvironmentRecordvarEnvRec とする
  5. strictfalse なら、
    1. varEnvRecグローバル環境レコード なら、
      1. varNames の 各要素を name とし、name ごとに次を実行する
        1. varEnvRec.HasLexicalDeclaration(name) が true なら SyntaxError例外をスローする
        2. NOTE: evalは、グローバルレキシカル宣言によってシャドウされるグローバル変数宣言を作成しない
    2. lexEnvthisLex とする
    3. Assert: 次のループは終了する
    4. thisLexvarEnv が同じでない間繰り返し
      1. thisLexEnvironmentRecordthisEnvRec とする
      2. thisEnvRecオブジェクト環境レコード でないなら、
        1. NOTE: withステートメントの環境にはレキシカル宣言を含めることができないため、var/letホイストの競合をチェックする必要がない
        2. varNames の 各要素を name とし、name ごとに次を実行する
          1. thisEnvRec.HasBinding(name) が true なら、
            1. SyntaxError例外をスローする
            2. NOTE: 付録 B.3.5 に、上記のステップの代替セマンティクスを定義されている
          2. NOTE: A ダイレクトeval は同名のレキシカル宣言に対して var宣言を上書きしない
      3. thisLex外部環境参照thisLex にセットする
  6. 空の新規ListfunctionsToInitialize とする
  7. 空の新規ListdeclaredFunctionNames とする
  8. varDeclarations 内の 各要素を d とし、リストの逆順で次を実行する
    1. dVariableDeclarationForBindingBindingIdentifier のどれでもないなら、
      1. Assert: dFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration のどれか
      2. NOTE: 同名の関数宣言が複数あるなら、最後の宣言が使用される
      3. dBoundNames の唯一の要素を fn とする
      4. fndeclaredFunctionNames の要素でないなら、
        1. varEnvRecグローバル環境レコード なら、
          1. ? varEnvRec.CanDeclareGlobalFunction(fn) を fnDefinable とする
          2. fnDefinablefalse なら TypeError例外をスローする
        2. declaredFunctionNamesfn を追加する
        3. functionsToInitialize の最初に d を挿入する
  9. NOTE: 付録B.3.3.3に、この時点で追加手順あり
  10. 空の新規ListdeclaredVarNames とする
  11. varDeclarations の 各要素を d とし、d ごとに次を実行する
    1. dVariableDeclarationForBindingBindingIdentifier のどれかなら、
      1. dBoundNames 内の 各Stringを vn とし、vn ごとに次を実行する
        1. vndeclaredFunctionNames の要素でないなら、
          1. varEnvRec が a グローバル環境レコード なら、
            1. ? varEnvRec.CanDeclareGlobalVar(vn) を vnDefinable とする
            2. vnDefinablefalse なら、 TypeError例外をスローする
          2. vndeclaredVarNames の要素でないなら、
            1. declaredVarNamesvn を追加する
  12. NOTE: varEnvRecグローバル環境レコード かつグローバルオブジェクトProxyエキゾチックオブジェクト でないとき、この後に異常終了が発生しない
  13. bodyLexicallyScopedDeclarationslexDeclarations とする
  14. lexDeclarations の 各要素を d とし、d ごとに次を実行する
    1. NOTE: ここでは、レキシカル宣言された名前はインスタンス化されるだけ。初期化はされない
    2. dBoundNames の 各要素を dn とし、dn ごとに次を実行する
      1. dIsConstantDeclarationtrue なら、
        1. ? lexEnvRec.CreateImmutableBinding(dn, true) を実行する
      2. i. と異なるなら、
        1. ? lexEnvRec.CreateMutableBinding(dn, false) を実行する
  15. functionsToInitialize の各パースノードf とし、 f ごとに次を実行する
    1. fBoundNames の唯一の要素を fn とする
    2. 引数 lexEnv を使用して fInstantiateFunctionObjectfo とする
    3. varEnvRecグローバル環境レコード なら、
      1. ? varEnvRec.CreateGlobalFunctionBinding(fn, fo, true) を実行する
    4. c. と異なるなら、
      1. varEnvRec.HasBinding(fn) を bindingExists とする
      2. bindingExistsfalse なら、
        1. ! varEnvRec. CreateMutableBinding(fn, true) を status とする
        2. Assert: status突然の完了ではない(手順12の前に検証が行われたため)
        3. ! varEnvRec.InitializeBinding(fn, fo) を実行する
      3. ii. と異なるなら、
        1. ! varEnvRec.SetMutableBinding(fn, fo, false) を実行する
  16. declaredVarNames の各String要素を vn とし、 リスト順で vn ごとに次を実行する
    1. varEnvRecグローバル環境レコード なら、
      1. ? varEnvRec.CreateGlobalVarBinding(vn, true) を実行する
    2. a. と異なるなら、
      1. varEnvRec.HasBinding(vn) を bindingExists とする
      2. bindingExistsfalse なら、
        1. ! varEnvRec.CreateMutableBinding(vn, true) を status とする
        2. Assert: status突然の完了ではない(手順12の前に検証が行われたため)
        3. ! varEnvRec.InitializeBinding(vn, undefined) を実行する
  17. NormalCompletion(empty) を返す
B.3.5 に、このアルゴリズムの代替バージョンがあります。

18.2.2 isFinite ( number )

isFinite関数は、%isFinite%組み込みオブジェクトです。 isFinite関数が引数numberで呼び出されると、次の手順が実行されます。

  1. ? ToNumber(number) を num とする
  2. numNaN+∞-∞ のどれかなら、 false を返す
  3. trueを返

18.2.3 isNaN ( number )

sNaN関数は、%isNaN%組み込みオブジェクトです。 isNaN関数が引数numberで呼び出されると、次の手順が実行されます。

  1. ? ToNumber(number) を num とする
  2. numNaN なら、 true を返す
  3. false を返す
ECMAScriptコードで、値がNaNであるかどうかを確認する最も確実なのは、値をXとしたとき、X!== X の式を使用することです。XNaNである場合にのみ、結果が真になります。

18.2.4 parseFloat ( string )

parseFloat関数は、引数stringの内容を10進リテラルとして解釈し、数値を生成します。

parseFloat関数は、%parseFloat%組み込みオブジェクトです。 parseFloat関数が引数stringで呼び出されると、次の手順が実行されます。

  1. ? ToString(string) を inputString とする
  2. ! TrimString(inputString, start) を trimmedString とする
  3. trimmedString または trimmedStringのプレフィックスが、StrDecimalLiteralの構文(7.1.4.1 を参照)を満たさないなら、NaNを返す
  4. trimmedStringの最長のプレフィックスを numberString とする。これは、StrDecimalLiteralの構文を満たす、trimmedString自体である可能性がある
  5. numberStringMVmathFloat とする
  6. mathFloat = 0 なら、
    1. trimmedString の 最初のコードユニット が 0x002D ("-":HYPHEN-MINUS) なら、 -0 を返す
    2. +0 を返す
  7. mathFloat数値 を返す
parseFloatは、文字列の先頭から数値として解釈します。 10進リテラル表記の一部として解釈できないコードユニットはすべて無視します。無視されたことは通知されません。

18.2.5 parseInt ( string, radix )

parseInt関数は、基数radixに従ってstringの内容を解釈し整数値を生成します。 先頭の空白は無視されます。 radixundefinedまたは0の場合、stringが基数16を意味する0xまたは0Xで始まる場合を除いて、10と見なされます。 radixが16で、stringが0xまたは0Xで始まる場合もあります。

parseInt関数は、%parseInt%組み込みオブジェクトです。 parseInt関数が呼び出されると、次の手順が実行されます。

  1. ? ToString(string) を inputString とする
  2. ! TrimString(inputString, start) を S とする
  3. 1sign とする
  4. Sempty でなく S の最初のコードユニットが 0x002D ("-":HYPHEN-MINUS) なら、 -1sign にセットする
  5. Sempty でなく、 S の最初のコードユニットが 0x002B ("+":PLUS SIGN) または 0x002D ("-":HYPHEN-MINUS) でないなら、 S から 最初のコードユニットを削除する
  6. ? ToInt32(radix) を R とする
  7. truestripPrefix とする
  8. R0 なら、
    1. R < 2 または R > 36 なら、 NaN を返す
    2. R ≠ 16, falsestripPrefix にセットする
  9. 8. と異なるなら、
    1. 10R にセットする
  10. stripPrefixtrue なら、
    1. S の長さが2以上で、 Sの最初の2つのコードユニットが "0x" または "0X" なら、
      1. S から 最初の2つのコードユニットを削除する
      2. 16R にセットする
  11. S に基数 R として有効でないコードユニットが含まれているなら、Sの先頭から有効でない文字の手前までのコードユニットを Z とする。 それ以外なら、S を Z とする
  12. Zempty なら、 NaN を返す
  13. 基数 R 表記の Z で表される数学的整数値を mathInt とする。このとき、値が10から35は数字にA-Za-zの文字を使用する(ただし、R10で、Zの有効数字が20桁を超える場合は、実装のオプションで、20番目以降のすべての有効数字を0に置き換えることができる。 R248101632でない場合、mathIntは、基数R表記のZで表される数学整数値の実装に依存する近似値になる可能性がある。)
  14. mathInt = 0 なら、
    1. sign = -1 なら、 -0 を返す
    2. +0 を返す
  15. mathInt の 数値number とする
  16. sign × number を返す
parseIntは、文字列の先頭部分のみを整数値として解釈します。 整数の表記として解釈できないコードユニットは無視されます。無視されたことは通知されません。

18.2.6 URI処理関数(URI Handling Functions)

ユニフォームリソース識別子(URI)は、インターネット上でリソース(Webページやファイルなど)とそれらにアクセスするためのトランスポートプロトコル(HTTPやFTPなど)を識別する文字列です。 ECMAScript言語自体は、18.2.6.218.2.6.318.2.6.4、および18.2.6.5で説明されているようにURIをエンコードおよびデコードする関数を除いて、URIの使用をサポートしていません。

ECMAScript実装の多くは、追加でWebページを操作する関数とメソッドを提供します。 これらの機能は、この規格の範囲ではありません。

18.2.6.1 URI構文とセマンティクス(URI Syntax and Semantics)

URIは、区切り文字で区切られた一連のコンポーネントで構成されます。 一般的な形式は次のとおりです。

Scheme : First / Second ; Third ? Fourth

ここで、イタリック体の名前はコンポーネントを表します。":""/"";""?" はセパレータとして使用するために予約されています。 encodeURIおよびdecodeURI関数は、URIが完全であることが前提です。 URI内の予約済みコードユニットは特別な意味を持つことを意図しているため、エンコードされていないと想定しています。 encodeURIComponent関数とdecodeURIComponent関数は、URIの個々のコンポーネント部分を操作します。 予約済みのコードユニットはテキストを表すと想定しています。コンポーネントが完全なURIの一部である場合、予約済みのコードユニットとして解釈されないようにエンコードする必要があります。

次のレキシカル文法は、エンコードされたURIの形式を指定します。

構文:

uriReserved ::: どれかひとつ

;/?:@&=+$,

uriAlpha ::: どれかひとつ

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

uriMark ::: どれかひとつ

-_.!~*'()
上記の構文はRFC2396に基づいまう。最新のRFC3986によって導入された変更を反映していません。

ランタイムセマンティクス

URIに含まれるコードユニットが上記にリストされていない、または予約済みコードユニットに特別な意味を与えることを意図していない場合は、そのコードユニットをエンコードする必要があります。 コードユニットはUTF-8エンコーディングに変換され、サロゲートペアはUTF-16から対応するコードポイント値に変換されます。 ([0,127]の範囲のコードユニットの場合、これにより同じ値の単一のオクテットが生成されることに注意してください。)次に、結果のオクテットのシーケンスが文字列に変換され、各オクテットは"%xx"の形式のエスケープシーケンスで表されます。

18.2.6.1.1 ランタイムセマンティクス(Runtime Semantics): Encode ( string, unescapedSet )

エンコードとエスケープ処理は、2つの文字列引数stringunescapedSetを使用する抽象操作Encodeによって記述されます。

The encoding and escaping process is described by the abstract operation Encode taking two String arguments string and unescapedSet.

  1. string のコードユニット数を strLen とする
  2. empty String を R とする
  3. 0k とする
  4. 繰り返し
    1. k イコール strLen なら、 return R
    2. string のインデックス k のコードユニットを C とする
    3. CunescapedSet にあるなら、
      1. k + 1k にセットする
      2. RC を連結したものを R にセットする
    4. c. と異なるなら、
      1. ! CodePointAt(string, k) を cp とする
      2. cp.[[IsUnpairedSurrogate]] が true なら、URIError例外をスローする
      3. k + cp.[[CodeUnitCount]] を k にセットする
      4. cp.[[CodePoint]]にUTF-8変換を適用した結果のリストを Octets とする
      5. Octets の 各要素を octet とし、リスト順で octet ごとに次を実行する
        1. 次の文字列を順番に連結したものを R にセットする
          • R
          • "%"
          • octet の文字列表現。2桁の大文字の16進数としてフォーマットし、必要に応じて左側にゼロを埋め込む
18.2.6.1.2 ランタイムセマンティクス(Runtime Semantics): Decode ( string, reservedSet )

エスケープ解除とデコードの処理は、2つのString引数string, reservedSetを使用する抽象操作Decodeによって記述されます。

  1. string のコードユニット数を strLen とする
  2. empty String を R とする
  3. 0k とする
  4. 繰り返し
    1. k イコール strLen なら、 R を返す
    2. string の インデックス k のコードユニットを C とする
    3. C0x0025 ("%" : PERCENT SIGN) でないなら、
      1. C を String値 S とする
    4. c. と異なるなら、
      1. kstart とする
      2. k + 2strLen 以上なら、URIError例外をスローする
      3. string のインデックス (k + 1) と (k + 2) のコードユニットが16進数文字でないなら、 URIError例外をスローする
      4. インデックス(k + 1)と(k + 2)を2桁の16進数とし、8ビット値に変換したものを B とする
      5. k + 2k にセットする
      6. B の最上位ビットが 0 なら、
        1. B を コードユニット C とする
        2. CreservedSet にないなら、
          1. コードユニットC を String S とする
        3. 2. と異なるなら、
          1. string のインデックス start から k までの文字列を S とする
      7. vi. と異なるなら、
        1. Assert: B の最上位ビットは 1
        2. (B << n) & 0x800 になる負でない最小の整数を n とする
        3. n イコール 1 または n4 より大きいなら、URIError例外をスローする
        4. サイズが n の8ビット整数のリストを Octets とする
        5. BOctets[0] にセットする
        6. k + (3 × (n - 1)) が strLen 以上なら、URIError例外をスローする
        7. 1 を j とする
        8. j < n の間繰り返し
          1. k + 1k にセットする
          2. string のインデックス k のコードユニットが、 0x0025 ("%" : PERCENT SIGN) でないなら、URIError例外をスローする
          3. string のインデックス (k + 1) と (k + 2) のコードユニットが16進数文字でないなら、 URIError例外をスローする
          4. インデックス(k + 1)と(k + 2)を2桁の16進数とし、8ビット値に変換したものを B とする
          5. B の最上位2ビットが10でないなら、URIError例外をスローする
          6. k + 2k にセットする
          7. BOctets[j] にセットする
          8. j + 1j にセットする
        9. Octets にUnicodeコードポイントの有効なUTF-8エンコーディングが含まれていないなら、URIError例外をスローする
        10. UTF-8変換をOctetsに適用(オクテットのリストから21ビット値に変換)した結果を V とする
        11. コードユニットが UTF16Encoding(V) の要素である文字列値を S とする
    5. RS の文字列連結を R にセットする
    6. k + 1k にセットする
このユニフォームリソース識別子の構文は、RFC 2396に基づいており、RFC2396に代わる最新のRFC3986を反映していません。UTF-8の正式な説明と実装はRFC3629に記載されています。UTF-8は、1から6オクテットのシーケンスを使用してエンコードされます。 オクテットが1つのとき、上位ビットが0、残りの7ビットは文字値のエンコードで使用されます。 nオクテットのシーケンス(n > 1)では、最初のオクテットの上位nビットが1に、続くビットが0に設定されます。残りのビットは、エンコードされる文字値のビットです。 2オクテット以降はすべて、上位ビットが1、次のビットが0に設定され、残りの6ビットがエンコードされる文字のビットです。 ECMAScript文字の可能なUTF-8エンコーディングを表47に示します。

表47: (参考):UTF-8エンコーディング
コードユニット値 表記 オクテット 1 オクテット 2 オクテット 3 オクテット 4
0x0000 - 0x007F 00000000 0zzzzzzz 0zzzzzzz
0x0080 - 0x07FF 00000yyy yyzzzzzz 110yyyyy 10zzzzzz
0x0800 - 0xD7FF xxxxyyyy yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz
0xD800 - 0xDBFF
次の値が続く
0xDC00 - 0xDFFF
110110vv vvwwwwxx
次の値が続く
110111yy yyzzzzzz
11110uuu 10uuwwww 10xxyyyy 10zzzzzz
0xD800 - 0xDBFF
次の値が続かない
0xDC00 - 0xDFFF
URIError
0xDC00 - 0xDFFF URIError
0xE000 - 0xFFFF xxxxyyyy yyzzzzzz 1110xxxx> 10yyyyyy 10zzzzzz

ここで、

uuuuu = vvvv + 1

は、Unicode標準(サロゲート)のセクション3.8のように0x10000の追加を意味します。

上記の変換は、各サロゲートペア(0xD800から0xDFFFまでのコードユニット値)をUTF-32表現で結合し、結果の21ビット値をUTF-8にエンコードします。 デコードすると、サロゲートペアが再構築されます。

RFC 3629は、無効なUTF-8オクテットシーケンスのデコードを禁止しています。 たとえば、無効なシーケンスC080はコードユニット0x0000にデコードしてはなりません。 このような無効なシーケンスに遭遇したときにURIErrorをスローするには、デコードアルゴリズムの実装が必要です。

18.2.6.2 decodeURI ( encodedURI )

decodeURI関数は、新しいバージョンのURIを計算します。このバージョンでは、encodeURI関数によって導入される可能性のある種類の各エスケープシーケンスとUTF-8エンコーディングが、それが表すコードポイントのUTF-16エンコーディングに置き換えられます。 encodeURIによって導入できなかったエスケープシーケンスは置き換えられません。

decodeURI関数は%decodeURI%組み込みオブジェクトです。 引数encodedURIを使用してdecodeURI関数を呼び出すと、次の手順が実行されます。

  1. ? ToString(encodedURI) を uriString とする
  2. uriReservedで有効な各コードユニットの1つのインスタンスと"#"を含む文字列を reservedURISet とする
  3. ? Decode(uriString, reservedURISet) を返す
コードポイント#は、予約済みのURIコードポイントではありませんが、エスケープシーケンスからデコードされません。

18.2.6.3 decodeURIComponent ( encodedURIComponent )

decodeURIComponent関数は、URIの新しいバージョンを計算します。このバージョンでは、encodeURIComponent関数によって導入される可能性のある種類の各エスケープシーケンスとUTF-8エンコーディングが、それが表すコードポイントのUTF-16エンコーディングに置き換えられます。

decodeURIComponent関数は%decodeURIComponent%組み込みオブジェクトです。 decodeURIComponent関数が引数encodedURIComponentで呼び出されると、次の手順が実行されます。

  1. ? ToString(encodedURIComponent) を componentString とする
  2. empty String を reservedURIComponentSet とする
  3. ? Decode(componentString, reservedURIComponentSet) を返す

18.2.6.4 encodeURI ( uri )

encodeURI関数は、UTF-16エンコード(6.1.4)URIの新しいバージョンを計算します。このURIでは、特定のコードポイントの各インスタンスが、コードポイントのUTF-8エンコードを表す1つ、2つ、3つ、または4つのエスケープシーケンスに置き換えられます。

encodeURI関数は%encodeURI%組み込みオブジェクトです。 encodeURI関数が引数uriで呼び出されると、次の手順が実行されます。

  1. ? ToString(uri) を uriString とする
  2. uriReserveduriUnescaped"#" で有効な各コードユニットの1つのインスタンスを含む文字列を unescapedURISet とする
  3. ? Encode(uriString, unescapedURISet) を返す
コードポイント#は、予約済みまたはエスケープされていないURIコードポイントではありませんが、エスケープシーケンスにエンコードされていません。

18.2.6.5 encodeURIComponent ( uriComponent )

encodeURIComponent関数は、UTF-16エンコード(6.1.4)URIの新しいバージョンを計算します。このURIでは、特定のコードポイントの各インスタンスが、コードポイントのUTF-8エンコードを表す1つ、2つ、3つ、または4つのエスケープシーケンスに置き換えられます。

encodeURIComponent関数は、%encodeURIComponent%組み込みオブジェクトです。 encodeURIComponent関数が引数uriComponentで呼び出されると、次の手順が実行されます。

  1. ? ToString(uriComponent) を componentString とする
  2. uriUnescapedで有効な各コードユニットの1つのインスタンスを含む文字列を unescapedURIComponentSet とする
  3. ? Encode(componentString, unescapedURIComponentSet) を返す

18.3 グローバルオブジェクトのコンストラクタープロパティ(Constructor Properties of the Global Object)

18.3.1 Array ( . . . )

22.1.1参照

18.3.2 ArrayBuffer ( . . . )

24.1.2参照

18.3.3 BigInt ( . . . )

20.2.1参照

18.3.4 BigInt64Array ( . . . )

22.2.4参照

18.3.5 BigUint64Array ( . . . )

22.2.4参照

18.3.6 Boolean ( . . . )

19.3.1参照

18.3.7 DataView ( . . . )

24.3.2参照

18.3.8 Date ( . . . )

20.4.2参照

18.3.9 Error ( . . . )

19.5.1参照

18.3.10 EvalError ( . . . )

19.5.5.1参照

18.3.11 Float32Array ( . . . )

22.2.4参照

18.3.12 Float64Array ( . . . )

22.2.4参照

18.3.13 Function ( . . . )

19.2.1参照

18.3.14 Int8Array ( . . . )

22.2.4参照

18.3.15 Int16Array ( . . . )

22.2.4参照

18.3.16 Int32Array ( . . . )

22.2.4参照

18.3.17 Map ( . . . )

23.1.1参照

18.3.18 Number ( . . . )

20.1.1参照

18.3.19 Object ( . . . )

19.1.1参照

18.3.20 Promise ( . . . )

25.6.3参照

18.3.21 Proxy ( . . . )

26.2.1参照

18.3.22 RangeError ( . . . )

19.5.5.2参照

18.3.23 ReferenceError ( . . . )

19.5.5.3参照

18.3.24 RegExp ( . . . )

21.2.3参照

18.3.25 Set ( . . . )

23.2.1参照

18.3.26 SharedArrayBuffer ( . . . )

24.2.2参照

18.3.27 String ( . . . )

21.1.1参照

18.3.28 Symbol ( . . . )

19.4.1参照

18.3.29 SyntaxError ( . . . )

19.5.5.4参照

18.3.30 TypeError ( . . . )

19.5.5.5参照

18.3.31 Uint8Array ( . . . )

22.2.4参照

18.3.32 Uint8ClampedArray ( . . . )

22.2.4参照

18.3.33 Uint16Array ( . . . )

22.2.4参照

18.3.34 Uint32Array ( . . . )

22.2.4参照

18.3.35 URIError ( . . . )

19.5.5.6参照

18.3.36 WeakMap ( . . . )

23.3.1参照

18.3.37 WeakSet ( . . . )

23.4参照

18.4 グローバルオブジェクトの他のプロパティ(Other Properties of the Global Object)

18.4.1 Atomics

24.4参照

18.4.2 JSON

24.5参照

18.4.3 Math

20.3参照

18.4.4 Reflect

26.1参照