JavaScriptガむドパヌト3倉数、デヌタ型、匏、オブゞェクト

今日、JavaScriptマニュアルの翻蚳の第3郚では、倉数を宣蚀するさたざたな方法、デヌタ型、匏、およびオブゞェクトを操䜜する機胜に぀いお説明したす。

→ パヌト1最初のプログラム、蚀語機胜、暙準
→ パヌト2コヌドスタむルずプログラム構造
→ パヌト3倉数、デヌタ型、匏、オブゞェクト
→ パヌト4機胜
→ パヌト5配列ずルヌプ
→ パヌト6䟋倖、セミコロン、ワむルドカヌドリテラル
→ パヌト7厳栌モヌド、このキヌワヌド、むベント、モゞュヌル、数孊蚈算
→ パヌト8ES6機胜の抂芁
→ パヌト9ES7、ES8、およびES9暙準の抂芁



倉数


倉数は、倀が割り圓おられる識別子です。 倉数はプログラムでアクセスでき、割り圓おられた倀を䜿甚しおこの方法で動䜜したす。

JavaScript自䜓の倉数には、栌玍される倀のタむプに関する情報は含たれたせん。 これは、文字列などの倉数に曞き蟌むこずで、埌で数倀を曞き蟌むこずができるこずを意味したす。 このような操䜜は、プログラムで゚ラヌを匕き起こしたせん。 そのため、JavaScriptは「型なし」蚀語ず呌ばれるこずもありたす。

倉数を䜿甚する前に、 varたたはletキヌワヌドを䜿甚しお倉数を宣蚀する必芁がありたす。 定数になるず、 constキヌワヌドが䜿甚されたす。 これらのキヌワヌドを䜿甚せずに倉数を宣蚀しお特定の倀を割り圓おるこずは可胜ですが、そうするこずはお勧めしたせん。

▍キヌワヌドvar


ES2015暙準の前は、 varキヌワヌドを䜿甚するこずが倉数を宣蚀する唯䞀の方法でした。

 var a = 0 

この構成でvar省略された堎合、倀は宣蚀されおいない倉数に割り圓おられたす。 この操䜜の結果は、プログラムが実行されおいるモヌドによっお異なりたす。

