【问题标题】:Why does "Javascript the Good Parts" claim that "A property value can be any Javascript value except for undefined"?为什么“Javascript the Good Parts”声称“属性值可以是除 undefined 之外的任何 Javascript 值”?
【发布时间】:2011-05-23 09:47:15
【问题描述】:

正如主题 JS 中提到的,Good Parts 似乎声称属性值不能是未定义的。但是,例如,如果您在 Chrome 的控制台中执行以下操作:

var foo = {}
foo.bar = undefined
foo

然后单击展开 foo 对象,您仍然可以看到 foo 包含一个名为 bar 的属性,其值为 undefined。当然,从 Javascript 方面来看,您无法区分 foo.bar 返回未定义和 foo.unexistingproperty 返回未定义之间的区别。但是控制台仍然坚持设置为未定义的属性有什么意义?

【问题讨论】:

  • 我认为你可以称之为一个相当无用的 Chrome '功能':)
  • @sje397:一点用处都没有。存在和未定义的属性与不存在的属性之间存在差异。看我的回答。
  • 所以就像很多答案说我知道你可以使用删除来摆脱属性等等。但是我的问题的主要思想是为什么这本书声称价值不能不确定。显然,这似乎是 Crockford 的错误陈述。
  • @Sam:我手头没有书。你能引用其中的相关部分吗?我怀疑他可能只是建议不要将undefined 分配给一个属性,这不是不合理的建议。
  • 没有主题中的表述是书中的实际引用。它的措辞不像书中的大多数建议,Crockford 首先提到可以做某事,而是推荐它。该文本来自第 3 章对象,并且确实说“属性值可以是除未定义之外的任何值”。

标签: javascript


【解决方案1】:

存在和未定义的属性与不存在的属性之间存在差异,因此 Chrome 在这里是明智的。如果您为属性分配值,则该属性基本上存在于该对象中。一个区别是,已明确设置为未定义的属性将显示在 for...in 循环中:

var foo = {};
foo.bar = undefined;

// The following will alert "bar"
for (var i in foo) {
    alert(i);
}

另一个是"bar" in foo 将返回truefoo.hasOwnProperty("bar") 也将返回。

【讨论】:

  • 我想一个有用的附录可能是提到声明变量以在全局范围内使用的有用性。您涵盖但未注意的内容(例如 var a; function doSomething(){a=(a)?0:1;return a;}
【解决方案2】:

从技术上讲,未定义是分配给变量的有效值。它确实有所作为,尽管通常没有用:

var foo = {
    bar: undefined
};

foo.hasOwnProperty("bar"); // returns true
foo.hasOwnProperty("bat"); // returns false

还有:

for (var n in foo) {
    console.log(n, foo[n]); // should log "bar" and "undefined"
}

在这种情况下,我个人会遵循 Crockford 给出的建议。将undefined 赋值为一个值会导致代码混乱,因此应该被认为是不好的。它让人们没想到它感到惊讶。

我们已经有 null 用于此目的,这对未来的维护者来说不会造成混淆。让undefined 真正表示未定义,使用null 表示未知。

请记住,在阅读 Crockford 的书时,您正在阅读有关最佳实践的建议以及关于 javascript 如何应该按照他的方式工作的意见。 javascript实际上是如何工作的完全是另一回事(在他看来不一定好)。

【讨论】:

  • Crockford 发表声明的上下文不是建议或意见,而是事实陈述。完整的段落是“对象是属性的容器,其中属性具有名称和值。属性名称可以是任何字符串,包括空字符串。属性值可以是除 undefined 之外的任何 JavaScript 值。”
  • 整本书的上下文是 Crockford 对您应该如何看待 javascript 的意见和建议。引用这本书本身:“..我去掉了不漂亮的特征..”。整本书是关于克罗克福德对事实的看法,而不是事实本身。他坦率地承认,他对描述 javascript 本身并不感兴趣,而是想传达他认为该语言应该首先出现的 javascript 子集。如果你想要一本描述或定义 javascript 的书,那么这不是它。
  • 是的,Crockford 确实在他的书的序言中说过,“..我去掉了不美观的特性..”以揭示一个可靠、可读和可维护的 JS 子集。但是,他关于 no property value can be undefined 的那句话在 Chrome 和 FF 上并不正确,似乎也不属于他的观点。他对本书的附录保留意见。他进一步写道,“这本书不会试图全面描述这种语言。相反,它会关注好的部分,偶尔会发出警告以避免坏的部分”。我认为他只是在 Ch3 中犯了一个错误。
【解决方案3】:

undefined 是 Javascript 告诉您值不存在而不是在您访问没有 try/catch 块的属性时抛出错误的方式。尽管 Crockford 认为 Chrome 显示的内容在技术上是错误的,但至少是合乎逻辑的;该属性存在,尽管是undefined

当你想删除一个属性时,你可以使用delete operator:

delete foo.bar;

【讨论】:

  • 当您尝试访问未定义的属性时不会收到错误消息。当您尝试访问未声明的变量时,您只会收到错误消息。如果 Crockford 的书这么说,那么错的是 Crockford,而不是 Chrome。
  • 我不是说你会得到一个错误,我只是说 Javascript 返回 undefined 作为一种替代机制,而不是仅仅抛出一个 Property not found 错误.
  • 好的。尽管 JavaScript 通常确实会抛出错误,但访问未定义的属性似乎是 JavaScript 所期望的并且不会考虑错误。
  • 好吧,它在尝试访问未声明的变量时仍然会抛出错误,但它会以不同的方式处理不存在的属性(返回 undefined)。
猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
相关资源
最近更新 更多