0

我正在使用一个名为phpjs 的 JavaScript 库 目标是创建模仿 PHP 如何处理它们的函数。

这是一个特别的功能:http ://phpjs.org/functions/is_float:442

我已经编写了几个测试用例,一切都符合预期。但是,当我尝试这个时,一切都会中断:

document.write(is_float(16.0x00000000));

没有真假命中屏幕,只有空白区域。为什么是这样?

当我在它的时候,在那个函数中,它说return !!(mixed_var % 1); What is the double !! 为了?我以前从未遇到过这种情况。对于以下测试用例,在源代码中省略一个会得到完全相同的结果。有什么我可能会忘记的情况吗?

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 自己做的事情。程序员无法控制这一点。

4

3 回答 3

2

16.0x00000000不是 JavaScript 中的有效数值表达式。如果您尝试表示十六进制值,则正确的表示法是0x1622以 10 为底)并且不允许使用小数。如果您碰巧尝试使用科学计数法来表达一个值,那么正确的表示法是1.632e2( 163.2)。

!!是转换为布尔值的技巧。考虑!!0,可以解释为!(!0)。它首先变成true,这当然是不准确的,然后又回到false正确的布尔表示形式0

于 2009-12-12T23:49:45.020 回答
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

这样你就不必处理转换数字等。

于 2009-12-12T23:53:48.850 回答
0

要跳过语法错误,我认为唯一的方法是将它放入 try catch 并像这样评估它。

try{eval("document.write(is_float(16.0x00000000));")}catch(e){}

但这是一种奇怪的方式,最好将 try catch 放在 is_float 函数中,并且只接受像“16.0x00000”这样的字符串而不是 16.0x00000。

于 2009-12-13T02:34:32.847 回答