2015-05-29 75 views
1

我碰到这行代码来最近,并希望了解这意味着什么,的确,作为我的JavaScript的foo是不是很烫:+的意思是什么!在JavaScript?

if ((+!!config.template) + (+!!config.templateUrl) !== 1) {} 

从我所知,这是检查是否任一选项设置(因此无论是模板,或templateUrl必须设置,而不是两个或无)

所以,如果config.template设置,

  • + config.template是行不通的(模板不一个号码)
  • !config.template将返回false(-1)
  • !config.template将返回true(0)
  • + !! config.template因此将返回1

如果config.template是没有设置,

  • !config.template将返回true(0)
  • !config.template将返回false(-1)
  • + !! config.template因此将回归0

如果当时你是一样的,适用config.templateUrl如果设置,则为0

所以最终的测试是要看到,你最终会得到1如果config.template的总和和config.templateUrl是1(即一个或另一个被设置)

这是否有效的推理?

+3

哇...这有我痛苦地哭泣。 – helpermethod

+4

几乎正确,除了'+(true)=== 1'和'+(false)=== 0' –

+0

其实上面的表达式等价于'if(!config.template ===!config.templateUrl ){}'。这看起来更简单。 – kreig

回答

3

布尔值正在通过预先加上+来投射到Number

!!在上面的代码中检查上存在的属性template。如果没有找到模板!!通常会返回false,但通过预先+,它返回0。无论+!!语句返回数字,当他们加在一起,要么是0或1。

如果两个或没有设定/真正的最后的检查将返回true(!== 1

+0

当然,我编辑过。 – RoryGilchrist

+1

@RoryGilchrist:如果两者都设置了,为什么代码会失败?是的,表达式是2,但是测试检查!== 1,因此它会执行{}中的代码(这是作者的意图 - 消息说“你必须指定一个或另一个) 或者我是厚? – jmls

+1

你是对的,我误读了。所以基本上在上面的代码中,它是要么没有设置,要么两者都设置,但不仅仅是一个 – RoryGilchrist