JavaScriptは動的なプロトタイプベースの言語です。いくつかのプリミティブがあり、それ以外はすべてオブジェクトとみなされます。
JavaScriptはWebページのスクリプト言語として最もよく知られていますが、Node.jsなど、ブラウザー以外の多くの環境でも使われています。この言語は活発に開発されており、マルチパラダイムという性質から、さまざまなプログラミングスタイルが可能です。JavaScriptは動的な言語で、オブジェクト指向、命令型、宣言型(たとえば関数型プログラミング)といったスタイルをサポートしています。
JavaScriptで名前に値を代入するには、主にいくつかの方法があります。変数を使うか、定数を使うかです。Exercismでは、変数は常にcamelCaseで書き、定数はSCREAMING_SNAKE_CASEで書きます。従うべき公式のガイドがあるわけではなく、企業や組織によってさまざまなスタイルガイドがあります。変数は好きなように書いてかまいません。演習で用意されているとおりに書く利点は、WebインターフェースやほとんどのIDEで、それぞれ違うふうに強調表示されることです。
JavaScriptの変数は、const、let、varのキーワードを使って定義できます。
letやvarを使うと、変数はその存続期間の中でさまざまな値を参照できます。たとえば、myFirstVariableは、代入演算子=を使って何度も定義し直すことができます。
let myFirstVariable = 1;
myFirstVariable = 'Some string';
myFirstVariable = new SomeComplexClass();
letやvarとは対照的に、constで定義された変数には一度しか代入できません。これはJavaScriptで定数を定義するために使われます。
const MY_FIRST_CONSTANT = 10;
// Can not be re-assigned.
MY_FIRST_CONSTANT = 20;
// => TypeError: Assignment to constant variable.
constキーワードは、変数と定数の_両方_で言及されます。定数に関してよく言及されるもう一つの概念は、(不)可変性です。
constキーワードが不変にするのは_束縛_だけです。つまり、constの変数に値を代入できるのは一度だけです。JavaScriptでは、プリミティブの値だけが不変です。ただし、非プリミティブの値は依然として変更できます。
const MY_MUTABLE_VALUE_CONSTANT = { food: 'apple' };
// This is possible
MY_MUTABLE_VALUE_CONSTANT.food = 'pear';
MY_MUTABLE_VALUE_CONSTANT;
// => { food: "pear" }
原則として、Exercismや、他の多くの組織やプロジェクトのスタイルガイドでは、const SCREAMING_SNAKE_CASEのような値は変更しません。技術的にはその値を変更する_ことはできます_が、明確さと期待をそろえるために、Exercismではこれは推奨されていません。これを_どうしても_強制しなければならないときは、Object.freeze(value)を使います。
const MY_VALUE_CONSTANT = Object.freeze({ food: 'apple' });
// This silently fails
MY_VALUE_CONSTANT.food = 'pear';
MY_VALUE_CONSTANT;
// => { food: "apple" }
実際のコードベースでは、Object.freezeがそこらじゅうにあるのを見ることはほとんどありませんが、SCREAMING_SNAKE_CASEの値を決して変更しないというルールはよいルールです。多くの場合、リンターなどの自動解析で強制されます。
JavaScriptでは、機能の単位は_関数_にまとめられます。たいていは、関係する関数を同じファイルにまとめます。これらの関数は仮引数(引数)を受け取り、returnキーワードを使って値を_返す_ことができます。関数は()の構文で呼び出します。
function add(num1, num2) {
return num1 + num2;
}
add(1, 3);
// => 4
💡 JavaScriptには、関数を宣言する方法が_たくさん_あります。これらの他の方法は、
functionキーワードを使う場合とは見た目が違います。このトラックではそれらを少しずつ紹介していきますが、すでに知っている場合は、どれを使ってもかまいません。ほとんどの場合、どちらを使ったからといって良し悪しがあるわけではありません。
exportとimportのキーワードは、普通のJavaScriptファイルをJavaScriptモジュールに変える強力なツールです。コードが、関数、クラス、変数、定数などの構成要素を選択的に公開できるようにするだけでなく、次のようなさまざまな機能も可能にします。
具体的な例は、ExercismのJavaScriptトラックでテストがどのように動くかです。各演習には、たとえばlasagna.jsのような実装ファイルが少なくとも1つあり、また、たとえばlasagna.spec.jsのようなテストファイルが少なくとも1つあります。実装ファイルはexportを使って公開APIを公開し、テストファイルはimportを使ってこれらにアクセスします。こうすることで、実装の結果をテストできるのです。
// file.js
export const MY_VALUE = 10;
export function add(num1, num2) {
return num1 + num2;
}
// file.spec.js
import { MY_VALUE, add } from './file';
add(MY_VALUE, 5);
// => 15