🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

2回答

2606閲覧

javascriptでsplice()を使ったプログラムが理解できません。。

miiiiiko

総合スコア4

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/09/09 05:40

前提・実現したいこと

ドットインストールでjavascriptを学んでいます。
その中で数字タッチゲームを作っています。
その中で、splice()を使ったプログラムが理解できませんでした。

発生している問題・エラーメッセージ

const num = nums.splice(Math.floor(Math.random() * nums.length), 1)[0];

のところで、最後に配列[0]をつけていることがわかりません。
[0]をつけずに実行したところプログラムは[0]をつけた時と同じように動いていました。
[0]をつけなくても、ランダムにnumsからひとつずつ要素を取りだして、numに代入されるのではないですか?

該当のソースコード

JavaScript

1'use strict'; 2 3{ 4class Panel { 5constructor() { 6this.el = document.createElement('li'); 7this.el.classList.add('pressed'); 8} 9 10getEl() { 11return this.el; 12} 13 14activate(num) { 15this.el.classList.remove('pressed'); 16this.el.textContent = num; 17} 18} 19 20class Board { 21constructor() { 22this.panels = []; 23for (let i = 0; i < 4; i++) { 24this.panels.push(new Panel()); 25} 26this.setup(); 27} 28 29setup() { 30const board = document.getElementById('board'); 31this.panels.forEach(panel => { 32board.appendChild(panel.getEl()); 33}); 34} 35 36activate() { 37const nums = [0, 1, 2, 3]; 38 39this.panels.forEach(panel => { 40const num = nums.splice(Math.floor(Math.random() * nums.length), 1)[0]; 41panel.activate(num); 42}); 43} 44} 45 46const board = new Board(); 47 48const btn = document.getElementById('btn'); 49btn.addEventListener('click', () => { 50board.activate(); 51}); 52}

試したこと

MDNでも調べたのですが、
「取り除かれた要素を含む配列です。要素が 1 つのみ削除された場合は、要素数 1 の配列が返されます。要素が削除されなかった場合、空の配列が返されます。」
と記載されており、最後に配列をつけるとは書いてなかったため、疑問のままです。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/09/09 05:43

>MDNでも調べたのですが、 出典をURLで明示してください。
m.ts10806

2019/09/09 06:12

質問本文に提示していただけたらと。
guest

回答2

0

[0]をつけなくても、ランダムにnumsからひとつずつ要素を取りだして、numに代入されるのではないですか?

動作は違います。spliceの返り値は切り出した配列なので、[0]なしだとnumには1個だけの配列が入ります。[0]をつければ入っていた値が取れます。

この1個だけの配列がPanel.activateに引き渡されますが、this.el.textContent = num;で文字列化しているだけなので、1個の配列を文字列化する処理となり、[0]の中身がそのまま文字列化されます。

ということで、[0]なしでもたまたま動いてしまっていただけです。

投稿2019/09/09 05:46

maisumakun

総合スコア145963

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

最後に配列[0]をつけていることがわかりません。

spliceで得られるデータが配列だからです
データが配列の場合1個しかデータがなくても[0]をつけて得ないといけません

投稿2019/09/09 05:43

yambejp

総合スコア116661

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問