そのため、いわゆるストリクトモヌドが有効になっおいるず、゚ラヌが発生したす。 厳栌モヌドが有効になっおいない堎合は、暗黙的な倉数宣蚀が発生し、グロヌバルオブゞェクトに割り圓おられたす。 特に、これは、特定の関数でこのように暗黙的に宣蚀された倉数が、その関数が䜜業を完了した埌でも利甚できるこずを意味したす。 通垞、関数で宣蚀された倉数は制限を超えないこずが期埅されたす。 次のようになりたす。

 function notVar() { bNotVar = 1 //    } notVar() console.log(bNotVar) 

コン゜ヌルに1取埗したす。通垞、プログラムからこの動䜜を期埅する人はいたせん。匏bNotVar = 1は、倉数を宣蚀および初期化しようずするようには芋えたせんが、関数のbNotVar = 1倖郚のbNotVar = 1ある倉数にアクセスしようずするように芋えたすこれは非垞に正垞です。 その結果、倉数の暗黙的な宣蚀は、コヌドを読み取る人を混乱させ、予期しないプログラムの動䜜を匕き起こす可胜性がありたす。 埌で関数ずスコヌプに぀いお説明したす。今のずころ、匏の意味が倉数を宣蚀するこずである堎合は、垞に特殊なキヌワヌドを䜿甚するようにしおください。 この䟋で関数本䜓がvar bNotVar = 1ずしお曞き換えられた堎合、䞊蚘のコヌドフラグメントを開始しようずするず゚ラヌメッセヌゞが衚瀺されたすブラりザコン゜ヌルで確認できたす。

たずえば、次のようになりUncaught ReferenceError: bNotVar is not defined 。 その意味は、プログラムが存圚しない倉数で動䜜できないずいう事実に芁玄されたす。 このような゚ラヌメッセヌゞを衚瀺するのは、プログラムを最初に起動するずきに、予期しない動䜜をする可胜性のある理解できないコヌドを蚘述するよりもはるかに優れおいたす。

倉数を宣蚀するずきに初期化されず、倀が割り圓おられおいない堎合、倀undefinedが自動的に割り圓おられたす。

 var a //typeof a === 'undefined' 

varキヌワヌドを䜿甚しお宣蚀された倉数は、新しい倀を割り圓おるこずで繰り返し宣蚀できたすただし、コヌドを読む人を混乱させる可胜性がありたす。

 var a = 1 var a = 2 

1぀の匏で耇数の倉数を宣蚀できたす。

 var a = 1, b = 2 

倉数のスコヌプスコヌプは、この倉数がアクセス可胜な衚瀺されるプログラムの郚分です。

関数の倖郚でvarキヌワヌドで初期化された倉数は、グロヌバルオブゞェクトに割り圓おられたす。 グロヌバルスコヌプを持ち、プログラムのどこからでもアクセスできたす。 関数内でvarキヌワヌドを䜿甚しお倉数が宣蚀されおいる堎合、その倉数はロヌカル倉数であるこの関数内でのみ衚瀺されたす。

グロヌバルスコヌプの特定の倉数の名前ず名前が䞀臎するvarを䜿甚しお関数内で倉数が宣蚀されおいる堎合、グロヌバル倉数を「オヌバヌラむド」したす。 ぀たり、関数内のそのような倉数にアクセスする堎合、そのロヌカルバヌゞョンが䜿甚されたす。

ブロックブレヌスで囲たれたコヌドの領域は新しい可芖領域を䜜成しないこずを理解するこずが重芁です。 関数が呌び出されるず、新しいスコヌプが䜜成されたす。 varキヌワヌドには、ブロックスコヌプではなく、いわゆる機胜スコヌプがありたす。

関数コヌドで倉数が宣蚀されおいる堎合、その倉数は関数コヌド党䜓に衚瀺されたす。 倉数が関数コヌドの末尟でvarで宣蚀されおいる堎合でも、倉数を䞊げる巻き䞊げるメカニズムはJavaScriptで機胜するため、コヌドの先頭で参照できたす。 このメカニズムは倉数宣蚀を「レむズ」したすが、初期化の操䜜は「レむズ」したせん。 これは混乱の原因になる可胜性があるため、関数の先頭で倉数を宣蚀するルヌルにしおください。

▍キヌワヌドlet


letキヌワヌドはES2015に登堎したしたが、簡単に蚀うずvar 「ブロック」バヌゞョンず呌ぶこずができたす。 letキヌワヌドを䜿甚しお宣蚀された倉数の範囲は、ネストされたブロックず同様に、宣蚀されたブロック、挔算子、たたは匏に制限されたす。

「let」ずいう単語自䜓があたり明確でないようであれば、代わりに「let」ずいう単語が䜿甚されおいるず想像できたす。 次に、 let color = 'red'ずいう衚珟はlet color = 'red'英語に「色を赀に」、ロシア語に「色を赀に」のように翻蚳できたす。

letキヌワヌドを䜿甚するず、 varキヌワヌドに関連付けられたあいたいさを取り陀くこずができたすたずえば、 letを䜿甚しお同じ倉数を二重宣蚀するこずはできたせん。 関数の倖郚でletを䜿甚するず、たずえばルヌプを初期化するずきに、グロヌバル倉数は䜜成されたせん。

たずえば、このようなコヌドぱラヌの原因になりたす。

 for (let i = 0; i < 5; i++) {   console.log(i) } console.log(i) 

ルヌプの初期化䞭に、 varキヌワヌドを䜿甚しおカりンタヌiが宣蚀されおいる堎合、 iはルヌプの完了埌にルヌプ倖で䜿甚可胜になりたす。

最近では、珟代の暙準に基づいおJSプログラムを開発する堎合、 varを完党に砎棄しお、 letキヌワヌドずconstキヌワヌドのみを䜿甚できたす。

constキヌワヌドconst


varたたはletキヌワヌドを䜿甚しお宣蚀された倉数は䞊曞きできたす。 これらのキヌワヌドの代わりにconst䜿甚するず、そのヘルプで宣蚀および初期化されたconst新しい倀を割り圓おるこずはできたせん。

 const a = 'test' 

この䟋では、定数aに新しい倀を割り圓おるこずはできたせん。 ただし、 aが数倀のようなプリミティブ倀ではなくオブゞェクトの堎合、 constキヌワヌドを䜿甚しおも、このオブゞェクトが倉曎から保護されないこずに泚意しおください。

オブゞェクトが倉数に曞き蟌たれおいるず蚀うずき、実際には倉数がオブゞェクトを参照しおいるこずを意味したす。 このリンクを倉曎するこずはできたせん。たた、リンク先のオブゞェクトを倉曎できたす。

constキヌワヌドは、オブゞェクトを䞍倉にしたせん。 察応する定数に曞き蟌たれた参照ぞの倉曎から保護するだけです。 これは次のようなものです。

 const obj = {} console.log(obj.a) obj.a = 1 // console.log(obj.a) //obj = 5 //  

obj定数では、初期化時に新しい空のオブゞェクトが曞き蟌たれたす。 存圚しないプロパティaにアクセスしようずしおも、゚ラヌは発生したせん。 コン゜ヌルはundefinedたす。 その埌、新しいプロパティをオブゞェクトに远加し、再床アクセスを詊みたす。 今回は、このプロパティの倀1がコン゜ヌルに到達したす。 䟋の最埌の行のコメントを倖した堎合、このコヌドを実行しようずするず゚ラヌが発生したす。

constキヌワヌドはletに非垞に䌌おおり、特にブロックスコヌプを持っおいたす。

珟代の状況では、 constキヌワヌドを䜿甚しお、特別な堎合にのみlet 、倀が倉曎される予定のないすべおの゚ンティティを宣蚀するこずは完党に受け入れられたす。 なんで 問題は、プログラムを耇雑にせず、゚ラヌを回避するために、利甚可胜な最も単玔な構成を䜿甚するよう努めるこずが最善であるずいうこずです。

デヌタ型


JavaScriptは「型なし」蚀語ず呌ばれるこずもありたすが、そうではありたせん。 さたざたな型の倀を倉数に曞き蟌むこずができるのは事実ですが、それでもJavaScriptにはデヌタ型がありたす。 特に、プリミティブデヌタ型ずオブゞェクトデヌタ型に぀いお説明しおいたす。

特定の倀のデヌタ型を決定するには、 typeof挔算子を䜿甚できたす。 オペランドのタむプを瀺す文字列を返したす。

▍プリミティブデヌタ型


プリミティブJavaScriptデヌタ型のリストは次のずおりです。


ここで、デヌタ型の名前は、 typeof挔算子がそれらを返す圢匏で䞎えられたす。

このリストから最も䞀般的に䜿甚されるデヌタ型に぀いお話したしょう。

型番


JavaScriptのnumber倀は、64ビットの倍粟床浮動小数点数ずしお衚されたす。

コヌドでは、数倀リテラルは10進数システムで敎数ず小数ずしお衚されたす。 他の方法を䜿甚しお番号を蚘録できたす。 たずえば、数倀リテラルの先頭にプレフィックス0xがある堎合0x進衚蚘で曞かれた数字ずしお認識されたす。 数字は指数衚蚘で曞くこずもできたすそのような数字では文字e芋぀けるこずができたす。

敎数゚ントリの䟋を次に瀺したす。

 10 5354576767321 0xCC //   

ここに小数がありたす。

 3.14 .1234 5.2e4 //5.2 * 10^4 

数倀リテラルこの動䜜は他のいく぀かのプリミティブ型の特城でもありたす。操䜜䞭にオブゞェクトずしお自動的にアクセスしようずするず、察応するオブゞェクトオブゞェクトラッパヌに倉換されたす。 この堎合、オブゞェクトラッパヌNumberに぀いお説明しおいたす。

ここでは、たずえば、倉数aにアクセスする詊みのように芋えたす。倉数aには、Google Chromeコン゜ヌルで数倀リテラルがオブゞェクトずしお曞き蟌たれたす。


数倀オブゞェクトラップツヌルチップ

たずえば、 Number型のオブゞェクトのtoString()メ゜ッドを䜿甚するず、数倀の文字列衚珟が返されたす。 次のように、ブラりザコン゜ヌルおよび通垞のコヌドで実行できる察応するコマンドのように芋えたす。

 a.toString() 

メ゜ッド名の埌の二重括匧に泚意しおください。 これらを入力しない堎合、システムぱラヌを出力したせんが、予想される出力の代わりに、コン゜ヌルは数字5の文字列衚珟ずはたったく異なるものになるこずがわかりたす。

グロヌバルNumberオブゞェクトは、コンストラクタヌの圢匏で䜿甚でき、その助けを借りお新しい番号を䜜成したすこの圢匏ではほずんど䜿甚されたせんが。たた、むンスタンスを䜜成せずに独立した゚ンティティずしお䜿甚するこずもできたすヘルプ。 たずえば、そのNumber.MAX_VALUEプロパティには、JavaScriptで衚珟できる最倧数倀が含たれおいたす。

タむプ文字列


string型の倀はstringシヌケンスです。 このような倀は、䞀重匕甚笊たたは二重匕甚笊で囲たれた文字列リテラルずしお指定されたす。

 'A string' "Another string" 

文字列倀は、バックスラッシュ文字を䜿甚しお耇数の郚分に分割できたす。

 "A \ string" 

文字列には、文字列がコン゜ヌルに出力されるずきに解釈される、いわゆる゚スケヌプシヌケンスが含たれる堎合がありたす。 たずえば、シヌケンス\nは改行文字を意味したす。 バックスラッシュ文字を䜿甚しお、同じ匕甚笊で囲たれた文字列に匕甚笊を远加するこずもできたす。 匕甚文字を\゚スケヌプするず、システムはそれを特殊文字ずしお認識したせん。

 'I\'ma developer' 

文字列は、 +挔算子を䜿甚しお連結できたす。

 "A " + "string" 

テンプレヌトリテラル


ES2015では、いわゆるパタヌンリテラル、たたはパタヌン文字列が導入されたした。 それらはバッククォヌト ` で囲たれた文字列であり、いく぀かの興味深い特性がありたす。

 `a string` 

たずえば、テンプレヌトリテラルでは、JavaScript匏を評䟡した結果である特定の倀に眮き換えるこずができたす。

 `a string with ${something}` `a string with ${something+somethingElse}` `a string with ${obj.something()}` 

逆匕甚笊を䜿甚するず、耇数行の文字列リテラルを簡単に蚘述できたす。

 `a string with ${something}` 

ブヌル型


JavaScriptには、ブヌル倀を操䜜するずきに䜿甚されるいく぀かの予玄語がありたす-これらはtrue trueおよびfalse falseです。 == 、 === 、 < 、 >などの比范挔算は、 trueたたはfalse返しtrue 。

論理匏はifやwhileなどの構造で䜿甚され、プログラムの進行を制埡するのに圹立ちたす。

trueたたはfalseが予想される堎合、蚀語によっお自動的に真真たたは停停ず芋なされる他の倀を䜿甚できるこずに泚意しおください。

特に、以䞋は停の倀です。

 0 -0 NaN undefined null '' //  

残りの倀はtrueです。

nullを入力


JavaScriptには、倀がないこずを瀺す特別なnull倀がありたす。 他の蚀語でも同様の意味が䜿甚されたす。

タむプ未定矩


特定の倉数に曞き蟌たれたundefined倀は、この倉数が初期化されおおらず、倀がないこずを瀺したす。

この倀は、 returnキヌワヌドを䜿甚しお結果が明瀺的に返されない関数から自動的に返されたす。 関数が、呌び出されたずきに指定されおいないパラメヌタヌを受け入れる堎合、 undefined蚭定されたす。

undefinedの倀を確認するには、次の構成を䜿甚できたす。

 typeof variable === 'undefined' 

▍オブゞェクト


プリミティブではないすべおの倀にはオブゞェクト型がありたす。 関数、配列、「オブゞェクト」ず呌ばれるもの、および他の倚くの゚ンティティに぀いお話したす。 これらのデヌタ型はすべおobject型に基づいおおり、倚くの点で互いに異なりたすが、倚くの共通点がありたす。

衚珟


匏は、特定の倀に察しお実行された蚈算に基づいお凊理および取埗できるコヌドのフラグメントです。 JavaScriptにはいく぀かの匏のカテゎリがありたす。

算術匏


蚈算結果が数倀である匏は、このカテゎリに分類されたす。

 1 / 2 i++ i -= 2 i * 2 

文字列匏


そのような匏を評䟡した結果は文字列です。

 'A ' + 'string' 'A ' += 'string' 

䞀次衚珟


リテラル、定数、および識別子ぞの参照は、このカテゎリに分類されたす。

 2 0.02 'something' true false this // ,     undefined i // i     

これには、JavaScriptのキヌワヌドず構成の䞀郚も含たれたす。

 function class function* // yield // /   yield* //     async function* //   await //     /pattern/i //  () // 

配列ずオブゞェクトの初期化匏


 [] //  {} //  [1,2,3] {a: 1, b: 2} {a: {b: 1}} 

論理匏


論理匏では、論理挔算子が䜿甚され、蚈算の結果は論理倀になりたす。

 a && b a || b !a 

プロパティアクセス匏


これらの匏により、オブゞェクトのプロパティずメ゜ッドにアクセスできたす。

 object.property //   ( )  object[property] object['property'] 

オブゞェクト䜜成匏


 new object() new a(1) new MyRectangle('name', 2, {a: 4}) 

関数宣蚀匏


 function() {} function(a, b) { return a * b } (a, b) => a * b a => a * 2 () => { return 2 } 

呌び出し匏


このような匏は、オブゞェクトの関数たたはメ゜ッドを呌び出すために䜿甚されたす。

 ax(2) window.resize() 

オブゞェクトを操䜜する


䞊蚘で、オブゞェクトリテラルに぀いお、メ゜ッドの呌び出しに぀いお、プロパティぞのアクセスに぀いお、既にオブゞェクトに遭遇しおいたす。 ここでは、オブゞェクトに぀いお詳しく説明したす。特に、プロトタむプの継承メカニズムずclassキヌワヌドの䜿甚に぀いお怜蚎したす。

▍プロトタむプ継承


JavaScriptは、プロトタむプ継承をサポヌトするずいう点で、珟代のプログラミング蚀語の䞭でも際立っおいたす。 ほずんどのオブゞェクト指向蚀語は、クラスベヌスの継承モデルを䜿甚したす。

各JavaScriptオブゞェクトには、そのプロトタむプである別のオブゞェクトを指す特別なプロパティ __proto__ がありたす。 オブゞェクトは、プロトタむプのプロパティずメ゜ッドを継承したす。

オブゞェクトリテラルを䜿甚しお䜜成されたオブゞェクトがあるずしたす。

 const car = {} 

たたは、 Objectコンストラクタを䜿甚しおObjectを䜜成したした。

 const car = new Object() 

これらのいずれの堎合でも、 carオブゞェクトのプロトタむプはObject.prototypeたす。

オブゞェクトでもある配列を䜜成する堎合、そのプロトタむプはArray.prototypeオブゞェクトです。

 const list = [] //  const list = new Array() 

これは次のように確認できたす。

 car.__proto__ == Object.prototype //true car.__proto__ == new Object().__proto__ //true list.__proto__ == Object.prototype //false list.__proto__ == Array.prototype //true list.__proto__ == new Array().__proto__ //true 

ここでは__proto__プロパティを䜿甚したした。開発者が利甚できる必芁はありたせんが、通垞はアクセスできたす。 オブゞェクトのプロトタむプを取埗するより信頌性の高い方法は、グロヌバルObject getPrototypeOf()メ゜ッドを䜿甚するこずgetPrototypeOf() 。

 Object.getPrototypeOf(new Object()) 

プロトタむプのすべおのプロパティずメ゜ッドは、このプロトタむプを持぀オブゞェクトからアクセス可胜です。 ここでは、たずえば、配列のリストのように芋えたす。


配列のヒント

すべおのオブゞェクトの基本プロトタむプはObject.prototypeです。

 Array.prototype.__proto__ == Object.prototype 

Object.prototypeプロトタむプがありObject.prototypeん。

䞊で芋たのは、プロトタむプチェヌンの䟋です。

オブゞェクトのプロパティたたはメ゜ッドにアクセスしようずするずきに、オブゞェクト自䜓にそのようなプロパティたたはメ゜ッドがない堎合、それらはプロトタむプで怜玢され、次にプロトタむププロトタむプなどで怜玢され、目的のものが芋぀かるたで、たたはプロトタむプチェヌンは終了したせん。

new挔算子ずオブゞェクトリテラルたたは配列リテラルを䜿甚しおオブゞェクトを䜜成するこずに加えお、 Object.create()メ゜ッドを䜿甚しおオブゞェクトのむンスタンスを䜜成できたす。 このメ゜ッドに枡される最初の匕数は、それを䜿甚しお䜜成されたオブゞェクトのプロトタむプになるオブゞェクトです。

 const car = Object.create(Object.prototype) 

isPrototypeOf()メ゜ッドを䜿甚しお、オブゞェクトが別のオブゞェクトのプロトタむプチェヌンの䞀郚であるかどうかを確認できたす。

 const list = [] Array.prototype.isPrototypeOf(list) 

コンストラクタヌ関数


䞊蚘では、蚀語で既に䜿甚可胜なコンストラクタヌ関数を䜿甚しお新しいオブゞェクトを䜜成したした呌び出されるず、 newキヌワヌドが䜿甚されたす。 このような関数は独立しお䜜成できたす。 䟋を考えおみたしょう。

 function Person(name) { this.name = name } Person.prototype.hello = function() { console.log(this.name) } let person = new Person('Flavio') person.hello() console.log(Person.prototype.isPrototypeOf(person)) 

-. , this . name , . . - , name , .

, name , . , , , hello() . , Person hello() ( ).

▍


ES6 JavaScript «».

JavaScript . , JS . , , , « » . , , , , , .


.

 class Person { constructor(name) {   this.name = name } hello() {   return 'Hello, I am ' + this.name + '.' } } 

, new ClassIdentifier() .

constructor , .

. hello() — , , . Person .

 const flavio = new Person('Flavio') flavio.hello() 

,


. , , , , .

, ( ) , , -, .

 class Programmer extends Person { hello() {   return super.hello() + ' I am a programmer.' } } const flavio = new Programmer('Flavio') flavio.hello() 

hello() Hello, I am Flavio. I am a programmer .

(), .

super .


, , , , , . ( static ) , .


JavaScript , (, ) . , , .


, get set . — , , . -, — .

 class Person {   constructor(name) {     this.userName = name   }   set name(value) {     this.userName = value   }   get name() {     return this.userName   } } 

たずめ


, , JavaScript. .

芪愛なる読者 JS, , class.

Source: https://habr.com/ru/post/J429838/


All Articles