2012-03-09 71 views
1

下面的函数使用Short Circuit Operator返回0默认:这个函数中返回0的值是什么?

function custNumParse(str){ 
    return str*1||0; 
} 

我不知道何时会返回第二个(我的意思是,我知道它会何时str*1无法进行评估,以true) ,但我不确定当乘以1时什么输入可以产生该输出。

我知道falsish的值是0, "", false, null, undefined, NaN,但这对我没有太大的帮助。

换句话说,我无言以对,当我用物体或布尔该功能,等等。我知道我可以测试他们都将会发生什么,但我相信有一个更简单的方法去

任何想法找到这些家伙最合适的方式,而不是全部测试它们?

+0

'STR + 1'也可以写成'+ str'。 – 2012-03-09 22:23:20

+0

@火箭什么'+ 1'?你的意思是'* 1'? – mithril333221 2012-03-10 03:01:45

+0

是的,我的意思是'str * 1',那是一个错字。无论如何,你仍然可以写'+ str'。 – 2012-03-10 18:57:25

回答

5

*运算符仅用于数字,因此任何非数字(或不能转换为数字)的运算符将使str*1返回NaN。另外0*1显然是0

编辑:布尔似乎转换为01

false * 1 === 0 
true * 1 === 1 

编辑2:字符串与数字值也将被转换

"12" * 1 === 12 
"0" * 1 === 0 

EDIT 3:小心用阵列(它们被转换成字符串,然后整数)。

[] * 1 === 0 
[2] * 1 === 2 
[1,2] * 1 === NaN 
+0

布尔值或使用数字的字符串呢?编辑,因为你的(或不能转换为一个)编辑。哦,我看到了...很好,缩短了很多测试,谢谢:D – mithril333221 2012-03-09 21:55:56

+0

不正确。 '[] * 1'返回'0'。所以他的问题仍然存在,其他类型如何转换为数字。例如'true * 1'是'1'。 – 2012-03-09 21:59:10

+0

我有点不对。值将在'*'操作之前转换为数字(如果可以的话)。 – 2012-03-09 21:59:14

2

你的答案是类型转换。值str将被转换,然后相乘。看到这些例子从http://www.java-samples.com/showtutorial.php?tutorialid=819

Number(false) 0 
Number(true) 1 
Number(undefined) NaN 
Number(null) 0 
Number("5.5") 5.5 
Number("56") 56 
Number("5.6.7") NaN 
Number(new Object()) NaN 
Number(100) 10 

所以"5.5"*1是真实的。

+0

该链接是非常有用的,我留下了多少时间,它会保存我早晚多少时间 – mithril333221 2012-03-09 22:04:36

+0

请注意,链接会谈** **显式**类型转换在JavaScript中。你当前的代码是**隐式**类型转换。 – 2012-03-09 22:06:00

+0

感谢您的警告,我会结合您的链接与'Rocket'的回答,轻松知道谁将转向'NaN' :) – mithril333221 2012-03-09 22:08:34

1

JavaScript输入较弱。这意味着当你用1乘以某个东西时,它会尝试先把它改成数字。

  • 如果你有一个看起来像一个数字的字符串,它会尝试解释它。由于乘以1不会对数字做任何事情,所以您将返回该数字。

  • 如果字符串看起来不像一个数字,表达式将失败并导致NaN。由于NaN是错误的,因此它将通过并返回0

  • 有没有合乎逻辑的方法将对象变成数字,所以最终也会以NaN结束。

  • 至于布尔值,true为1,false为0。

那么函数功能是它试图解释参数作为一个数字,做不到这一点,则返回0