Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在if语句中使用对象时调用哪个本机函数?_Javascript - Fatal编程技术网

Javascript 在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

我正在尝试构建一个模块,可以在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.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,所以您不应该尝试编写这样的代码。