Javascript 在if语句中使用对象时调用哪个本机函数?
我正在尝试构建一个模块,可以在if语句中使用它来检查某个值是真是假。我们的想法是,你可以这样做:Javascript 在if语句中使用对象时调用哪个本机函数?,javascript,Javascript,我正在尝试构建一个模块,可以在if语句中使用它来检查某个值是真是假。我们的想法是,你可以这样做: var module = require('nice-module') if(module) { console.log('The rumors are definitely true') } module.exports = { theDress: 'white with gold', configure: function(configuration) { this.t
var module = require('nice-module')
if(module) {
console.log('The rumors are definitely true')
}
module.exports = {
theDress: 'white with gold',
configure: function(configuration) {
this.theDress = configuration.theDress
},
valueOf: function() {
return this.theDress === 'white with gold'
}
}
但是,我希望这件事是可配置的,以这样一种方式,这是可能的:
var module = require('nice-module')
module.configure({ theDress: 'blue with black'})
if(module) {
console.log('The rumors are still true')
} else {
console.log('Based on this new information you have given the answer is now no')
}
我尝试创建一个覆盖标准object.valueOf()
函数的对象,这样我就可以拥有一个具有自己函数和属性的常规对象,但是让它调用某个函数并在if语句中使用时返回true
或false
。它看起来像这样:
var module = require('nice-module')
if(module) {
console.log('The rumors are definitely true')
}
module.exports = {
theDress: 'white with gold',
configure: function(configuration) {
this.theDress = configuration.theDress
},
valueOf: function() {
return this.theDress === 'white with gold'
}
}
然而,令人惊讶的是,它不起作用。我尝试用
toString()
交换valueOf()
,或者将相同的函数分配给两者。我在对象上尝试了console.log()
,该对象似乎也没有调用我的函数,只是给出了完整的对象,而不管我使用哪个实现。我做得不对吗?JavaScript在计算某个对象是真实的还是虚假的时是否不使用valueOf()
?没有调用函数,非空对象不可能是虚假的
见:
在JavaScript中,truthy值是在
在布尔上下文中计算。所有的价值观都是真实的,除非它们是真实的
定义为falsy(即除false、0、“、null、未定义和
南)
想到两种解决方案,用户可能会更清楚:
- 使用特定功能来提供该功能。它
- 如果配置失败,则引发异常(我不清楚您的用例)
if(anything)
在JavaScript中,如果anything
在当前范围内定义或在其他情况下是真实的,则执行true
分支
您误用了函数的值并误解了它的用途
在当前的JavaScript规范()中,valueOf
函数仅在通过ToPrimitive
执行抽象操作OrdinaryToPrimitive
时由JavaScript运行库调用,这仅在一组受限的情况下发生,特别是,如果您将一个对象
值传递给另一个使用ToPrimitive
的代码位,请在规范中搜索“ToPrimitive”以获取更多信息和上下文。我只需使用更明确的module.isValid()
。Javascript并没有为这种对象真实性提供显式API,所以您不应该尝试编写这样的代码。