值
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"
答案 0 :(得分:2)
null
的技巧是,typeof null === 'object'
,null
本身实际上是它自己的基元类型。有关更深入的讨论,请参阅this question,包括相关规范的摘录。
null
是一个有效的东西,但消费者有责任检查null
值的返回值。对于出错的情况,只需查看标记nullreferenceexception以及有关处理该方案的众多问题。
您是否应该从null
方法返回undefined
,getIcon
或其他值,这实际上是一个设计问题,容易产生意见而不是事实,所以我&# 39;不要提供我的。
答案 1 :(得分:1)
false
是一个布尔值。布尔值是可装箱的(如数字和字符串),因为语言中有Boolean
构造函数。当您尝试访问false.content
时,它会成为一个对象,几乎(但不完全是因为它仍然是"boolean"
类型)您从new Boolean(false)
获得的内容。作为一个对象,它可以具有属性。只是布尔语没有有用的属性(与length
等字符串不同)所以你永远不会看到它们以这种方式使用。
另一方面,没有Null
构造函数可以装入类型null
的值"null"
(或者在旧版本的ECMAScript中确实键入"object"
)。因此没有有效的方法来解释null.content
。