ttkyojin
@ttkyojin

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JavaScript コードが思った結果にならない。

JavaScript コードが思った結果にならないです。

解決したいこと

[正常な結果]       
[ ]
["dog"]
["dog","cat"]
["dog"] =>catを削除したいです。

[現状の結果]
[ ]
[1]
[1,1]
[1,1,1] =>削除どころか増えてます。
数字になってしまいます。

[やったこと]
mdnのテストサイトで
splice(0,1)で削除出来そうでしたが実際は上記結果でした。
sliceやpopなども試みたのですが同様の結果です。
下記に現状のcodeをお見せするのですが
先頭の関数に戻ってくるのが原因か分からないですが
なるべく現状のプログラムを壊さないよう解決出来ないでしょうか?
順番に解かないと出来ないパターンのcodeです。
是非ともご教授お願いいたします。

[3つまで正常なcode]
①番目=>[ ]が期待値
let result = [];
function getTweet() {

}console.log(result);

// test(getTweet(), []);//=>期待値1
/////////////////////////
②番目["dog"]が期待値
function animalTweet(animal){
result.push(animal);

}

animalTweet("dog");
// getTweet(), ["dog"];//=>期待値2
////////////////////////////
③番目["dog","cat"]が期待値
function animalTweet(animal1) {
result.push(animal1);
}console.log(result);

animalTweet("cat");
console.log(result);
// getTweet(), ["dog","cat"]);//=>期待値3
/////////////////////////////////////////////////
④番目["cat"]dogを取り去ったものが期待値=>ここで行き詰まってます。
function animalTweet(animal2) {
result.splice((animal),0,1);

}

animalTweet("dog");//=>dogを削除したいです。
// getTweet(), ["cat"]);//=>期待値4
console.log(result);

0

1Answer

まず明らかな間違いとして関数名animalTweetが衝突します.functionは最も遅い定義が優先され,同じ名前の関数を上書きします.
重複を避けることはもちろんですが,関数名は分かりやすいものをつけてください.

JavaScriptにおいては 巻き上げ(Hoisting) がこのようにバグを生じることがままあります.詳しい解説は割愛しますが,function宣言はvarと同じような扱いをする必要があることに注意してください.ただこの手の問題はletconstを代わりに使用すると防げる場合"も"あります(letconstも巻き上げ自体は防げません).

function getTweet() {

}
// test(getTweet(), [])

各所に書いているこのテストは,実際のテストライブラリではpassしません.returnのないfunction返値は既定ではundefinedです.
そもそもresultで管理しているはずなのにgetTweet()をtestしようとする意図が不明ですが…

function animalTweet(animal2) {
result.splice((animal),0,1);

}

スコープにないanimalを使用しています.それからおそらくspliceの用法を間違っておられるようです.
spliceの用法は以下をご確認ください.

1Like

Your answer might help someone💌