Chaque objet JavaScript est-il une fonction?

Existe-t-il un objet JavaScript qui n'est pas une fonction?

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

(Il y a eu un commentaire que x , y , z sont simplement des références dans lesquelles Object est également simplement une référence à function Object(){ ... } car la valeur de l'objet est attribuée à x et elles sont "identiques". Comme preuve"

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

Affiche

 true,true,43,43 

function Thing(){} donnée function Thing(){} est-ce que x=new Thing() fait x un objet ou une référence à un? Qu'en est-il de new Thing() et Thing ? Or y dans y=x=new Thing() ou y=x=Thing ? Que faire si Thing=function(){} ? La distinction est discutée. «Tout» (ou est-ce?) Est appelé par référence, mais l'appel par nom peut être contraint en évaluant les chaînes. Alors …)

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

ou

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

(Bien pas trop discutable – les valeurs de la function doivent être forcées en utilisant (...) ou void . Les nuances de (...) sont subtiles:

 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, xp, x["z"], x]); 

Affiche 34,17,hmmm et ,,,,43

)

Ou même un ensemble d'objets

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

Donne:

Mozilla / 5.0 (X11; U; Linux i686; en-US; rv: 1.9.2.3) Gecko / 20100423 Ubuntu / 10.04 (lucide) Firefox / 3.6.3

Function Object () {[code natif]}

Function Object () {[code natif]}

Function Object () {[code natif]}

Il existe de nombreux objets qui ne sont pas Object.


Comme indiqué dans l'une des réponses , Object peut ne pas être lui-même s'il est modifié.
Danger! Danger! Will Robinson!

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

les références

  • L'objet et la fonction sont assez confus
  • Différence entre un constructeur et un objet
  • La fonction est-elle vraiment un objet
  • JavaScript fonctionne-t-il une "fonction" ou un "objet" ou les deux?
  • Chaque objet est une fonction et chaque fonction est Objet – Ce qui est correct?
  • Pourquoi JavaScript est-il une fonction considérée à la fois un constructeur et un objet?

Vous n'avez pas créé d'objets, vous avez créé des références à la fonction Objet. Si vous vouliez que ce soit des objets, vous pouvez le faire:

 x = y = z = {} 

Alors l' alert(x) renverra l' object [Object] .

Pour (j'espère) englober les commentaires – par défaut Object est une fonction qui construit des objets. Si vous réaffectez le nom Objet (Firefox semble au moins le permettre, n'a pas testé tous les navigateurs), puis Object ne sera plus une fonction, ce sera tout ce que vous lui avez assigné. Alors, la réponse est "non", l'objet n'est pas toujours une fonction, mais devrait être à moins qu'il ait été explicitement ré-déclaré. Selon Firebug:

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

Apparemment, il peut être réaffecté. Je ne peux pas répondre à quel genre d'impact aurait, le cas échéant.

Vous assignez le constructeur Objet aux vars x, y et z. Si vous dites plutôt x=new Object() , vous ne les verrez plus appelés fonctions.

Toute fonction peut être utilisée comme constructeur pour créer un objet en utilisant le new opérateur avant le nom de la fonction en JavaScript. L'objet résultant ne sera pas une Function .

Il existe également une relation circulaire entre Object et Function qui peut être testé avec:

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

Et {} et Object ne sont pas les mêmes, mais {} et new Object() sont.

 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 

Voici une manière infaillible de vérifier le type de n'importe quoi dans js.

Note: vous devez envoyer autre chose que la fenêtre …

Essayez-le ici …

  (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));