为什么undefined的行为与其他变量不同?

时间:2011-12-24 21:20:58

标签: javascript undefined

我正在使用谷歌浏览器16.0.912.63并具有以下代码:

__defineGetter__('x', function(){ 
    console.log('In Getter: x'); return 1; 
});

__defineGetter__('undefined', function(){ 
    console.log('In Getter: undefined'); return 2; 
});

console.log(x);
console.log(undefined);

正确输入x的getter函数,但从未输入undefined的getter。记录到我的控制台的输出是:

In Getter: x
1
undefined

我始终认为undefined的行为与任何其他全局变量相同。我知道如

这样的陈述
undefined = 10;
undefined = null;
undefined = 'defined';

这些都是有效的,所以undefined的不同之处在于它无法获得getter(至少在我的浏览器中)。

JSFiddle

2 个答案:

答案 0 :(得分:3)

它的行为与任何普通变量不同,它只是假装,至少在Firefox和Chrome上。试试吧:

var x;
undefined = "Hello!";
x === undefined; // true; undefined doesn't change

它更像是一个只读属性,但在写入时不会抛出错误。

答案 1 :(得分:2)

似乎__defineGetter__只是默默地失败了。 Object.defineProperty会抛出错误:

redefine_disallowed

当你在Chrome上调用它时:

Object.defineProperty(window, "undefined", {
    get: function() {
        return 2;
    }
});

另一方面:

window.__defineGetter__("undefined", function() {
    return 2;
});

window.__lookupGetter__("undefined"); // undefined, so __defineGetter__ just ignored call

为什么它在Chrome的控制台中有效:

当您在控制台中粘贴代码时,一次定义获取undefined时,它可以正常工作,因为正在执行的一些函数使用{{1阻止引用with

console._commandLineAPI

所以你只是定义if (injectCommandLineAPI && inspectedWindow.console) { inspectedWindow.console._commandLineAPI = new CommandLineAPI( this._commandLineAPIImpl, isEvalOnCallFrame ? object : null ); expression = "with ((window && window.console && window.console._commandLineAPI) || {}) {\n" + expression + "\n}"; } return evalFunction.call(object, expression);

另一点是它会覆盖console._commandLineAPI.undefined(参见上面的代码),所以如果你定义并获取console._commandLineAPI作为两个命令它就不起作用,因为getter被覆盖掉掉了你试图获得undefined的时间。

这个以及它不会覆盖undefined的事实,很可能是它在控制台中运行的原因。