LoginSignup
15
5
この記事誰得? 私しか得しないニッチな技術で記事投稿!

「もう1年以上JavaScript書いてるのに、どっちがshiftなのか覚えられないんだけど?!」

Last updated at Posted at 2023-06-19

shift() / unshift() is 何?

JavaScriptには、配列の末尾に要素を追加するArray.prototype.push()と、末尾から要素を取り出すArray.prototype.pop()メソッドがあります。これ自身はJavaScriptのメソッド名である以前にスタック操作の用語であり、また語の持つイメージとしてもわかりやすい気がします。

一方、配列の先頭に要素を追加するArray.prototype.unshift()と、先頭から要素を取り出すArray.prototype.shift()はどうでしょうか?

お...覚えられない...🌋!!!せめて取り除く操作はdequeueであってくれ...🥺
(ggれば一瞬だからそもそも覚える必要がないとか、そんな悲しいこと言わないでください)

かくいう私も一向に覚えられず、MDNとエディタを往復する日々を過ごしていました。頼みの綱のChatGPTに由来を訪ねてもはっきりとしたことは分からず...そんな折にとあるページにたどり着きました。

shiftとunshiftについて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コマンドの実行サンプル

上記ではshiftコマンドを含む簡単なシェルスクリプトを実行していますが、コマンドライン引数が先頭から順番にシフトして(取り出されて)処理されていることが見て取れるかと思います。厳密な考証は行えていないため真偽はともかくとして、これでもうJavaScriptのArray.prototype.shift()配列の先頭から要素を取り出すメソッドであることは忘れないかなと思います。

まとめ

明日からは自信を持ってshiftunshiftを使っていけそうです。歴史的な経緯などについて知っている賢者の方がみえましたら、コメントで教えていただけると嬉しいです🧑🏻‍🎓

2023/06/21 追記

実は、本稿に掲載したChatGPTとのやり取りの前に似た質問を訪ねてみたところ、以下の回答が得られていました。

shiftとunshiftについてChatGPTに聞いてみた結果

しかし、ECMAScript 1st Editionの仕様書にも2nd Editionの仕様書にもdequeueメソッドやenqueueメソッドの記載はなく、これは明らかな誤りだと思われます。やはり、「うそはうそであると見抜ける人でないと(対話型AIを使うのは)難しい」なあと、改めて考えさせられました。

15
5
11

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
15
5