このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

JavaScript関係、主に真偽値と条件式

いずれ本編記事にまとめるが、とりあえずこっちにメモ。

referece型

referece型は内部的使用に限定される型。JavaScriptのアドレス(特に左辺値)のことだが、そもそもアドレスモデルが高水準だから、(base propname)というペア。referenceがオブジェクト参照なのではなく、baseがオブジェクト参照でpropnameがプロパティ名文字列。

referenceの値の操作はGetValue, PutValue関数(これらの関数は仕様記述専用関数)。GetValue(V:ReferenceOrOtherValue), PutValue(V:ReferenceOrOtherValue, W:Any)と使うが、

状況 GetValue PutValue
Vがreferenceではない Vを返す ReferenceError
Vのbaseがnull ReferenceError baseを大域オブジェクトとする

特殊な値

大域変数 他の表記
undefined Undefined Type (void 0)
NaN Number Type Number("a")
Infinity Number Type 1/0

大域変数はreadonlyではない。deleteもできる。Number("a")以外の表記はないのか?

ゼロのようなもの

  • 0 == ""
  • 0 == "0"
  • 0 == "0.0"
  • 0 == "-0.0"
  • 0 == false
  • 0 == null // false!
  • 0 == undefined // false
  • null == false // false
  • undefined == false // false
  • null == undefined
  • "" == null

falseと評価されるもの

  • undefined
  • null
  • 0 (+0, -0), NaN
  • ""

null以外のオブジェクトは、常にtrueに評価される。

  • (new Boolean(false) ? 1 : 0) ⇒ 1
  • (new Number(0) ? 1 : 0) ⇒ 1
  • (new String("") ? 1 : 0) ⇒ 1
  • Boolean(0) ⇒ false
  • Boolean("") ⇒ false
  • Boolean(new Boolean(false)) ⇒ true
  • Boolean(new Number(0)) ⇒ true
  • Boolean(new String("")) ⇒ true
  • Boolean(String(false)) ⇒ true
  • String(Boolean("false")) ⇒ true
  • String(Boolean("")) ⇒ false
  • Boolean(String(Boolean(""))) ⇒ true
  • Boolean(Number("0")) ⇒false
  • Boolean("0") ⇒true

内部メソッド

メソッド 戻り値 例外 備考
Get(プロパティ名:String) Any なし(undefinedを返す)
Put(プロパティ名:String, 値:Any) Void なし(何もしない)
CanPut(プロパティ名:String) Boolean なし
HasProperty(プロパティ名:String) Boolean なし
Delete(プロパティ名:String) Boolean なし(falseを返す)
DefaultValue(ヒント:String) String OR Number TypeError
Construct(...) Object オブジェクト(関数)依存 関数のみ
Call(...) Any オブジェクト(関数)依存 関数のみ
HasInstance(値:Any) Boolean たぶんなし 関数のみ
Match(文字列:String, インデックス:Integer) ? ? 正規表現のみ

正規表現は未調査だが、typeof /a+b/ がfunctionであることに注意。データ型以外に、内部プロパティであるClassがあり、正規表現RegExpクラス(Class内部プロパティの値がRegExp)。

その他雑多

  • NaNはfalseになる。
  • undefinedはNaN、nullは0になる。
  • ToInt32では、なんとNaN, +∞, -∞が0になる。
  • NaN === NaN はfalse、a + 1 + 2 === a + 2 + 1
  • (1 + "2")*3 ⇒ 36
  • && と || は変態、(?:)はマトモ
  • true == 1, true == 2 の結果は違う
  • true == "2" はfalse
  • if (2) print("YES"); if (2 == true) print("YES")
  • if ("0") print("YES"); if ("0" == true) print("YES")

ミステリアス、不思議な世界。

[追記]
true == 2 は、Boolean(2)とtrueが比較されるのではない。Number(true) と 2が比較される。true == "1", true == "2", false == "0", false == "" でも同じ。
[/追記]