我正在使用名为 phpjs 的JavaScript库 目标是创建模仿PHP处理它们的函数。
这是一个特别的功能:http://phpjs.org/functions/is_float:442
我写了几个测试用例,一切都如预期的那样。但是,当我尝试这个时,所有的休息时间:
document.write(is_float(16.0x00000000));
没有真或假击中屏幕,只是空白空间。这是为什么?
在我看到它时,在该功能中,它说return !!(mixed_var % 1);
什么是双!!对于?我以前从未遇到过这个。在源代码中留下一个得到的结果与以下测试用例完全相同。无论如何我可能会忘记?
document.write(is_float(186.31));document.write('<br>');
document.write(is_float("186.31"));document.write('<br>');
document.write(is_float("number"));document.write('<br>');
document.write(is_float("16.0x00000000"));document.write('<br>');
document.write(is_float("16"));document.write('<br>');
document.write(is_float(16));document.write('<br>');
document.write(is_float(0));document.write('<br>');
document.write(is_float("0"));document.write('<br>');
document.write(is_float(0.0));document.write('<br>');
document.write(is_float("0.0"));document.write('<br>');
document.write(is_float("true"));document.write('<br>');
document.write(is_float(true));document.write('<br>');
document.write(is_float("false"));document.write('<br>');
document.write(is_float(false));document.write('<br>');
编辑:关于0.0问题,这不能修复。查看文档:
//1.0 is simplified to 1 before it can be accessed by the function, this makes //it different from the PHP implementation. We can't fix this unfortunately.
看起来这只是JavaScript所做的事情,就在它自己的事情上。程序员无法控制这一点。
答案 0 :(得分:2)
16.0x00000000
不是JavaScript中的有效数字表达式。如果您尝试表示十六进制值,则正确的表示法为0x16
(基数为10 22
),并且不允许使用小数。如果您偶然尝试使用科学记数法表达某个值,则正确的表示法是1.632e2
(163.2
)。
!!
是一个转换为布尔值的技巧。考虑!!0
,可以将其解释为!(!0)
。它首先变为true
,当然不准确,然后返回false
,这是0
的正确布尔表示。
答案 1 :(得分:1)
“0x ....”是十六进制数的javascript表示法。但是,16.0x0000不能被解释为有意义的。 typeof 16.0x00抛出了一个Javascript错误。这是预料之中的。你真正想要的是is_float(0x16)
或类似的东西
听起来你正在验证输入。如果您真的想测试输入的内容(例如在文本字段中)实际上是浮点数,我建议您创建自己的函数,如:
function is_float(input) {
if (typeof input !== 'string') {
input = input.toString();
}
return /^\-?\d{1,9}\.\d+$/.test(input);
}
is_float("16.0x00"); //false
is_float("16.00"); //true
这样你就不必处理转换数字等问题了。
答案 2 :(得分:0)
要跳过语法错误,我认为唯一的办法就是把它放在try catch中并像这样评估它。
try{eval("document.write(is_float(16.0x00000000));")}catch(e){}
但是它有点古怪,最好把try catch放在is_float函数中,只接受像“16.0x00000”这样的字符串而不是16.0x00000。