0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

{} の扱いに関するミス! → ✅ {} の意味と使い方をまとめた!

Posted at

最近解いていた問題でよくforEach()を使っていたので、=>の後に{}を使うから癖でやってしまった。
ここで、改めて{}についてよくある失敗例や、ルールを整理したい!

{} の扱いに関するミス! 気づいたきっかけ(実体験)

今日もいつも通りpaizaの問題に挑戦していた!


問題概要

  • 最初に整数 N(行数)が与えられる。
  • N 行のデータが与えられ、各行はスペース区切りの整数のリスト。
  • 各行の 最初の数字はカウント(不要な情報) で、それを除いた残りの数字をそのまま出力する。


入力例

3
1 8
2 8 1
3 8 1 3

出力例

8
8 1
8 1 3

🌋ミスったコード

const rl = require('readline').createInterface({input:process.stdin});
const lines = [];

rl.on('line',(input)=>{
    lines.push(input);
});

rl.on('close',()=>{
    const N = Number(lines[0]);
    const nums = lines.slice(1).map(num => {num.split(' ').map(Number)});
    
    for(let i = 0; i < N; i++){
        console.log(nums[i].slice(1).join(' '))
    }
    
});

🌋ミスったポイント

const nums = lines.slice(1).map(num => {num.split(' ').map(Number)});
  • map() 内で {} を使うと、関数の戻り値が undefined になる({} をブロックとして扱ってしまう)。
  • .map(Number) を適用しても結果を return していないため、nums の中身が undefined になってしまう。


✅修正
map() の中で {} を使わず、=> のすぐ後ろに式を記述。

lines.slice(1).map(line => line.split(' ').map(Number))

(このコードなら、別に数値型に変換しなくても良かったかもと、今更思ったり (´;ω;`) )



✅ {} の意味と使い方

JavaScript では{}2通りの意味 で使われる。

① ブロック(制御構造)

ifforEach などの制御構造で使われる {} は ブロック(処理のグループ化) の意味。

const arr = [1, 2, 3];

arr.forEach(num => {
    console.log(num * 2); // {} はブロックなので return 必須
});

これは ブロック なので、関数の結果(戻り値)は 自動で return されない。
そのため、値を返したい場合は return を明示する必要がある。


② オブジェクトリテラル

{} は オブジェクト を表すこともある。

const obj = { name: "Alice", age: 25 }; // これはオブジェクト

❌ よくある失敗例

  1. map(){} を使って return しない

間違い:

const nums = [1, 2, 3];

const squared = nums.map(num => {
    num * 2; // return しないので undefined
});

console.log(squared); // [undefined, undefined, undefined]

正しくは:

const squared = nums.map(num => num * 2); // `{}` を省略
console.log(squared); // [2, 4, 6]

または return を明示:

const squared = nums.map(num => { return num * 2; });
console.log(squared); // [2, 4, 6]



2.オブジェクトを返したいのに {} がブロック扱いされる

間違い:

const users = ["Alice", "Bob"];

const userObjects = users.map(name => { name: name }); // {} がブロック扱いされる

console.log(userObjects); // [undefined, undefined]

正しくは:

const userObjects = users.map(name => ({ name: name })); // `()` でオブジェクトと明示
console.log(userObjects); // [{ name: "Alice" }, { name: "Bob" }]



✅ {} を使うかどうかのルール

スクリーンショット 2025-04-09 224258.png


📌 結論

  • 処理が1行なら {} なしで return 省略OK
  • {} を使うと return 必須
  • オブジェクトを返すときは ({ key: value }) の形にする



✅ ブロック ({}) とは?

ブロック とは、 1つ以上のステートメント(処理)をまとめる構造 のこと。
JavaScript では{}(波かっこ)を使ってブロックを定義する。


📝 ブロックの主な用途

  • 制御構造のブロック
  • 関数のブロック
  • スコープのブロック


① 制御構造のブロック

iffor などの制御構造で使われる {}

if (true) {  // ← ここから
    console.log("This is a block!"); // ここまでがブロック
}

for (let i = 0; i < 3; i++) {  // ← ここから
    console.log(i); // ここまでがブロック
}
  • ブロックの中に複数の処理をまとめられる
  • ブロック内の変数 (letconst) はブロック外からアクセス不可


② 関数のブロック

関数の処理を {} で囲む

function greet(name) {  // ← ここから
    console.log("Hello, " + name); // ここまでがブロック
}
greet("Alice");
  • 関数の処理を {} でまとめる
  • 関数のローカル変数もブロック内に閉じ込められる


③ スコープのブロック

ブロックごとに変数のスコープ(範囲)が決まる

{
    let x = 10; // ブロック内の変数
    console.log(x); // 10
}
console.log(x); // ❌ エラー (x is not defined)
  • ブロック内で letconst を使うと、外からアクセスできない
  • ブロックごとに変数のスコープが独立


❌ よくあるミス

  1. iffor のブロックを省略して意図しない動作
if (true) 
    console.log("Hello");
    console.log("World"); // ← `if` の外なので常に実行される

正しくは:

if (true) {
    console.log("Hello");
    console.log("World"); // これで意図通り
}


2. {} を使ったのに return し忘れる

const double = num => { num * 2 }; // `{}` を使ったので return 必須
console.log(double(5)); // undefined

正しくは:

const double = num => { return num * 2 };
console.log(double(5)); // 10

または:

const double = num => num * 2; // `{}` を省略すれば return 不要
console.log(double(5)); // 10


✅ まとめ

  • ブロック {} は処理をまとめるために使う
  • if や for でブロックを省略するとバグの原因になる
  • アロー関数で {} を使うと return が必要



✅ ブロック {} vs. オブジェクト {} の違い

スクリーンショット 2025-04-09 224356.png


🔹 見分け方

  • iffunction の後の {} → ブロック
  • = の右側にある {} → オブジェクト


✅ まとめ

  • ブロック {} は処理をまとめる
  • オブジェクト {} はデータをまとめる
  • 見た目は同じでも、用途とルールが異なるので注意!




おまけ 発端のforEach()について

✅ 省略形(1行なら {} なしでもOK)

array.forEach(a => console.log(a));

console.log(a); だけなら {} なしで書ける



{} を使った書き方(1行でも使える)

array.forEach(a => { console.log(a); });

{} を使っても動くが、1行なら省略できる



🌋どっちでもいいけど、短く書けるなら {} なしの方がスッキリする



map() では 1行でも {} を使うと意図しない動作になる ことがある。

🔴 map(){} を使うと undefined が返る

const arr = [1, 2, 3];

const result = arr.map(num => { num * 2 });
console.log(result); // [undefined, undefined, undefined]

理由:

  • {} を使うと、ブロック(処理のまとまり) と解釈される。
  • return を明示しないと、値を返さない(undefined になる)。



✅ 正しい書き方(1行なら {} を省略)

const result = arr.map(num => num * 2);
console.log(result); // [2, 4, 6]


✅ ブロックを使うなら return を書く

const result = arr.map(num => { return num * 2; });
console.log(result); // [2, 4, 6]



forEachmap の違い

  • forEach() → 返り値なし(処理を実行するだけ)
  • map() → 配列を返す(return が重要)

だから、

forEach(){} を使っても問題なし
map(){} を使うなら return が必要
という違いがあるんだ!



僕の失敗談(´;ω;`)🚀

0
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?