最近参加的DeeCamp2019,虽然是一个名为人工智能的暑期夏令营,在算法层面确实可以学到很多,了解前沿知识,但是实际做项目的时候,很多时候都需要前端的知识,比如与产品设计师交流的展示方案(毕竟企业举办的活动),甚至自己的项目环境有时候也是基于JavaScript的(比如我们组,就需要进行强化学习RL的课题,需要JS的仿真环境。。)。于是,,我发现前后端知识,对于一个完整项目发布是那么的重要的。。
步入正题,在学习JS
的这几天,总体感受,确实JS整体上比较简单,相比于传统编程语言(Python,C/C++
等),通常浏览器就是它的运行环境,毕竟属于WEB
必备,是一种超文本标记语言,类型不强,与CSS,HTML
并列又相互协作。
var str = "Visit W3School!";
var n = str.search("W3School");
var patt = /e/;
patt.test("The best things in life are free!");
可以说JS
实际上也是认为一切基于对象,并且所有东西操作的时候都是可以自动认为是字符串,而字符串又是每一种编程语言很重要的组成部分。。于是相关方法用的尤其多,在WEB
编程领域,二进制编码,字符串的概念要求很强。本人也不是主要搞前端工作的,小白一枚,这一篇博文主要浅析里面很强大实用的功能——正则表达式。
var str="This is an\n antzone good";
var reg=/an$/;
console.log(str.match(reg));
IsInstance
返回False
的时候,JS
后面居然不继续执行,歇菜了,但是HTML
可以继续做它的工作,两者功能不影响。。另外,还有很多默认的功能与行为,是需要试出来的,JS
很多时候都完成自动的功能。。所有 JavaScript 对象都拥有 toString() 方法,JavaScript 自动调用变量的 toString() 函数,当您试图“输出”对象或变量时。。
先看JS
中的正则表达式吧。
JS
中的正则表达式,居然可以不加引号,虽然也可以接受字符串作为参数,感觉心真大,这种不明确定义类型的字符居然可以直接使用。。类型不强,但是它加了/.../
这种东西作为标记,也算是一种弥补吧,但是感觉还是有些反人类。。
类似的还有异常捕获:
程序一:
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
try {
adddlert("欢迎您,亲爱的用户!");
}
catch(err) {
document.getElementById("demo").innerHTML = err.message;
}
</script>
</body>
</html>
程序二:
<!DOCTYPE html>
<html>
<body>
<p>请输入 5 到 10 之间的数字:</p>
<input id="demo" type="text">
<button type="button" onclick="myFunction()">检测输入</button>
<p id="p01"></p>
<script>
function myFunction() {
var message, x;
message = document.getElementById("p01");
message.innerHTML = "";
x = document.getElementById("demo").value;
try {
if(x == "") throw "是空的";
if(isNaN(x)) throw "不是数字";
x = Number(x);
if(x < 5) throw "太小";
if(x > 10) throw "太大";
}
catch(err) {
message.innerHTML = "输入:" + err;
}
}
</script>
</body>
</html>
err
变量居然自己就可以使用了。。难道是系统内建的全局变量,只能这么理解了,但是我感觉设为一个字符串或者大写的保留变量比较好,不然一下子感觉很懵。。还有就是如果自定义了message
,只需要直接输出err
就可以,此时不用再去访问err.message
了,因为可能自定义的异常只能覆盖到这个程度,即使访问,也只会输出undefined
,但居然不报错,JS
还可以继续执行后面的语句。。并且JS自动完成了需多功能,但是有时却不是自己希望的,那么就需要试错了,比如:数据类型不严格,JavaScript
将数字存储为 64 位浮点数,但所有按位运算都以 32 位二进制数执行,这之间的转换,呵呵,还可能需要它解释解释。。以及它的一些精度问题,对于整形的不够支持,也是一大难题。不过话说回来,毕竟前端后端WEB
开发,不是用来做数值计算的,不需要完成那么多的数学运算,这些东西都可以交给Python
或者C/C++
来完成,那这样也说得通了。。
参考例子:
https://www.w3school.com.cn/js/js_numbers.asp
https://www.w3school.com.cn/js/js_bitwise.asp
https://www.w3school.com.cn/js/js_errors.asp
(二进制转十进制>>>,自动进行了无符号数对待。。)
https://www.w3school.com.cn/js/js_number_methods.asp
https://www.w3school.com.cn/jsref/jsref_parseInt.asp
https://www.cnblogs.com/xiao-song/p/5812689.html
https://www.cnblogs.com/8080zh/p/9233049.html
https://www.cnblogs.com/winifredaf/p/10012857.html
JS正则表达式具体可以参考:
https://www.w3school.com.cn/js/js_regexp.asp
http://www.softwhy.com/article-54-1.html
Python正则表达式参考:
https://www.runoob.com/python3/python3-reg-expressions.html
其实作为一种编程语言,JS
很多功能与Python里面很像,但是可能有些细节实现可能有些不同,比如:match
方法,它可以自动进行全字符搜索匹配,在开头或者末尾进行匹配时则需要明确加上^
或者$
,而Python
里面则刚好相反,它默认只进行开头搜索匹配,而全字符搜索需要进行精细的正则表达式,而Search
方法两者则没那么大区别。JS
里面匹配不到返回null
,并且显示为空,而Python
则返回None
。
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
# .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print ("matchObj.group() : ", matchObj.group())
print ("matchObj.group(1) : ", matchObj.group(1))
print ("matchObj.group(2) : ", matchObj.group(2))
else:
print ("No match!!")
这部分可以参考:
https://www.php.cn/js-tutorial-390803.html
https://www.runoob.com/regexp/regexp-syntax.html
注意其中多行匹配的效果,因为编程语言中,空格以及换行通常是需要特殊对待的。
正则表达式作为一个强大但是却又比较繁琐的功能,在一般的作业编程中往往用的较少,但是在WEB搜索,文本字符处理方面则使用较多,具体在使用的时候可以现用现查,类似于快捷键,平时注意常用使用组合就可以了。
网上前端的资料尤其多,更多阅读:
https://www.cnblogs.com/nyist-xsk/p/7563475.html
https://blog.csdn.net/flytiger_ouc/article/details/19699389
https://www.cnblogs.com/liyuanhong/articles/9593985.html