javascript的乐趣——0220

1、对于generator函数,还不是很理解,之后再续

2、javascript的乐趣_不要问为什么

  • 不要使用new Number()new Boolean()new String()创建包装对象;

  • parseInt()parseFloat()来转换任意类型到number

  • String()来转换任意类型到string,或者直接调用某个对象的toString()方法;

  • 通常不必把任意类型转换为boolean再判断,因为可以直接写if (myVar) {...}

  • typeof操作符可以判断出numberbooleanstringfunctionundefined

  • 判断Array要使用Array.isArray(arr)

  • 判断null请使用myVar === null

  • 判断某个全局变量是否存在用typeof window.myVar === 'undefined'

  • 函数内部判断某个变量是否存在用typeof myVar === 'undefined'

1 123.toString(); // SyntaxError
123..toString(); // '123', 注意是两个点!
(123).toString(); // '123'

2、对于date对象,一个坑爹的地方是JavaScript的月份范围用整数表示是0~11,0表示一月,1表示二月……,所以要表示6月,我们传入的是5

1 var today = new Date();
2 if (today.getMonth() === 2 && today.getDate() === 14) {
3     alert('亲爱的,我预定了晚餐,晚上6点在餐厅见!');
4 }

以上代码,真是注孤生的节奏啊......因为这匹配的是3月14号(坑无处不在)。

3、RegExp(正则表达式)

  • '00\d'可以匹配'007',但无法匹配'00A'

  • '\d\d\d'可以匹配'010'

  • '\w\w'可以匹配'js'

.可以匹配任意字符,所以:

  • 'js.'可以匹配'jsp''jss''js!'

要匹配变长的字符,在正则表达式中,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符:

进阶:

  • [0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;

  • [0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100''0_Z''js2015'等等;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或下划线、$开头,后接任意个由一个数字、字母或者下划线、$组成的字符串,也就是JavaScript允许的变量名;

  • [a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。

A|B可以匹配A或B,所以(J|j)ava(S|s)cript可以匹配'JavaScript''Javascript''javaScript'或者'javascript'

^表示行的开头,^\d表示必须以数字开头。

$表示行的结束,\d$表示必须以数字结束。

你可能注意到了,js也可以匹配'jsp',但是加上^js$就变成了整行匹配,就只能匹配'js'了。

1 var re1 = /ABC\-001/;
2 var re2 = new RegExp('ABC\\-001');
3 
4 re1; // /ABC\-001/
5 re2; // /ABC\-001/

RegExp对象的test()方法用于测试给定的字符串是否符合条件

1 var re = /^\d{3}\-\d{3,8}$/;
2 re.test('010-12345'); // true
3 re.test('010-1234x'); // false
4 re.test('010 12345'); // false

切分字符串:

1 'a,b;; c  d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']

分组、贪婪匹配、全局匹配与搜索

a.^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码

  exec()方法在匹配成功后,会返回一个Array,第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串。

  exec()方法在匹配失败时返回null

1 var re = /^(\d{3})-(\d{3,8})$/;
2 re.exec('010-12345'); // ['010-12345', '010', '12345']
3 re.exec('010 12345'); // null

b.正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符

1 var re = /^(\d+)(0*)$/;
2 re.exec('102300'); // ['102300', '102300', '']

\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配

1 var re = /^(\d+?)(0*)$/;
2 re.exec('102300'); // ['102300', '1023', '00']

c.JavaScript的正则表达式还有几个特殊的标志,最常用的是g,表示全局匹配,全局匹配可以多次执行exec()方法来搜索一个匹配的字符串。当我们指定g标志后,每次运行exec(),正则表达式本身会更新lastIndex属性,表示上次匹配到的最后索引

 1 var s = 'JavaScript, VBScript, JScript and ECMAScript';
 2 var re=/[a-zA-Z]+Script/g;
 3 
 4 // 使用全局匹配:
 5 re.exec(s); // ['JavaScript']
 6 re.lastIndex; // 10
 7 
 8 re.exec(s); // ['VBScript']
 9 re.lastIndex; // 20
10 
11 re.exec(s); // ['JScript']
12 re.lastIndex; // 29
13 
14 re.exec(s); // ['ECMAScript']
15 re.lastIndex; // 44
16 
17 re.exec(s); // null,直到结束仍没有匹配到

正则表达式还可以指定i标志,表示忽略大小写,m标志,表示执行多行匹配

例:匹配email地址:

 1 var re = /^[\da-zA-Z]+([._-]\w+)*@([\da-zA-Z]+\.)+[a-zA-Z]{2,6}$/;
 2 
 3 var re = /^<(.+?)>\s*([\da-zA-Z]+[._-]?\w+@[\da-zA-Z]+\.[a-zA-Z]{2,6})$/; //分组得到email地址的部分内容
 4 
 5 //测试部分:
 6 // 测试:
 7 var r = re.exec('<Tom Paris> tom@voyager.org');
 8 if (r === null || r.toString() !== ['<Tom Paris> tom@voyager.org', 'Tom Paris', 'tom@voyager.org'].toString()) {
 9     alert('测试失败!');
10 }
11 else {
12     alert('测试成功!');
13 }

 

posted @ 2017-02-20 23:18  jixiangwu789  阅读(918)  评论(0编辑  收藏  举报