Javascript testcase中的Bogus char:所有休息

时间:2009-12-12 23:47:24

标签: javascript phpjs

我正在使用名为 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所做的事情,就在它自己的事情上。程序员无法控制这一点。

3 个答案:

答案 0 :(得分:2)

16.0x00000000不是JavaScript中的有效数字表达式。如果您尝试表示十六进制值,则正确的表示法为0x16(基数为10 22),并且不允许使用小数。如果您偶然尝试使用科学记数法表达某个值,则正确的表示法是1.632e2163.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。