是否有一个不是函数的JavaScript对象?
javascript: x=y=z=Object; alert([window.navigator.userAgent,x,y,z].join("\n\n"))
(x
y
,z
,Object
只是引用,在这种情况下,function Object(){ ... }
也只是对{{1}的引用因为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
怎么样?或y=x=new Thing()
或y=x=Thing
中的Thing=function(){}
?如果javascript:
void function(x,y,z){
alert( [window.navigator.userAgent,x,y,z].join("\n\n") )
}(Object,Object,Object)
怎么办?区别是没有实际意义的。 “Everything”(或者它是?)是通过引用调用的,但是可以通过评估字符串来强制逐个调用。所以...)
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"))
)
甚至是一个对象数组
x=y=z=Object=null; alert([window.navigator.userAgent,Object,x,y,z].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(){ [本地代码]}
function Object(){ [本地代码]}
function Object(){ [本地代码]}
有许多物体不是物体。
正如其中一个comment所指出的,如果它被修改,对象可能不是它自己 危险!危险!威尔罗宾逊!
{{1}}
参考
答案 0 :(得分:6)
您没有创建对象,您创建了对Object函数的引用。如果您希望这些是对象,您可以这样做:
x = y = z = {}
然后alert(x)
将返回object [Object]
。
To(希望)包含注释 - 默认情况下Object
是一个构造对象的函数。如果你重新分配名称Object(Firefox至少似乎允许我,没有测试过所有浏览器),那么Object
将不再是一个函数,它将是你分配给它的任何东西。那么,答案是“不”,对象不是总是一个函数,但应,除非它已被明确重新声明。据Firebug说:
>>> Object
Object()
>>> Object = {}
Object {}
>>> Object
Object {}
貌似可以重新分配。我无法保证会产生什么样的影响,如果有的话。
答案 1 :(得分:2)
您正在将Object构造函数分配给变量x,y和z。
如果您改为说x=new Object()
,则不会再将它们视为函数。
答案 2 :(得分:1)
任何函数都可以用作构造函数,通过在JavaScript中的函数名之前使用new
运算符来创建对象。生成的对象不是Function
。
Object
和Function
之间也存在循环关系,可以通过以下方式进行测试:
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
答案 3 :(得分:0)
这是检查js中任何内容类型的万无一失的方法。
注意:你应该发送窗口以外的东西......
(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));