0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Javascript Arrayの破壊・非破壊ってなんぞや

Posted at

JSで配列を扱っていると、どうしても破壊・非破壊メソッドにぶち当たるからまとめてみた

そもそも破壊・非破壊メソッドって何よ

配列の操作をした時に、元の配列の中身を変えてしまうのが破壊的メソッド

const array1 = [ 1, 2, 3, 4, 5 ]
// 配列を反転する
const array2 = array1.reverse()

console.log(array1)
// [ 5, 4, 3, 2, 1 ]
console.log(array2)
// [ 5, 4, 3, 2, 1 ]
// array1自体が書き換えられる

元の配列のコピーを作ることで、元の配列の中身を変えないのが非破壊的メソッド

const array1 = [ 1, 2, 3, 4, 5 ]
// 配列を反転する
// スプレッド構文を使用して新しい配列を作成する
const array2 = [...array1].reverse()

console.log(array1)
// [ 1, 2, 3, 4, 5 ]
console.log(array2)
// [ 5, 4, 3, 2, 1 ]
// array1自体はそのまま!

破壊的メソッドの何が問題なの??

const array1 = [ 1, 2, 3, 4, 5 ]
// とても長い処理
array1.push(6)
// とても長い処理
console.log(array1)

こんな処理があったときに、[ 1, 2, 3, 4, 5 ]を期待していると、[ 1, 2, 3, 4, 5, 6 ]が出力される。
破壊的メソッドを読み飛ばしてしまって、コードの可読性やトレーサビリティがめっちゃ低くなる。
さらにはarray1にコードジャンプした時にもなかなか追跡できずストレスフル。(個人の感想です)

非破壊で書き直す

const array1 = [ 1, 2, 3, 4, 5 ]
// とても長い処理
const array2 = [ ...array1, 6 ]
// とても長い処理
console.log(array2)

こんな感じ。
出力に使っている配列がどこで定義されているか、中身が何かが追跡しやすい。
「とても長い処理」の中でarray1を参照したい時にも、array1の中身に影響がないから使いやすい。

最後に

もちろん非破壊的メソッドでできないこともあるはず。
どうしても破壊的メソッドが使いたいときは、スプレッド構文でコピーしてから使うこと!
約束だぞ!

参考

[JavaScript] Arrayメソッド破壊・非破壊チートシート

0
0
1

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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?