サイ本の読書会行ってきました。
http://cotocoto.jp/event/2880
仕事と場所の関係で大幅に遅刻さんだったのだけど、とりあえず参加できた範囲でまとめますだ。
まとめは人のためならず。
まとめることは再確認になって、自分のためになると思います。
とりあえず1時間遅刻して入ると
>>> undefined = 3; undefined;
3
的な事がかかれてた。
37Pにあるけど、undefinedは予約語ではないので書き換えられるって事やね。
後Lingrにあるけど。
# undefined = "a"
# undefined //=> "a"
# array = new Array(10)
# array[0] //=> null
# array[0] + 0 //=> NaN
# typeof(array[0]) //=> undefined
# window.undefined //=> "a"
識別子であるundefinedを書き換えても、新たに生成される未定義値はundefinedになるので、参照ではなく実態な感じという話しだったのかしら。
ついた時点で47Pまで終わって、49~80P読むよーってなった。
○P56 4-6-1 グローバルオブジェクト
が物議を醸してた。
まずはフレームで切ってる場合のグローバルオブジェクトはフレーム単位で切られるのか?って話し。
実際、グローアバルオブジェクト=windowオブジェクトということらしいので、windowオブジェクトはフレーム毎に分かれてるので別々という事になる。
でも、windowオブジェクト同士はselfなりparentなりtopなりでアクセス可能。
では、グローバルよりもグローバルな所があって、全windowオブジェクト管理してんのか?
(なんか話はあやふやに終わった気がする もしくは結論聞き逃した。
そもそもフレームが切られた場合って、実行順序どうなるのかしら?
実行中のフレームwindowのCallオブジェクトがスコープチェーンの先頭になってて、フレームが切り替わると順序が並べ替えられてるとかそーゆー事だったりするんのかな?
よくわからん( ´-`)?
-------------------------
「クライアントサイドJSにおいて、ブラウザウィンドウの全JSコードに対してグローバルになるのがWindowオブジェクトだ」って記述。(要約)
windowがグローバルオブジェクトなら、そこから参照してるwindowはどうなってんだ?って話しなんだけど、結論としては自己参照という話だった。
要するに
window === window.window //true
window === window.window.window //true
window === window.window.window.window //true
window === window.window.window.window.window //true
.......
っと言うわけさ。
ついでに
window === this //true
window === window.self //true
というわけで全部一緒。
ってか実装者はなんでselfなんて用意してるんだ?って話になってた。
正直他で代替できるし使う事は無い。
むしろ他の実装時にselfってやるとかぶる。
selfは要らない子
どっちかというと害になる子
○演算子 P60-P61
色んな演算子があるもんだ( ´-`)
覚えるのめんどくせーな( ´-`)
・XORって整数値はあるのに、論理値無いんだなって話し。
ujihisaの変態的な発想に磨きがかかります。
でも大体の人は、
a && !b
でいいだろって話。
そこから使用頻度云々という話しになって、
・三項演算子は使うのか?
って話題になった。
使う人と使わない人で意見がわかれる。
使う人は1行にまとめて可読性をあげるため。 使わない人は可読性が下がるから。
あれー?
まぁTPOに応じてって事なんだろうけどね。
俺は使う派ですが、それも場が限られてはくる。
後、XORは整数値でしか使えないので、
true^true //0
結果は数値で帰る。
これは内部で暗黙的型変換によって「1^1」に変換されてるから。
○左辺値ってなんだ? P61
「代入文の左側に記述しても良い式」
識別子じゃなくて『式』
a[1] とかも式。
頭と最後にPが点く、真ん中がHの3文字の言語だと
list($x, $y, $z) = array("abc", "def", "ghi");
みたいな気持ち悪い左辺値もある。
後はCとかのマクロだったら、左辺値を返すマクロとか作ったりしますね。
見ため的には気持ち悪いのかも。
○=== P65
『===』演算子の動きは言語によってまちまち。
JSの場合は==が等値で===が同値。
PHPも似た動作をしますね。
Javaだと==とequalかな?
Rubyだと、==から===になると、チェックが緩くなるって話しだった。
(俺Rubyやってないから知らないんだけど。
そもそも全部同値でいいんじゃね?って話しになってきた。
○暗黙的型変換
気持ち悪い。
ってか、型の2乗分も組み合わせ覚えられるかよヽ|'◇'|ノ
compile optionとかで切れないのかヽ|'◇'|ノ
って話しをされていた。
PHPやJSが初心者にとっつきやすい言語である1つの要因として、暗黙的型変換ってのがあるんだと思うけど、こいつがバグの温床にもなりやすいので、けっこうウザい( ´-`)
○演算子が演算子であるかメソッドであるか。
JSはグローバルな関数までメソッドだったりするオブジェクト指向な言語だけど、演算子はどうなんだ?
ちゃんと聞けなかったけど、これは演算子は演算子ってことでよかったのかな?
RubyやC++なんかだと、演算子もメソッドであるため上書き(オーバーライド)できる?
Smalltalkはって話しも出てた。
演算子の再定義が可能なのと、メソッドあるというのは別な話し。
○in演算子 P69
オブジェクトの場合はいいが、配列の場合の動作が気持ち悪い。
>>> test = new Array(5); test[0] = 20; 0 in test;
true
>>> test = new Array(5); test[0] = 20; 'length' in test;
true
配列要素もlengthみたいなプロパティも全部ひとまとめ('A`)
気持ち悪い('A`)
つっても、本来配列要素も.(ドット)でアクセス可能なプロパティなんだし、間違った動作じゃないんだろうが。
でも気持ち悪い。
○&&演算子 Perl使いの記法 P71
悪い例みたいな感じでPerlプログラマに多い書き方とか就けて例があがってる。
じっさいPerlプログラマさんはこーゆー書き方をするみたいだけど、内部動作を把握した上でやってるならいいんじゃないのか?って話しの流れだったのかなぁ。
○deleteの戻り値 P78
とてつもなく不可思議な実装になっている。
varで定義されてるとdeleteできなくて、暗黙的に定義されてるとdeleteできるとか。
整数値や存在しないプロパティを削除しようとしてもtrueが帰って来たりとか。
結局falseが帰ってくるのはvarで定義した変数を消す時のみということになる。
でも実際FireBugで試してみると、
>>> var a = 'a'; delete a; //true
>>> var a = 'a'; delete a; a;//a is not defined
消せとる(;´Д`)
falseを戻す実装って無いんじゃね?
ってか実装依存すぎる、deleteの戻り値は使わない方が吉。
(ってか存在意味が不明
そもそもC++と違って中身ではなくて器を消す。
名前としてはundefineとかの方がわかりやすい。
そんな話しのあたりで時間切れ。
お疲れ様でした。
その後バーミヤンにて濃い会話が続けられたとかされてないとか( ´-`)
ちなみに読書会中に使われていたLingrのログはこちらです。
Kanasan.JS : JavaScript Workshop in Kansai (at Lingr) > Archives > Recent messages
関連リンク
・JavaScript第5版読書会#1 - PleasureDelayerDiary
・ema log - JavaScript 第五版読書会に行ってきた - JavaScript 第五版読書会#1に行ってきた
お疲れさまでした。
window.selfですが、私はwindow.topやwindow.parent、window.openerと書式を合わせるためにあるのではないかと思っています。
言おうと思った時には、他の話題に移っていたので言えませんでしたが...。