2010-11-22 18 views
2

Javascriptは、組み込みの型とオブジェクトに関しては、少し自由を要するようです。JavascriptのMathとArrayの違いは何ですか?

あなたがこれを行うことができます配列型の内部機能で取得するには:だからここ

> Array().slice 
    function slice() { 
    [native code] 
    } 

配列はコンストラクタとして使用されている標準機能のように見えます。 except ... sliceはArray()関数のメンバ関数ではなく、Arrayオブジェクトのメンバ関数です。

アレイについてのもう一つの珍しいものは()、あなたが新しい()かないでそれを呼び出すかどうかをArrayオブジェクトを返すように見えるです:

> var a = Array() 
undefined 
> a 
[] 
> a.length 
0 

> var b = new Array() 
undefined 
> b 
[] 
> b.length 
0 

数学一方、シングルトンオブジェクト内に内蔵されているように見えます常に存在する(つまり、インスタンス化する必要はありません)。ですから、Array()。slice.applyを使ってArrayを使ってMath.min.applyを使います。

私の質問はArray()をあなた自身とJavascriptの他のビルトインオブジェクトを書くコンストラクタとは異なるものにしています。

答えて

3

あなたは

Array().slice() 

を書いている何それが意味することは次のとおりです。

  1. コール "アレイ" 機能
  2. 戻り値の "スライス" と呼ばれるプロパティの
  3. ルック
  4. そのプロパティの値を関数への参照として扱い、それを呼び出す

"slice"関数は配列プロトタイプオブジェクトで定義されています。つまり、配列のインスタンスにはそのプロパティ名でアクセスできます。ここで重要な点は、呼び出す「配列関数」がシンボル「配列」によって参照されることです。 "Array()"と書くと、は関数となり、式は配列を参照します。コンストラクタと通常の関数の違いはあまりありません。実際には、関数が呼び出される方法(つまり、新しく作成されたObjectインスタンスがthisのコンテキスト値)を変更することによって違いを生むのはnewキーワードです。ファンクションは、thisがグローバル・オブジェクトを参照しているかどうかをチェックし、グローバル・オブジェクトを参照する場合は、新しく作成したオブジェクトを独自のイニシアチブで返すことができます。

"Math"オブジェクトは単なるオブジェクトです。あなたは次のように定義されていると考えることができます:

var Math = { 
    min: function(n1, n2) { ... }, 
    max: function(n1, n2) { ... }, 
    // ... 
}; 
+0

数学は、少なくともクロム、インスタンスで、あります。 Firefoxではネイティブコードに直接ラップしますが、forループでは使用できません。 –

+0

はい、それは本当に定義されていないと確信しています - 私が意味するものは、それは単なるオブジェクトの性質のイラストです。 – Pointy

+0

@Ivo、 'for-in'ループで' Math'オブジェクトのプロパティを列挙することはできません。それらは**非列挙型**と記述されているからです。例えば、 'Math.propertyIsEnumerable( 'max'); 'false'を生成します – CMS

6

私はあなたの質問を引用し、いくつかのコメントをインラインで行います:除き...スライス

は、配列のメンバ関数ではありません( )関数では、Arrayオブジェクトのメンバー関数です。より正確には

slicesliceが利用可能である理由です、Array()を実行することで、あなたはArray.prototypeから継承する新しい配列オブジェクトを、作成している、Array.prototypeオブジェクトのメンバです。

アレイについてのもう一つの珍しい事は()、あなたが新しい()かないでそれを呼び出すかどうかをArrayオブジェクトを返すように見えるです:

この動作は、他の組み込みのコンストラクタでも共有されていますたとえばFunctionのために:

var fn = Function('return "foo";'); 

に相当します。

var fn = new Function('return "foo";'); 

例は、ユーザーがまたはnewせずに使用する場合、他のコンストラクタは異なる挙動を呈するが、仕様(new ArrayThe Array constructor called as a function)に記載され、例えば、プリミティブラッパーれる:

new Number("20");  // produces a Number object 
typeof new Number("20"); // "object" 

Number("20");   // makes type conversion 
typeof Number("20");  // "number" 

数学上他の手は、常に存在する(つまり、インスタンス化する必要がない)シングルトンオブジェクトで構築されているようです。ですから、Array()。slice.applyを使ってArrayを使ってMath.min.applyを使います。

はい、Mathは単純なオブジェクトであり、Arrayのような機能ではありません。

それはObject.prototypeとIIRCから、それは簡単なユーザー定義オブジェクトと、それは例えば、内部[[Class]]プロパティは「数学」が含まれているということですしていることを唯一の独特の違いを継承します。

Object.prototype.toString.call(Math); // "[object Math]" 

私の質問は何ですかArray()はあなた自身とJavascriptの他のビルトインオブジェクトを書くコンストラクタとは異なっています。

Arrayにより、たとえば、newかで呼び出された場合と同じように動作し、コンストラクタを書くことができ、その違いはありません。

function Foo (arg) { 
    if (!(this instanceof Foo)) { return new Foo(arg); } 
    this.foo = arg; 
} 

new Foo('bar'); // { foo: 'bar' } 
Foo('bar');  // { foo: 'bar' } 
関連する問題