javascript的乐趣——0220
1、对于generator函数,还不是很理解,之后再续
2、javascript的乐趣_不要问为什么
-
不要使用
new Number()
、new Boolean()
、new String()
创建包装对象; -
用
parseInt()
或parseFloat()
来转换任意类型到number
; -
用
String()
来转换任意类型到string
,或者直接调用某个对象的toString()
方法; -
通常不必把任意类型转换为
boolean
再判断,因为可以直接写if (myVar) {...}
; -
typeof
操作符可以判断出number
、boolean
、string
、function
和undefined
; -
判断
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 }