我有一个方法,在Firefox中完美有效,我可以用它确定特定javascript对象实例的名称(请不要问我为什么需要它...)。 Fr示例:
var temp = new String("hello!");
var theName = getVarName(temp); //returns "temp"
此方法使用“window.hasOwnProperty()”,它在Internet Explorer中无效:任何建议?
答案 0 :(得分:31)
如果出于某种原因需要使用窗口,请使用:
Object.prototype.hasOwnProperty.call(obj, p)
答案 1 :(得分:3)
我有一个方法,在Firefox中完美有效,我可以用它确定特定javascript对象实例的名称
我不认为你这样做,因为这在JavaScript中是不可能的。 JS是一种按值调用的语言;当你写:
var temp= 'hello';
getVarName(temp);
与说法完全相同:
getVarName('hello');
此时“temp”作为变量的引用将丢失。我猜你的getVarName函数基本上是这样的:
function getVarName(value) {
for (var name in window) {
if (window[name]===value)
return name;
}
}
这适用于没有Object.hasOwnProperty()的IE和其他浏览器;它将只返回与参数匹配的任何全局变量的名称。可以将hasOwnProperty()调用添加到此函数中,通过仅允许窗口的直接属性(其充当全局变量,包括您明确设置的那些)而不是其任何原型来稍微优化它。我猜这是你的函数版本正在做什么,但在实践中它几乎没有影响因为几乎没有任何东西继承到'window'原型。
通过在显式的String对象中装入你的'hello',这会让你感到困惑(这是非常不寻常的,很少有好主意),这使得有可能使用两个不同的'hello'对象,这些对象是不可分割的===身份比较器,所以这将起作用:
var a= new String('hello!');
var b= new String('hello!');
getVarName(a); // 'a'
getVarName(b); // 'b' - distinguishable object from a
但这仍然不能阻止你做:
var a= new String('hello!');
var b= a;
getVarName(a); // 'a' or 'b', depending on implementation
getVarName(b); // the same 'a' or 'b' as in the previous call
所以,虽然你可以毫无保险地失去上面的hasOwnProperty()调用,但你正在做的事情并不能真正正常工作,你应该看看一个更好的方法来实现你正在做的事情。
答案 2 :(得分:1)
不要使用全局变量。始终将它们放在名称空间中,这样就不会遇到这样的问题。
如果我理解正确,那么在给定任何范围内的值时,您需要全局变量名称。例如,以下内容也应该起作用
var temp = "hello";
function foo(x) {
alert(getVarName(x)); //returns "temp" as well.
}
foo(temp);
这是对Window对象的反向哈希查找,这不仅昂贵,因为您需要每次迭代窗口对象的所有属性,但也不可靠(两个变量可以具有相同的值)。