むずかしいことはわかりません

いろいろ書いてるみたいな

パーフェクト Javascript を読み始めた。 - 4

パーフェクトJavaScript (PERFECT SERIES 4)

パーフェクトJavaScript (PERFECT SERIES 4)

  • 不変オブジェクト
    • preventExtentions
    • seal
    • freeze
  • thisは呼び出し方によって指すものが違う
    • 同じオブジェクト内でも他の関数を呼ぶときはthisが必要
  • applyとcallは関数呼び出し
    • applyは第1引数はそのまま渡し、それ以外は配列で渡す
    • callは第1引数とそれ以外の引数をそのまま渡す
  • プロトタイプ
    • 基本となる作り方
    • クラス名.prototype.メソッド名 = function(メソッド引数) { メソッド本体; }
  • _proto_ プロパティ
    • オブジェクト生成に使った関数オブジェクトのprototypeへのリンク
    • 通常のJavascript実装ではこのリンクが見えないので、拡張してある場合がある
    • getPropertyOfメソッドがECMAScript第5版から使えるようになる
  • ECMAScript第5版でのObjectクラス
    • create
    • defineProperty
    • defineProperties
    • getOwnPropertyDescriptor
    • set
    • get

パーフェクト Javascript を読み始めた。 - 3

パーフェクトJavaScript (PERFECT SERIES 4)

パーフェクトJavaScript (PERFECT SERIES 4)

というわけで、3日目。

  • 変数に変数を代入すると新たな変数になる
  • オブジェクトを代入するとオブジェクト参照になる
    • ただし、あらためて代入すればオブジェクトがコピーされる
    • いまいち表現がわかりづらい。あとでもう一度確認する。
  • 変数とプロパティ、呼び名は違えど実際は同じものを指す
  • 'a' in thisで現在のオブジェクト内にaというプロパティが存在するか調べられる
  • 存在しないプロパティにアクセスしてもundefined
    • でも、undefinedなプロパティにアクセスしたらTypeofエラーが出る
    • 存在チェックをしたいときはinを使う
  • オブジェクトリテラル
    • 関数の引数にオブジェクトを指定できる
    • 関数の返り値にオブジェクトを指定できる
  • コンストラクタ
    • コンストラクタ関数の最後にreturnを書くと生成されたオブジェクトは破棄されて違うものが返る
    • どうせなら、潔くreturnなど書かずに終わるほうがいい
  • []でしか書けない方法がある
    • オブジェクトのプロパティへのアクセスは.と[]がある
    • …が、[]でしかアクセスできない場合も存在する
      • 変数の値
      • 式の評価結果
      • プロパティ名に-や数字が含まれる
      • 当然のことながら、数字で始まるとか-などの記号で始まるプロパティ名を作るのはちょっと…。
  • deleteはプロパティ内の要素を削除する
  • '要素' in オブジェクトで要素を含んでいるか調べる
    • 安全を取るならば、hasOwnPropertyを使え

パーフェクト Javascript を読み始めた。 - 2

パーフェクトJavaScript (PERFECT SERIES 4)

パーフェクトJavaScript (PERFECT SERIES 4)

誤植的な部分とかがでてきたので、まとめておこうと思ったら、
既にやってる人もいたのでメモ

http://d.hatena.ne.jp/phithon/20120106/perfect_javascript_review_and_errata

あと、気になったところ
P104の図の注釈
js> var n = false || 'x'; // 評価結果は左オペランドの文字列値

js> var n = false || 'x'; // 評価結果は右オペランドの文字列値


