shift() / unshift() is 何?
JavaScriptには、配列の末尾に要素を追加するArray.prototype.push()
と、末尾から要素を取り出すArray.prototype.pop()
メソッドがあります。これ自身はJavaScriptのメソッド名である以前にスタック操作の用語であり、また語の持つイメージとしてもわかりやすい気がします。
一方、配列の先頭に要素を追加するArray.prototype.unshift()
と、先頭から要素を取り出すArray.prototype.shift()
はどうでしょうか?
お...覚えられない...🌋!!!せめて取り除く操作はdequeueであってくれ...🥺
(ggれば一瞬だからそもそも覚える必要がないとか、そんな悲しいこと言わないでください)
かくいう私も一向に覚えられず、MDNとエディタを往復する日々を過ごしていました。頼みの綱のChatGPTに由来を訪ねてもはっきりとしたことは分からず...そんな折にとあるページにたどり着きました。
シェルコマンドのshift
が起源説
両端キュー操作のメソッド名について
JavaScriptとPerlは同用途・同名称のpush
, pop
, shift
, unshift
という名称の両端キュー操作のメソッドを持ちます。Rubyにも同名のメソッドがあり、PHPにはprefixにarray_
をつけた同名のメソッドがあるようです。
上記はPerlMonksというPerl言語に関するコミュニティサイトのページであり、(Perl言語の)push
, pop
, shift
, unshift
はなぜそのように名付けられたのか?という質問に対しての回答が寄せられています。この中の回答を一部抜粋して引用します。
Only 'push' and 'pop' come from the stack terminology....I would say 'shift' comes from shell scripting, where you 'shift' the arguments off of the list passed to the script....'unshift' is probably originates with perl and would have been named by analogy with 'shift' I think.
筆者訳:
'push'と'pop'だけがスタックの用語から来ています。…私は'shift'はスクリプトに渡されたリストから引数を「シフト」するシェルスクリプトから来ていると推測しています。…'unshift'はおそらくperlに由来するもので、'shift'になぞらえて名付けられたのだと思います。
...なるほど..!? 確証はないものの少し核心に迫れた気がします。Perlのshift
メソッドの起源がシェルスクリプトのshiftコマンドにあるとするならば、そのPerlからも影響を受けたと言われているJavaScriptのshiftメソッドの起源もそこにある可能性は十分にあるのではないでしょうか...!?(本当でしょうか)
シェルコマンドのshift
について
最後に、シェルコマンドのshift
について触れて本稿を閉じようと思います。
上記ではshift
コマンドを含む簡単なシェルスクリプトを実行していますが、コマンドライン引数が先頭から順番にシフトして(取り出されて)処理されていることが見て取れるかと思います。厳密な考証は行えていないため真偽はともかくとして、これでもうJavaScriptのArray.prototype.shift()
が配列の先頭から要素を取り出すメソッドであることは忘れないかなと思います。
まとめ
明日からは自信を持ってshift
とunshift
を使っていけそうです。歴史的な経緯などについて知っている賢者の方がみえましたら、コメントで教えていただけると嬉しいです🧑🏻🎓
2023/06/21 追記
実は、本稿に掲載したChatGPTとのやり取りの前に似た質問を訪ねてみたところ、以下の回答が得られていました。
しかし、ECMAScript 1st Editionの仕様書にも2nd Editionの仕様書にもdequeue
メソッドやenqueue
メソッドの記載はなく、これは明らかな誤りだと思われます。やはり、「うそはうそであると見抜ける人でないと(対話型AIを使うのは)難しい」なあと、改めて考えさせられました。