使用null作为预期对象

时间:2016-06-24 14:56:05

标签: javascript object null prototype-programming

  

null表示任何对象值的故意缺席

     

在API中,null通常会在可以预期对象的地方检索,但没有对象是相关的。

     

- MDN(强调我的)

TL; DR:Why does null.content throw an error but false.content returns undefined

在我的项目的API中,我有方法允许用户设置和获取页面的图标。

Page.prototype.setIcon = function (key) {
  this.icon = database.find(function (item) { return item.content === key })
}
Page.prototype.getIconContent = function () {
  return this.icon.content
}

给出一个字符串作为参数,程序在数据库中搜索content属性等于给定参数的对象。如果没有找到这样的对象,the find() function will return undefined。因此this.icon将设置为undefined

这不好,因为当用户调用getIconContent()时,他们将收到错误,因为该程序正在尝试查找content undefined属性}。

我想要发生的是,如果找不到数据库中的此类对象,setIcon()会将this.icon设置为不会抛出错误的假值试图获得content财产。所以我尝试使用OR null作为it is an object

Page.prototype.setIcon = function (key) {
  this.icon = database.find(function (item) { return item.content === key }) || null
}

但这不起作用,因为尝试获取null.content 仍会抛出错误。所以我尝试了OR false,它按照我想要的方式工作。

Page.prototype.setIcon = function (key) {
  this.icon = database.find(function (item) { return item.content === key }) || false
}

因此,当用户在没有参数的情况下调用setIcon(),然后尝试getIconContent()时,他们将不会收到错误,因为false.content不会抛出错误;它返回undefined,这是我正在寻找的行为。

我的问题是,为什么false正确用法,显然icon的预期类型应该是一个对象?我认为null会更“语义正确”,但它会引发错误。

PS:除了false之外,这些是其他不会抛出错误的虚假值:

var a = 0;   a.content // returns `undefined`
var b = NaN; b.content // returns `undefined`
var c = '';  c.content // returns `undefined`

空对象{},即使它是真实的

var d = {}; d.content // returns `undefined`

undefined按预期抛出错误

var e; e.content // throws an error "Uncaught ReferenceError: e is not defined"

2 个答案:

答案 0 :(得分:2)

null的技巧是,typeof null === 'object'null本身实际上是它自己的基元类型。有关更深入的讨论,请参阅this question,包括相关规范的摘录。

当预期某个对象时,

null是一个有效的东西,但消费者有责任检查null值的返回值。对于出错的情况,只需查看标记以及有关处理该方案的众多问题。

您是否应该从null方法返回undefinedgetIcon或其他值,这实际上是一个设计问题,容易产生意见而不是事实,所以我&# 39;不要提供我的。

答案 1 :(得分:1)

false是一个布尔值。布尔值是可装箱的(如数字和字符串),因为语言中有Boolean构造函数。当您尝试访问false.content时,它会成为一个对象,几乎(但不完全是因为它仍然是"boolean"类型)您从new Boolean(false)获得的内容。作为一个对象,它可以具有属性。只是布尔语没有有用的属性(与length等字符串不同)所以你永远不会看到它们以这种方式使用。

另一方面,没有Null构造函数可以装入类型null的值"null"(或者在旧版本的ECMAScript中确实键入"object")。因此没有有效的方法来解释null.content