Twitter hashtag: #esspec
自己紹介 (近況報告)
syumai
GoとTSやってます
Jun Yasumura / harupiyo Jun Yasumura.icon
noyannoyan.icon
Redwoodというフルスタックフレームワークでアプリケーションの作り方を学んでいます
ライブラリを組み合わせて使う文化で獲得しづらい、規約のコード化が参考になって良いです
ただtsconfigが strict:true でなく、ボイラープレートでもanyがある
マイクを変えました
tars0x9752 (たーず / naoki aoyama) tars0x9752.icon
godot はじめました
シンプルに絵などのアセットを用意するのが大変
ドット絵始めたけど難しい
Haskell/PureScript 触ったり
ぼちぼち仕事を探し始めたり
yebis0942yebis0942.icon
マイクを変えたけどもしかして声が入らないかもしれない
声を張っていきたい
Nozomu Ikuta NozomuIkuta.icon
おーみーaumy.icon
前回のあらすじ
The Abstract Closure Specification Type とか Data Blocks(←むずそう) とか PrivateElement type とか
Environment Record まわりは9.1 ←これも読む必要ありそう
ClassFieldDefinition Record Specification Type のところまで
Private Name specification type
グローバルにユニークな名前を説明するのに使われる
プライベートなクラスの要素を表現するキーとして使われる
要素: フィールド、メソッド、アクセサ
one which differs from any other Private Name, even if they are otherwise indistinguishable
どういう意味なのか?
他のPrivate Nameとは区別される(たとえ他の方法では区別がつかなくても)
ということか?
[[Description]]というフィールドを持つ
値はimmutableなString
どんな使われ方をしているのか?どんな値がセットされるのか?
追っていくとEnvironment Recordが出てきたので一旦打ち切り
yebis0942.icon [[Description]]で全文検索した感じだと、値をセットしているのはSetFunctionNameだけっぽい気がする
yebis0942.iconリンクの使い方が新しい!
The ClassStaticBlockDefinition Record Specification Type
Class Static Blockとは?
code:js
class C {
// class static block
static {
this.foo = "foo"
}
}
こんな機能あったのか
MDNの関連リンクを見た感じだとES2022で入ったらしい 生成される箇所を見てみる
Runtime Semantics: ClassDefinitionEvaluation
g. Else if element is a ClassStaticBlockDefinition Record, then
i. Append element to staticElements.
Abstract Operations
abstract operationはこの章の前にもたくさん定義されているが、ここでは一般性のあるものを定義している
Type Conversion
The conversion abstract operations
型変換用のやつ
任意の ECMAScript language type を受け取れる.(その他の specification type は受け取らない)
polymorpihic
must call BigInt explicitly はBigInt(num)のことを指しているのかな?noyan.icon
callなのが気になって
そんな気がしますね tars0x9752.icon
(英語) sorely: もっぱら、単に
ToPrimitive
Inputをオブジェクト以外の型に変換する
複数の変換候補がある(number と string )場合、preferredTypeの指定を尊重して変換を行う。
preferredTypeはstring or number
オブジェクトに@@toPrimitiveというメソッドが生えていれば、それを使って変換する
さもなければOrdinaryToPrimitiveにフォールバックする
@@: well known symbol
GetMethod(input, @@toPrimitive).
input に生えている @@toPrimitive というシンボルのメソッドを取得
ではなさそう
exoticToPrimというエイリアスを使っているのはなぜ?
フォールバック先のOrdinaryToPrimitiveとの対比としてexoticという言葉を使っていそう
OrdinaryToPrimitive
オブジェクトのvalueOf, toStringを呼んでいる
hintに応じてどちらを先に呼ぶかを変えている
« "toString", "valueOf" »って何?
ECMAScript language valueである"toString"と"valueOf"を要素として持つList type
List typeは順序を持つ
取得したメソッドがcallableでない場合とは?
たとえば定義されていないとか、関数ではないとか
たとえばBooleanはtoStringだけを持っているので、文字列にしか変換できない
感想: valueOfはもっと返り値の性質をイメージしやすい名前にしてもよかったのでは。
ToBoolean
Numberでは+0, -0について言及され、BigIntでは言及がないのは?
Numberは浮動点小数なので+0, -0の区別があるため
[[IsHTMLDDA]]: 悪名高いdocument.all
code:js
document.all.foo = "foo" // document.allはオブジェクトとして存在するが…
// 特例的に以下のような不可思議な挙動をする
Boolean(document.all) // false
document.all == undefined // false
typeof document.all // "undefined"
IE4で追加されたプロパティ
仕様に追加されたのはいつなんでしょうね
document.all を利用して IE であるかどうかを判断しているコードでは「IE ではない」と伝えたいので、ただ document.all の存在をチェックしている場合に限っては「存在しない」という値を返すようになったのです。
DDA は document dot all の略
こちらにも記載がありました
一方で、IE のみが実装していた時代に、 document.all の有無で IE とそれ以外のWebブラウザーを分岐する悪習が広まっていました。 document.all を実装しなければならないが、 if (document.all) { ... } を実行してはならない、 という難題でありましたが、 document.all オブジェクトは比較時に偽と評価される、 との特例で解決されることとなりました。
ニンテンドーDSiブラウザー では document.all は真になるらしい
こちらの歴史のまとめが詳細ですごい
yebis0942.icon ToPrimitiveと違ってargumentの型を指定してないけど、ECMAScript language typeしか受け取らないっぽいですね
ToNumeric
値をNumberもしくはBigIntに変換する
処理の大半はToPrimitiveとToNumberに委譲されている
StringとBigIntを比較するとundefinedになる
syumai.icon 正確に言うと、StringをBigIntに変換した結果がundefinedだった時に、StringとBigIntの比較結果がundefinedになるっぽい感じでした
code:js
false < true // true
true < false // false
ToNumber
いろいろな面白い変換がある
code:js
// nullとundefinedで挙動が違う
-1 < null // true (null -> 0)
-1 < undefined // false (undefined -> NaN)
// 文字列がスッと数値になる
"111" < 222 // true ("111" -> 111)
Objectを渡した場合
ToNumberが二度呼ばれる
NumberコンストラクタとToNumberは違うもの
yebis0942.iconBooleanが0, 1になるのはC/C++っぽい感じしますね
ToNumber Applied to the String Type
stringにToNumberを適用した場合の説明
「以下の文法を適用する」といって構文規則が提示されている
:::なのでThe Numeric String Grammar
StringNumericLiteralを終端記号としている
NumericLiteralとは若干挙動が違う
StringNumericLiteralとNumericLiteralの挙動の違い
Numberに渡すとStringNumericLiteral, コードとして書くとNumericLiteral
code:js
Number("1_0") // NaN
1_0 // 10
Number("1n") // NaN
1n
Number("010") // 10
010 // 8
空文字列や空白のみの文字列は0になる
code:js
Number("") // 0
Number(" ") // 0