人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

JavaScriptのfor文について質問します。2つあります。
1)添付した画像とおり、
for(i=0; i<frs.length; i++)とした場合も
for(var i=0; i<frs.length; i++)とした場合も、
同様の出力になります。
i=0と、var i=0どちらが正式でしょうか。

2)出力したあと、undefinedが続きます。どこか未定義のようなのですが...気になります。



1512804219
●拡大する

●質問者: torimaki
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
ベストアンサー

Node.js をコンソールで使っている、とかいう状況ですよね。

>1)添付した画像とおり、
添付の画像の範囲だと、どちらが正式とか、あまり関係ありません。

var つきで変数宣言をすると、その変数は、関数の中だけで有効になります。
つけないと、どこでも参照できる。

こんな場合で、差が出てきます。

function hoge(arr) {
 for (i = 0 ; i < arr.length ; ++i) { // var なし
 console.log(arr[i]);
 }
}

hoge(['apple', 'orange', 'strawberry']);
console.log(i); // 3 って、表示される

function hoge(arr) {
 for (var i = 0 ; i < arr.length ; ++i) { // var つき
 console.log(arr[i]);
 }
}

hoge(['apple', 'orange', 'strawberry']);
console.log(i); // undefined って、表示される

C言語由来の変数スコープが念頭にある人たちが書きだしたのでしょうけれど、あまり差がない(なくはないけど)。
for の中だけに閉じ込めておきたいなら、var じゃなくて let を使うのが正式です。

for (let i = 0 ; i < frs.length ; ++i) { // let を使う
 console.log(arr[i]);
}
console.log(i); // undefined って、表示される


>2)出力したあと、undefinedが続きます。どこか未定義のようなのですが...気になります。
Node のコマンドプロンプトは、打ち込んだ文や式の評価値を最後に出力します。

気になっているところは、for 文の評価値が表示されてます。
for 文は、値を持たないので、undefined が表示されます。

Node のプロンプトから、以下のように打つと、

> console.log("a-kuma3")

こんな感じで表示されます。

> console.log("a-kuma3")
a-kuma3
undefined

最初の "a-kuma3" が console.log の出力で、次の undefined は、console.log の戻り値です。
console.log メソッドは、戻り値を返さないので、undefined と表示されます。


torimakiさんのコメント
a-kuma3さん、いつもご回答、ありがとうございまーす。 日曜大工さながら、休日プログラミングをやっております。ずっと、考えていたら、頭がパンパンになってまいりました。あしたの朝、スッキリした状態で、読ませていただきまーす。しばし、お待ちを!

torimakiさんのコメント
a-kuma3さん i=0、 var i=0 のちがいについては、おかげさまで、ほぼほぼ理解できました。 前者は関数の外にも反映されてしまう。 後者は関数内だけ有効といった感じでしょうか。 a-kumaさんの実例、じっさいに手を動かしてやってみました。 i=0、for i=0両方とも、console.log(i)による標準出力が3になってしまいました。?どこか打ち間ちがえたはずですが、それが分からないという。うー。 [f:id:torimaki:20171210114927p:image] var、const、letは、にらみの範囲(スコープ)のちがいみたいな。こちらは、おいおいマスターしていきたいと存じます。 たとえばコンソールというのは、戻り値中心の設計になっていて。戻り値を返さないときのみundefineになってしまうのでしょうか。 それともundefineはもっと広い意味の、文字どおりundefine「未定義」を示すものでしょうか。

a-kuma3さんのコメント
>> i=0、for i=0両方とも、console.log(i)による標準出力が3になってしまいました。?どこか打ち間ちがえたはずですが、それが分からないという。うー。 << これは、先に for(i=0; の hoge を呼び出したときの i=3 が残っちゃってるんです。 for(var i=0; の i は、関数 hoge の中だけに有効なんですけど、だからこそ外の i=3 に影響を与えていない。 Node を立ち上げた直後に、↓のようにやれば、undefined と表示されます。 >|| > function hoge(arr) { for (var i = 0 ; i < arr.length ; ++i) { // var つき console.log(arr[i]); } } undefined > hoge(['apple', 'orange', 'strawberry']); apple orange strawberry undefined // 関数 hoge の戻り値 > console.log(i); // undefined って、表示される undefined ||< >> それともundefineはもっと広い意味の、文字どおりundefine「未定義」を示すものでしょうか。 << こっちです。 >|| > obj = {} {} > obj.k undefined > obj.k = 10 10 > obj { k: 10 } > k ReferenceError: k is not defined グローバルな変数は、ちょっと挙動が違う > k = 10 10 > k 10 > let j 宣言しただけ undefined > j なので、値を持ってない undefined > let m = 100 宣言と同時に、初期化もする undefined let 文は、値を持ってない > m m は、値を持ってる 100 ||< ちょっと難しい言い方ですけれど、プロンプトに打ち込んだ文を評価した結果を表示する、というふうに動いています。 代入文は、その代入した値が値として評価されます。 let や function 文は値を持ちません。なので、評価した値としては undefined です。

torimakiさんのコメント
iとfor iの件、「ケガの巧妙」と言いましょうか、とても分かりやすいです。 undefinedの件、現状では理解できないっぽいです。これからの宿題とさせてください。 貼っていただいた画像、とても重要なことが示唆されているような予感がしたりしていまーす。

a-kuma3さんのコメント
>> undefinedの件、現状では理解できないっぽいです。これからの宿題とさせてください。 << 難しいことだと思います。ぼくも、うまく説明できません。 普通にプログラムを書くときには、undefined を積極的に使うことはあまりなくて、変数やプロパティは使う前に初期化する必要があるよね、くらいで良いと思います。

torimakiさんのコメント
勉強になりました。ありがとうございます!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