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