というわけで、今日は4-37 論理演算子まで読んだところのまとめ

  • if-elseの記述ではわかりやすくするために{}を使う
    • 最初のifの真ブロックでifを使って、その中にelseがあると誤動作することもある
    • 引用しようと思ったけど、このテンプレートだと見づらかった
  • switch-caseで使われる比較は常に"==="(型変換なし比較)
  • for each in は、ECMAScriptの仕様にはない Javascript独自実装
  • for ( 変数 in オブジェクト式 )
    • オブジェクトのプロパティ名を列挙する
    • 値へのアクセス、表示などには[](ブラケット)を使う→for ( key in Object ) { var a = Object[key]; } みたいなかんじ
    • 列挙の順番は保証されない
    • 列挙されない属性がある→Arrayのlengthなど
    • プロトタイプ継承したプロパティも列挙される
  • for each in は、指定した変数に対してプロパティ値を代入する。
    • forではキー、for eachでは値。混乱しそう!
  • ラベル: 文
    • このブロック内にbreakを書くことで、ラベル内の処理から脱出できる
    • Cのラベルは「その場所へ飛ぶ」こちらのラベルは「そのブロックに名前をつけてひとかたまりにする」
  • 例外処理
    • catchは1つしか書けない。すべての例外をここでcatchする
    • finallyは常に実行される。すべての例外と例外がないときでも実行される。
    • 上のクラスで伝播するには、catch内で再度throwするか、そもそもcatchを書かない。
  • debuggerコマンド
    • debuggerで止まることを期待するってことは、break point?それとも処理が止まる?
  • 数値は浮動小数点で計算されるので、1/2が0.5になる
    • 他の言語だとinteger扱いになっている変数では1/2は0になる。
    • 勘違いしやすそう
  • Strict EqualsとEquals
    • ===はStrict Equals。厳密な比較
    • ==はEquals
  • x>yとx<=yがどちらも真、どちらも偽になることがある
    • 数学的にはそんなことは起こらない
    • 型変換が起こる可能性があるので、数学的な比較以外は結果は不定
  • 代入時に遅延評価が行える
    • 変数、数値以外に式も書けるので三項演算子のようにも使える

パーフェクトJavascriptを読み始めた。

パーフェクトJavaScript (PERFECT SERIES 4)

パーフェクトJavaScript (PERFECT SERIES 4)

買ったけど積ん読だったパーフェクトJavascriptを読み始めた。
実のところ、昔Javascriptに関する本を買って読んでは見たものの、それほど使う機会もなく本格的に覚えるところまではいかないままに今日まで暮らしてきたわけで。

しかし、実際のところJavascriptがわからないとやばい場面というのが増えてきたので、もう一度基礎からやり直そうと思って本を買ったけれど読む時間を作れず、今日に至っていた、と。

半ニートの状態が続いているので、もういい加減次の仕事をやらなくちゃいけないんだけど、時間があるんだからちょっと勉強してみます。

元々の知識が中途半端に知っている上にJavascriptがいたずらに使われてて止めてた方がいいんじゃないかと言われていた時代にしか見ていないので、いろいろ目から鱗。
読んでて「へー」って思ったところをメモって読んでるところ。

  • 関数宣言にはvarが必要
  • 関数リテラルは関数オブジェクトの参照
    • どちらも関数オブジェクトが関数の実体を返す
  • オブジェクトは連想配列/構造体のようにアクセスできる
    • プロパティ名=キー
    • オブジェクトはデータにどんな型でも持てる
  • オブジェクトのプロパティへのアクセス
    • obj.key / obj['key'] のどちらでもアクセスできる
  • オブジェクトのプロパティには関数も持てるのでクラスとメソッドのように利用できる
    • obj.func(p1,p2)のような形で書ける
  • var v=new func()で呼び出すと、funcオブジェクトのコンストラクタのように使える
  • prototypeプロパティは、親クラスのメソッドを継承するような動き
  • undefined型、null型がある
    • 文字列型→不変型(参照や継承しない)
  • ===は「型変換なし比較」、==は「型変換あり比較」
  • 比較順は
    • 数字→一部を除く記号→英大文字→英小文字→一部記号→ひらがな→カタカナ→漢字
    • 英大小文字はアルファベット順
    • ひらがな、カタカナは50音順
    • 漢字は機種依存
    • 人間向きの比較ではなく、アルファベット、数値、記号くらいしか比較に使えない

とりあえず、最後まで読んだら、また頭から読み直そう。