2011-08-10 16 views
5

機能ではないJavaScriptオブジェクトはありますか?すべてのJavaScriptオブジェクトは機能していますか?

javascript: x=y=z=Object; alert([window.navigator.userAgent,x,y,z].join("\n\n")) 

commentとして。xyzは単にObjectの値がxに割り当てられ、それらは 『同一』であるているためObjectfunction Object(){ ... }単に参照している場合に参照していることがありました"プルーフ"

javascript:x=Object;x.p=43;alert([x==Object,x===Object,x.p,Object.p]) 

ディスプレイ

true,true,43,43 

与えられたfunction Thing(){}x=new Thing()ですxは、オブジェクトまたは参照を参照しますか? new Thing()Thingはどうですか?またはyy=x=new Thing()またはy=x=Thingに設定しますか? Thing=function(){}?その区別は間違いです。 "Everything"(またはそれは?)は参照によって呼び出されますが、文字列を評価することによって名前による呼び出しを強制することができます。だから... ...)

javascript: 
    void function(x,y,z){ 
     alert( [window.navigator.userAgent,x,y,z].join("\n\n")) 
    }(Object,Object,Object) 

または

javascript: 
    void function(x){ (function (y){ (function (z){ 
      alert( [window.navigator.userAgent,x,y,z].join("\n\n")) 
     })(y) })(x) }(Object) 

(うまくかなり議論の余地がない - functionの値が(...)またはvoidを使用して強制されなければならない(...)のニュアンスが微妙です:

javascript:  /* 43.p gives a runtime error but not ... */ 
    alert([ (43).p=34, 43["q"]=17, (x=43).z="hmmm" ]); 
    alert([ 43["p"], (43).z, x.p, x["z"], x]); 

ディスプレイ34,17,hmmmおよび,,,,43

またはオブジェクト

javascript:alert([window.navigator.userAgent,Object,Object,Object].join("\n\n")) 

の偶数アレイが得られる:

のMozilla/5.0(X11。 U; Linux i686; en-US; RV:1.9.2.3)のGecko/20100423のUbuntu/10.04(明快)のFirefox/3.6.3

関数オブジェクト(){ [ネイティブコード]}

関数オブジェクト(){ [ネイティブコード]}

関数オブジェクト(){ [ネイティブコード]}

オブジェクトされていない多くのオブジェクトが存在します。


としては、それが変更された場合、オブジェクトは、それ自体ではないかもしれない、answersのいずれかで指摘。
危険!危険!ウィルロビンソン!

x=y=z=Object=null; alert([window.navigator.userAgent,Object,x,y,z].join("\n\n")); 

参照

+1

関数はオブジェクト – Ibu

+1

@Ibuです...ではなく、すべてのオブジェクトは、機能;-) –

+2

@pstあり、私の文 – Ibu

答えて

6

あなたがオブジェクト関数への参照を作成し、オブジェクトを作成しませんでした。あなたがそれらはあなたがこれを行うことができ、オブジェクトになりたかった場合:

x = y = z = {} 

その後alert(x)object [Object]を返します。

コメントを含めるには - デフォルトでObjectはオブジェクトを構築する関数です。名前オブジェクトを再割り当てすると(少なくともFirefoxはすべてのブラウザをテストしていないようです)、Objectはもはや関数になりません。それはあなたが割り当てたものになります。したがって、答えは「いいえ」です。オブジェクトはではなく、常に関数ですが、明示的に再宣言されていない限り、になります。 Firebugによると:

>>> Object 
Object() 
>>> Object = {} 
Object {} 
>>> Object 
Object {} 

一見、それは再割り当てすることができます。もしあれば、どんな種類の影響があるか保証することはできません。

+1

私はJavaScriptについて話すときに "参照"の使用を嫌います(そして、最初の文を読む方法/フレーズの私の提案です):あなたは[新しい]オブジェクトを作成せず、あなたは*関数* Objectを割り当てましたコンストラクタ]を変数に追加します。 –

+0

それは確かにそれを言う良い方法です。重要なのは、関数ではないオブジェクトを作成できますが、オブジェクト関数を変数に割り当てることではないということです。 :) –

+0

はい、はい...しかし...そこには機能ではないオブジェクトがあります。注意深い表現と構文に注意してください。資本化された "オブジェクト"と記事 "an"。私は "Object"エンティティを意味します。関数ではないもの(オブジェクト)がありますか?問題はオブジェクトの作成ではありませんでした。 – Ekim

2

オブジェクトコンストラクタをvars x、y、zに割り当てています。 代わりにx=new Object()と言うと、関数と呼ばれるものは表示されなくなります。

+0

正確に - でも質問は残っています - 答えは「はい」ですか? – Ekim

+0

@ekimオブジェクトと関数は、JavaScriptのルートで非プリミティブな2つの要素です https://developer.mozilla.org/ja/JavaScript/Guide/Values,_Variables,_and_Literals – Shad

+0

https://developer.mozilla.org/ ja/JavaScript/Guide/Functionsおよびhttps://developer.mozilla.org/ja/JavaScript/Guide/Working_with_Objectsでは、構築の基本について説明しています。 – Ekim

0

jsの種類を確認するための確かな方法です。

注:ウィンドウ以外の何かに送信する必要があります...

try it out here...

  (function (self) { 
       var values = [ 
          'Function', 
          'Object', 
          'Array', 
          'String', 
          'Number', 
          'Date', 
          'RegExp', 
          'Boolean', 
          'Null', 
          'Error' 
        ]; 

       for (var i in values) if (values.hasOwnProperty(i)) { 
        var value = values[i]; 

        self['is' + value] = (function (v) { 
          return function (o) { 
           var r = ''; 

           try { 
            r = (o === null) ? 
               'Null' : 
               Object.prototype.toString.call(o).replace(/^\[object\s(\w+)\]$/, '$1'); 
           } catch (e) { 
            r = 'Undefined'; 
           } 

           return !!(r === v); 
          }; 
        })(value); 
       } 
      })(window); 

      alert(isFunction(Object)); 
+0

質問はタイプを調べる必要はありません - "オブジェクトは常に関数ですか?" – Ekim

+0

あなたはそれを実行しようとしましたか? ;) – shawndumas

+0

はい、しかし 'javascript:alert([Object、typeof(Object)])'はより基本的です – Ekim

1

任意の関数は、関数名の前new演算子を使用して、オブジェクトを作成するためにコンストラクタとして使用することができますJavaScriptで。結果オブジェクトはFunctionになりません。

でテストすることができObjectFunction間の円形の関係もあります:

Object instanceof Function // true 
Function instanceof Object // true 

そして{}Objectは同じではありませんが、{}new Object()です。

function foo() {} 
foo instanceof Function // true 
foo instanceof Object // true 

var bar = new foo(); 
bar instanceof Function // false 
bar instanceof Object // true 

var baz = {}; 
baz instanceof Function; // false 
baz instanceof Object; // true 
+0

"循環関係"はありません。オブジェクトと関数は両方とも関数であり、どちらもFunction.prototypeから継承し、Object.prototypeから継承します(両方とも関数であり、すべてのjavascript関数もオブジェクトです)。 * instanceOf *演算子はプロトタイプチェーンをチェックするだけで、実際にはそれほど多くのことを伝えません。 – RobG

+0

そう...単純な答えは...はい?、すべてのオブジェクト(私が知っているが1つしかないが、これがある)でも関数である! – Ekim

+0

"' new'演算子を使用してオブジェクトを作成するコンストラクタとして使用される関数は、 'Function'ではありません:' javascript:function f(){return function() – Ekim

関連する問題