JavaScript の記法と他言語との比較
変数の宣言
- var ← スコープの話がややこしいので使わない
- let : 変数
- const : 定数
※ 他の言語との比較
| 項目 | js/ts | swift | Kotlin | C++ | Java | C# | Ruby | PHP |
|---|---|---|---|---|---|---|---|---|
| 変数 (再代入OK) | let | var | var | int | int | int | x=.. (先頭小文字) | $x |
| 定数 (再代入不可) | const | let | val | const int | final int | readonly int | X=.. (先頭大文字) | - |
| コンパイル時定数 | - | - | const val | constexpr int | static final int | const int | - | const X |
| 非推奨 | var | - | - | - | - | - | - | - |
- C# の readonly はフィールドでの指定のみでローカル変数には使えない
- Ruby の先頭コメント
# frozen_string_literal: trueで文字列の変更不可となる
strict モード
js
'use strict;'
→ 他の言語にもある?
- TypeScript:
tsconfig.jsonの"strict": true,"alwaysStrict:": true - PHP:
declare(strict_types=1);
可変長引数
js
function myFunc1(...args) {
}
function myFunc2(a, b, ...args) {
}
| 言語 | 可変長引数 | メモ |
|---|---|---|
| JavaScript | ...args | |
| TypeScript | ...args: Int[] | |
| Swift | args: Int... | |
| Kotlin | vararg args: Int | |
| Java | int... args | |
| C# | params int[] args | |
| C++ (C形式) | ... | |
| C++ (C++11〜) | Args... args | template <class... Args> |
| Ruby | *args | |
| PHP | ...$args |
無名関数、ラムダ
js
(param1, param2) => {
}
| 言語 | 書き方 | メモ |
|---|---|---|
| JavaScript | (p1, p2) => { ... } | 従来の無名関数は function(p1, p2) { ... } |
| TypeScript | (p1: T1, p2: T2) => { ... } | 型付き。型は (p1: T1, p2: T2) => R |
| Swift | { (p1: T1, p2: T2) -> R in ... } | クロージャ。{ ... in ... } の形 |
| Kotlin | { p1: T1, p2: T2 -> ... } | 関数型 (T1, T2) -> R に代入して使う |
| Java | (p1, p2) -> { ... } | Java 8〜。BiFunction<T1,T2,R> などに代入 |
| C# | (p1, p2) => { ... } | Func<T1,T2,R> / Action<T1,T2> など |
| C++11〜 | [capture](T1 p1, T2 p2) { ... } | ラムダ式。[&] / [=] などでキャプチャ指定 |
| Ruby | ->(p1, p2) { ... } | ほかに lambda { |p1, p2| ... } など |
| PHP | function ($p1, $p2) { ... } | PHP 7.4〜は fn($p1, $p2) => expr もあり |
スプレッド構文
js
const concatenatedArray = [...array1, ...array2];
あると便利系ではあるけど、慣れてないと可読性 悪いかも? いったん、積極的には使わないでおく
文字列中の変数展開(テンプレートリテラル)
js
const sentence = `My name is ${name}.`
| 言語 | 書き方 | 式は可能? | カッコ省略可? |
|---|---|---|---|
| JavaScript | My name is ${name}. | o | x |
| TypeScript | My name is ${name}. | o | x |
| Swift | "My name is \(name)." | o | x |
| Kotlin | "My name is ${name}." | o | o |
| Python | f"My name is {name}." | o | x |
| Java | - | - | - |
| C# | $"My name is {name}." | o | x |
| C++ | - | - | - |
| Ruby | "My name is #{name}." | o | x |
| PHP | "My name is {$name}." | x | o |
分割代入
js
const [a, b, c] = [1, 2, 3]
| 言語 | 書き方 | カッコ省略可? | 要素不足時 | 要素過多時 | _ で捨てる | 補足 |
|---|---|---|---|---|---|---|
| JavaScript | const [a, b, c] = [1, 2, 3]; | x | o undefined で埋まる | o 余りの要素は無視 | o 空白で良い。_ も可だが、ただの変数として格納 | |
| TypeScript | const [a, b, c] = [1, 2, 3]; | x | o undefined で埋まる (型によっては警告) | o 余りの要素は無視 | o 空白で良い。 _ も可だが、ただの変数として格納 | |
| Swift | let (a, b, c) = (1, 2, 3) | x | x コンパイルエラー | x コンパイルエラー | o 可 | |
| Kotlin | val (a, b, c) = listOf(1, 2, 3) | x | x 実行時エラー IndexOutOfBoundsException | o 余りの要素は無視 | o 可 | |
| Python | a, b, c = [1, 2, 3] | o | x 実行時エラー ValueError: .. | x 実行時エラー ValueError: .. | o 可だが、ただの変数として格納 | |
| Java | - なし | - | - なし | - なし | - なし | |
| C# | var (a, b, c) = (1, 2, 3); | x | x コンパイルエラー | x コンパイルエラー | o 可 | |
| C++ | auto [a, b, c] = arr; | x | x コンパイルエラー | x コンパイルエラー | x | arr は配列 / tuple / struct など |
| Ruby | a, b, c = [1, 2, 3] | o | o nil で埋まる | o 余りの要素は無視 | o 可だが、ただの変数として格納 | |
| PHP | [$a, $b, $c] = [1, 2, 3]; | x | o null で埋まる。 Notice 発生 | o 余りの要素は無視 | o $_ で可だが、ただの変数として格納 |
以下広告