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 == "" でも同じ。
[/追記]