メモ ~ 開眼! JavaScript

前置き

「開眼! JavaScript(オライリー)」を読んだときのメモです。それと、この本にインスパイアされて書いたのが、こちらのプロトタイプ継承に関する記事です。

ネイティブオブジェクト

  • Number
  • String
  • Boolean
  • Object
  • Array
  • Function
  • Date
  • RegExp
  • Error
  • Math

Mathはコンストラクタではなく、クラスメソッドを提供することだけが目的のクラスみたいなもの。

Number, String, Booleanをコンストラクタではなく(つまりnewするのではなく)関数として呼ぶと、box化されたオブジェクトではなくプリミティブ値を返す。

リテラルは、対応するネイティブコンストラクタでnewしたのと同等。ただし、数値、文字列、真偽値は例外で、プリミティブ値として扱われる。

プリミティブ値

  • 文字列
  • 真偽値
  • 数値
  • null
  • undefined

プリミティブ値をオブジェクト的に扱う(プロパティを参照したり、メソッドを呼んだりする)と、暗黙裏にboxing/unboxingされる。ただしnullとundefinedは例外で、これらはコンストラクタを持たないので、boxingできない。

数値プリミティブに対して(boxing後に)メソッドを呼びたいときは、(3).toString()のように括弧で囲む必要がある。

typeof

typeofの挙動は、少し不可解。

オブジェクト

  • 原則として、object
  • 関数オブジェクトには、function

プリミティブ値

  • 文字列なら、string
  • 真偽値なら、boolean
  • 数値なら、number
  • nullには、object
  • undefinedには、undefined

プロパティ

  • プロパティを削除するには、delete
  • undefinedやnullを代入しても削除したことにはならない
  • 継承したプロパティはdeleteでも削除できない
obj.hasOwnProperty('prop')
for ( var prop in obj ) {...} // 継承プロパティも対象だが、列挙可能プロパティのみ。
if ( 'prop' in obj ) {...}    // 継承プロパティも対象で、列挙可能じゃなくてもOK。
obj.propertyIsEnumerable('prop');  // constructorプロパティとかは列挙可能じゃない。

classなどの予約語や、スペースを含む識別子や、数字で始まる識別子をプロパティに使いたいときは、文字列化して[]に入れる。

関数

  • 関数はlengthプロパティを持ち、これは期待する引数の数
  • argumentsプロパティも持ち、arguments.lengthは呼ばれたときの引数の数
var f = function() {return 3;}();  // fに入るのは、3じゃなくて無名関数。
function() {...}();    // これはNG。
(function() {...})();  // これはOK。
!function(){...}();    // これでもいい。
  • function文で関数を定義するなら、前方宣言不要
  • function式で定義する場合は、参照する前に定義する必要がある

グローバルオブジェクト

  • グローバルオブジェクト直下でvarすると、グローバル変数になる
  • どのスコープでも、var無しだとグローバルオブジェクトのプロパティになる
  • グローバル変数は削除できない
  • グローバルオブジェクトとは、グローバルスコープ下でthisが指すもの

関数定義がネストすると、内側の関数の中では、thisがグローバルオブジェクトにバインドされる。ただし、ECMAScript5では仕様が変わる予定。

prototypeプロパティ

  • prototypeプロパティにプリミティブ値をバインドすることはできない
Last modified:2014/03/29 14:08:14
Keyword(s):
References:[言語Tips] [JavaScriptのconstructor、prototype、__proto__]
This page is frozen.