別の方のコメントにもありますが、これをすると left 以外 (current と answer) は暗黙的な var 宣言の扱いになってしまいます。意図せずスコープが壊れるのでお勧めしません。
var は関数スコープで、何もつけないとグローバルスコープなのでは?
functionsample(){let left =0// ローカル変数var current =0// ローカル変数
answer =0// グローバル変数}sample();console.log(answer)// グローバル変数なので表示できるconsole.log(current)// ReferenceError: current is not defined
Discussion
あと十点追加しても大丈夫w
競技プログラミングならありだけど、プログラミング教育なら動作の違いも把握しておくのがいいですね。
これ、left だけが let(ローカル変数) で current と answer はグローバル変数になります。
これ、厳密比較ではなくなります。
別の方のコメントにもありますが、これをすると left 以外 (current と answer) は暗黙的な
var 宣言グローバル変数の扱いになってしまいます。意図せずスコープが壊れるのでお勧めしません。あらかじめ個別に let 宣言しておくか、構造分解で宣言するといいと思います。
整数の場合は良いですが、浮動小数点数の場合はアンダーフローに注意が必要です。
Map.prototype.keys()が返却するのはイテレーターでもあり反復可能オブジェクトでもあるので、実は上のコードでもイテレーターを使えています。arrに代入されるのは配列ではなく反復可能オブジェクトで、これは for...of でイテレーターを使ったループができます。Object.keys(obj)は配列を返却するので、これと混同しているのだと思います。length をキャッシュしても、以前試したときは全く差がありませんでした。ランタイムによって実行時に最適化されると思うので、あまり気にしなくていいと思っています。
var は関数スコープで、何もつけないとグローバルスコープなのでは?
昔測った時は結構差あったんだけど、今はもうコードのスタイリング意識した方が良くなっちゃった…
shiracamus さん、ご指摘ありがとうございます!
普段使うことがないのでずっと勘違いしていました……。
現在だと v8 では JIT レベルで 最適化の結果 ループの外に cache されていますね。
面白い記事でしたが、何点か気になったのでコメントさせていただきます。
ECMAScriptの仕様 (https://262.ecma-international.org/#sec-math.log10) 的には
Math.log10は実装依存の近似値 (implementation-defined approximated Number value) を返すので、桁数の判定には使わない方が安全です。例えば、手元(x86_64 macOS)のNode.jsでは
1e15 - 1に対してMath.log10(n)はちょうど15を返しました。JavaScriptにおけるビット演算子による整数化は、0方向に切り捨てるという挙動となります。一方、
Math.floorはマイナス無限大方向に切り下げる関数なので、負の小数を与えた時の挙動が異なります。log10の出力は当然浮動小数点数なので、極限まで近いと潰れちゃうんですよね。現実的な対策としては、入力と
10**nを比較して入力の方が小さければ -1 するとかですかね。いろいろコメントがついていますが、記事があってはじめていろいろ議論できているので、遠慮なく記事投稿しちゃっていいと思います。
letの使い方を見ると、全体的に JavaScript に慣れていないような印象を受けました(定数やfor...ofの変数宣言は普通constです)。ネット上の資料は質がまちまちですので、いろいろな情報を比較して、新しめのいいコードを参考にしてみてください。これは falsy な値、つまり
unefinedだけでなく、nullや0や''(空文字)なども通してしまうので、と同じではないです。
こういうケースの場合は
||=ではなく??=を使った方が近い挙動をしますね。こちらも
undefinedとnullだけを通すので、まだ=== undefinedと同じ挙動ではないです。(が、明確に
nullとundefinedは区別しなくても問題ないケースが多いと感じます。)いろいろご指摘ありがとうございます。勉強になります。一部「侮辱」と受け取れるコメントには違反報告をして非表示にしました。スクショは撮りましたので情報開示後、現在「侮辱罪」として成立し得るか確認中です