WeChat 애플릿 개발시 평가 기능을 사용하지 않는 문제

高洛峰
풀어 주다: 2017-02-10 13:29:00
원래의
3066명이 탐색했습니다.

1. eval 함수 문제

JavaScript의 eval 함수는 개발자들 사이에서 논란이 되는 문제 중 하나입니다. 가장 큰 문제는 발생할 수 있는 불안감입니다. 여기서는 이 문제에 대해 자세히 다루지 않을 것이며 독자들은 많은 소개 기사를 쉽게 찾아볼 수 있습니다.

그러나 eval 함수의 장점도 분명합니다. 예를 들어, JS를 사용하여 "2+1-3*5"와 같은 문자열을 발견하면 다음과 유사하게 eval을 사용하여 쉽게 계산할 수 있습니다.


var s="2+1-3*5";

console.log(eval(s));


2개 위챗 미니 프로그램 실행 시 문제 발생


(1) 위챗 미니 프로그램 환경이 평가 기능을 지원하지 않습니다


WeChat 애플릿 개발을 배우는 과정에서 저는 계산기와 같은 도구를 사용하여 쓰기 연습을 하고 싶습니다. 주로 레이아웃 제어 기술에 익숙해지고 싶기 때문입니다. 그래서 위의 문제에 직면했습니다. eval 함수를 사용하는 것을 생각하는 것은 자연스러운 일입니다. 왜냐하면 프로그래밍에서 우리는 위와 유사한 숫자 표현식을 포함하는 많은 수의 문자열을 접하게 되기 때문입니다. 그러나 다음 오류가 발생했습니다.

VM773:1 Uncaught TypeError: eval is not a function(…)


(2) new Function() 해결책 절대 안돼!


사전 네트워크 탐색 후에는 eval() 함수 대신 다음과 유사한 대안을 사용할 수밖에 없었습니다.

//计算表达式的值
function eval(fn) {
     
    var Fn = Function;  //一个变量指向Function,防止有些前端编译工具报错
     
    return new Fn('return ' + fn)(); 
}
로그인 후 복사

결과는 다시 실패 프롬프트가 나타나면 다음과 유사합니다.

함수를 만들 수 없습니다


세 가지 무기력한 작업

WeChat 애플릿 검색이 거의 없습니다. 여러 포럼을 검색하고 인터넷을 종합적으로 검색한 결과 가장 원시적인 방법의 도움을 받아 겉으로는 간단해 보이는 계산기 프로그램의 개발을 이룰 수 있습니다. 정리해보면 크게

변환 함수, 강제형 변환, js 변수를 이용한 약한형 변환 등 3가지 방법이 있습니다.


(1) 변환 함수

js는parseInt()와parseFloat()라는 두 가지 변환 함수를 제공합니다. 전자는 값을 정수로 변환하고 후자는 값을 부동 소수점 숫자로 변환합니다. String 유형에서 이러한 메서드를 호출해야만 이 두 함수가 다른 유형에 대해 올바르게 실행될 수 있으며 NaN(숫자가 아님)이 반환됩니다.

일부 예는 다음과 같습니다.

parseInt("1234blue"); //returns 1234
parseInt("0xA") //returns 10
parseInt("22.5 ") ; //22개 반환
parseInt("blue"); //NaN 반환


parseInt() 메서드에도 기본 모드가 있습니다. 이진수, 8진수, 16진수 또는 기타 기본 문자열을 정수로 변환할 수 있습니다. 베이스는 parsInt() 메소드의 두 번째 매개변수에 의해 지정됩니다. 예는 다음과 같습니다:


코드 복사:


parseInt(" AF", 16); //175를 반환
parseInt("10", 2); //2를 반환
parseInt("10", 8); >parseInt("10" , 10); //returns 10


십진수 앞에 0이 포함된 경우 10진수를 사용하는 것이 좋습니다. 실수로 8진수 값을 얻지 마십시오. 예:


코드는 다음과 같습니다.

parseInt("010") //returns 8
parseInt(" 010", 8 ); //8개 반환
parseInt("010", 10); //10개 반환


parseFloat() 메서드 및 ParseInt ()방법 치료방법은 비슷합니다.

parseFloat() 메서드 사용의 또 다른 차이점은 문자열이 소수 형식의 부동 소수점 숫자를 나타내야 하며, parseFloat()에는 기본 모드가 없다는 것입니다.

parseFloat() 메소드를 사용한 예는 다음과 같습니다.


코드는 다음과 같습니다.

parseFloat ("1234blue"); //1234.0을 반환
parseFloat("0xA"); //NaN을 반환
parseFloat("22.5"); //22.5를 반환
parseFloat("22.34.5"); //22.34 반환
parseFloat("0908"); //908 반환
parseFloat("blue"); //NaN 반환


(2) 강제 유형 변환

형 변환을 사용하여 변환된 값의 유형을 처리할 수도 있습니다. 다른 유형이더라도 특정 값에 액세스하려면 캐스트를 사용하십시오.



ECMAScript에서 사용할 수 있는 세 가지 유형의 캐스트는 다음과 같습니다.

Boolean(value) - 주어진 값을 Boolean 유형으로 변환합니다. (값) - 주어진 값을 숫자로 변환합니다(정수 또는 부동 소수점 숫자일 수 있음)
String(value) - 주어진 값을 문자열로 변환합니다.



이 세 가지 함수 중 하나를 사용하여 값을 변환하면 원래 값에서 직접 변환된 값이 저장되는 새 값이 생성됩니다. 이로 인해 의도하지 않은 결과가 발생할 수 있습니다.

Boolean() 함수는 변환할 값이 문자열, 0이 아닌 숫자 또는 문자가 하나 이상 포함된 객체인 경우 true를 반환합니다. 이에 대해서는 다음 섹션에서 설명합니다. 값이 빈 문자열, 숫자 0, 정의되지 않음 또는 null인 경우 false를 반환합니다.


다음 코드 조각을 사용하여 부울 유형 캐스트를 테스트할 수 있습니다.


코드는 다음과 같습니다.

Boolean("") //false – 빈 문자열

Boolean("hi" ); / /true – 비어 있지 않은 문자열
Boolean(100); //true – 0이 아닌 숫자
Boolean(null); //false – null
Boolean(0); – zero
Boolean(new Object()); //true – object


Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。示例如下:


代码如下:


用  法 结       果

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) 100


(3)利用js变量弱类型转换

举个小例子,一看,就会明白了。


代码如下:

var str= '012.345 ';
var x = str-0;
x = x*1;
로그인 후 복사

上例利用了js的弱类型的特点,只进行了算术运算,实现了字符串到数字的类型转换。属于最简单的方法了。


小结

本文描述的也算是个人开发微信小程序过程中遇到的一个“坑”吧。毕竟小程序的设计目的之一是要访问本机功能的,所以避开eval这样的复杂函数也是可以理解的。目前,我还没有在网络上找到可以使用后面介绍的原始方法的能够实现计算字符串中数字表达式的通用的工具函数。有兴趣的朋友可以试一下。


更多微信小程序开发之不能使用eval函数的问题相关文章请关注PHP中文网!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