令我惊讶的是,尝试设置非对象变量的属性似乎是允许的,而且,它似乎是一个无操作:我没有看到一种方法来检索设置属性。例如(使用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'
识别为错误 - 或者是否有一种惯用的方法来防止这种滥用非对象变量?
答案 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"
由于包装器对象未存储在任何位置,因此将对其进行垃圾回收,包括您设置的属性。所以,是的,设置基元的属性是没有意义的。