PUROGU LADESU

ポエムがメインのブログです。

Javascriptの落とし穴1

Javascriptクセがスゴイ

ブラウザさえあれば動くし何となくかけるものの危険がいっぱいです。
シンタックスもES6が出てきて劇的に変わったり、ブラウザ問題もあります。
Node.jsでは動作が違ったりここでも使える使えない問題が発生したりします。
JSフレームワークやAltJSを使うと別のクセが出てきてカオス状態です。
AngularJSはクセが強すぎました。JQueryは便利なので大好きです。
インタプリタ言語なのにコンパイラみたいなものを駆使してコード変換をしてがんばります。デバッグも大変。
正直初心者が学ぶ言語としてはふさわしくないと思いますので、素直にRubyとかJavaとかC#とか勉強したほうがいいんではないですかね。

変数宣言

varはつかってはいけません。
基本はconstをつかってください。場合に応じてlet。ただしES6からになります。
let, constはブロック内だけ有効、varはブロックスコープにならず抜けた後も有効。

あと、何もつけないのもやめてください。
参照型はアドレスが入るだけなので注意してください。他の言語も同じですが。

プリミティブ型 number bigint string boolean symbol undefined null
参照型 object array function

比較演算子

==, != はオシャレで気が利いていますがつかってはいけません。
===, !== をつかってください。
いちばん恐ろしいのはtypoです。とくに他の言語をやっている人は自然と==になっていることがあります。
厳密に境界値テストをしないとバグが判明しません。

trueでもfalseでもない

参照型はtrueでもfalseでもない
undefinedはtrueでもfalseでもない
nullはtrueでもfalseでもない
NaNは自分とも等しくない

ifでのデータチェック

空の配列リテラル、オブジェクトリテラル{}はfalseになりません。.length, Object.keys({}).lengthでチェックします。
0, "", null, undefinedはfalseになります。

if ([]) {
    return "if true";
} else {
    return "if false";
}

オブジェクトリテラル

キーは文字列ではありません。
空のオブジェクトにプロパティを追加してるだけなので、プロパティとしてアクセスします。
for..inで列挙が出来ます。(厳密にはシンボルを除いたプロパティが列挙される)
Mapなら文字列が使えますし、便利です。

let obj = { x: 1, y: 2, z: 3 };
console.log(obj["y"]);
console.log(obj.z);
console.log("obj", Object.keys(obj));

配列でfor..in ではなく for..ofをつかう

for..inだとプロパティが列挙されてしまい、配列自体は列挙できません。
for..ofはES6しか使えませんので、その場合は諦めてインデックスで列挙してください。

let fary = ["x", "y", "z"];
for (let val of fary) {
  console.log(val);
}

数字を文字列に

console.log((10).toString()); 

parseInt/parseFloat/Numberは微妙に挙動が違う

変換するだけならNumberをつかう。parseIntは暗黙的に変換される。

console.log(Number.parseInt("100abc")); // 100
console.log(Number("100abc")); // NaN
console.log(Number("3.21e+2")); // 101
console.log("200" - 0); // どちらかが数値なら数値として計算
console.log("200" + 0); // どちらかが文字列なら文字列として結合

ゼロうめ

4 -> 04 にします。前にくっつけて長さを戻します。

console.log(("00" + 4).slice(-2));

シンボル(ES6)

オブジェクトではなく型なので、newはつけたらダメ。
引数が同じでも別物になるため、引数が空でもフラグ定数として使える。

let sym1 = Symbol("sym");
const MONDAY = Symbol();
const TUESDAY = Symbol();