是否存在一个不是函数的JavaScript对象?
javascript: x=y=z=Object; alert([window.navigator.userAgent,x,y,z].join("\n\n"))
有一个评论认为x
、y
、z
只是引用,因此Object
也只是对function Object() {...}
的引用,因为Object
的值被赋给了x
,它们是“相同的”。作为“证明”。
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
呢?在y=x=new Thing()
或y=x=Thing
中的y
又是什么?如果Thing=function(){}
呢?区别无关紧要。"一切事物"(是否如此?)都是按引用调用,但可以通过评估字符串来强制执行按名称调用。所以……
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 (lucid) Firefox/3.6.3
function Object() { [native code] }
function Object() { [native code] }
function Object() { [native code] }
有许多不是Object的对象。
正如答案中所指出的那样,如果对象被修改,则它本身可能不再是自己。
危险!危险!威尔·罗宾逊!
x=y=z=Object=null; alert([window.navigator.userAgent,Object,x,y,z].join("\n\n"));
参考资料
javascript:alert(Object)
,Object
是function Object() { [native code] }
,因此... - Ekim