设置基本类型的属性似乎是无操作。这可能是一个错误吗?

时间:2017-11-11 18:05:35

标签: javascript

令我惊讶的是,尝试设置非对象变量的属性似乎是允许的,而且,它似乎是一个无操作:我没有看到一种方法来检索设置属性。例如(使用node.js v8.9.1的REPL):

> var x = 1
undefined
> typeof x
'number'
> x.foo = 'hello world'
'hello world'
> x.foo
undefined

我是否正确尝试设置x.foo是无操作?如果是这样,有没有办法让解释器将语句x.foo = 'hello world'识别为错误 - 或者是否有一种惯用的方法来防止这种滥用非对象变量?

2 个答案:

答案 0 :(得分:2)

不,这不可能是一个错误。分配属性的对象只是暂时创建然后丢弃,是的,但它并不总是一个无操作。该对象可以定义一个setter(继承):

Object.defineProperty(Number.prototype, "foo", {
    set(val) {
        console.log("setting "+this+".foo");
    },
    configurable: true,
});
var x = 1
x.foo = 'hello world'; // setting 1.foo

答案 1 :(得分:1)

每当你使用原语时,就像它们是对象一样,它们将被一个对象包裹起来,所以:

x.foo = "hello world"

等于:

new Number(x).foo = "hello world"

由于包装器对象未存储在任何位置,因此将对其进行垃圾回收,包括您设置的属性。所以,是的,设置基元的属性是没有意义的。