一
eval 函数问题
中的 eval 函数是开发者们争论不休的问题之一,主要是因为它可能带来的不安全性。关于这个问题,我这里就不多说了,读者可以很容易地浏览到很多介绍文章。
不过eval函数的优点也是很明显的,比如你用JS写一个计算器程序,遇到像“2+1-3*5”这样的字符串,就可以用eval很方便的进行计算,就像这样:
var s="2+1-3*5";
.log(评估);
二
实践微信小程序时遇到的问题
微信小程序环境不支持eval函数
在学习微信小程序开发的时候,想练习一下计算器之类的工具的使用方法,主要是为了熟悉它的布局控制技巧。于是,就遇到了上面的问题。很自然地,我想到了使用 eval 函数,因为编程中会遇到大量类似上面的字符串,里面含有数值表达式。然而,我遇到了以下错误:
:1 : eval 不是 (…)
新的()解决方案也不起作用!
经过一些初步的网络探索后,我决定使用 eval() 函数的替代方法,类似于以下内容:
// 计算表达式的值
(脚注){
=; //指向一个变量,避免某些前端编译工具报错
(''+fn)();
结果再次出现失败提示,类似如下:
不能
三
无奈之举
在找遍了为数不多的微信小程序论坛和网上搜索之后,只能用最原始的方法开发了一个看似简单的计算器程序。总结起来主要有三种方法,分别是:
转换函数
js 提供了两个转换函数,() 和 ()。前者将值转换为整数,后者将值转换为浮点数。只有在类型上调用这些方法,这两个函数才能正确运行;对于其他类型,将返回 NaN(Not a)。一些示例如下:
(“”); // 1234
(“0xA”);//10
(“22.5”); // 22
(“蓝色的”); // 南
() 方法还具有进制模式,可以将二进制、八进制、十六进制或任何其他进制的字符串转换为整数。进制由 () 方法的第二个参数指定,如下所示:
(“AF”,16); // 175
(“10”,2); // 2
(“10”,8); // 8
(“10”,10); // 10
如果您的十进制数包含前导零,最好使用十进制,这样您就不会意外得到八进制值。例如:
(“010”); // 8
(“010”,8); // 8
(“010”,10); // 10
() 方法的处理方式与 () 方法类似。
使用 () 方法时的另一个区别是字符串必须以十进制形式表示浮点数,并且 () 没有进制模式。
下面是使用 () 方法的示例:
(“”); // 1234.0
(“0xA”); // 南
(“22.5”); // 22.5
(“22.34.5”); // 22.34
(“0908”); // 908
(“蓝色的”); // 南
类型转换
您还可以使用类型转换(type)来转换值的类型。使用类型转换,您可以访问特定值,即使它是另一种类型。
可用的三种类型的演员阵容如下:
使用这三个函数之一转换值将创建一个新值,该新值包含直接从原始值转换而来的值。这可能会产生意想不到的后果。
当转换的值是至少包含一个字符的字符串、非零数字或对象(下一节将讨论)时, () 函数返回 true。如果值为空字符串、数字 0 或 null,则返回 。
您可以使用以下代码片段来测试类型转换。
(“”); // –
(“hi”); //true – 非
(100); //true – 非零
(空); // - 空
(0); // - 零
(新()); //true –
() 转换的工作原理与 () 和 () 方法类似,只不过它转换的是整个值,而不是部分值。以下是示例:
用法
结果
()
(真的)
()
(无效的)
(“5.5”)
(56)
(“5.6.7”)
(新的 ())
(100)
钠
5.5
56
钠
钠
100
使用js变量弱类型转换
我举一个小例子你一看就明白了。
='012.345';
varx=str-0;
x=x*1;
上面的例子利用了js的弱类型特性,只进行算术运算,实现了字符串到数字的类型转换,这是最简单的方法。
概括
本文讲的是我开发微信小程序时遇到的一个坑,毕竟小程序的设计目的之一就是访问原生函数,所以避免使用 eval 这类复杂函数也是可以理解的。目前我在网上还没找到一个通用的工具函数能用后面介绍的原始方法计算字符串中的数值表达式,有兴趣的朋友可以试试。