由于Array
也是对象,而它的每个元素的索引被视为对象的属性,因此,for ... in
循环可以直接循环出Array
的索引:
var a = ['A', 'B', 'C'];
for (var i in a) {
console.log(i); // '0', '1', '2'
console.log(a[i]); // 'A', 'B', 'C'
}
请注意,for ... in
对Array
的循环得到的是String
而不是Number
。
贪婪匹配
需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0
:
var re = /^(\d+)(0*)$/;
re.exec('102300'); // ['102300', '102300', '']
由于\d+
采用贪婪匹配,直接把后面的0
全部匹配了,结果0*
只能匹配空字符串了。
必须让\d+
采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0
匹配出来,加个?
就可以让\d+
采用非贪婪匹配:
var re = /^(\d+?)(0*)$/;
re.exec('102300'); // ['102300', '1023', '00']
'use strict';
var logging = document.getElementById('test-promise2-log');
while (logging.children.length > 1) {
logging.removeChild(logging.children[logging.children.length - 1]);
}
function log(s) {
var p = document.createElement('p');
p.innerHTML = s;
logging.appendChild(p);
}
// 0.5秒后返回input*input的计算结果:
function multiply(input) {
return new Promise(function (resolve, reject) {
log('calculating ' + input + ' x ' + input + '...');
if(input === 'undefined')
reject('undefined');
if(isNaN(input))
reject('NaN');
if(input > 0)
setTimeout(resolve, 500, input * input);
else
reject('less than 0');
});
}
// 0.5秒后返回input+input的计算结果:
function add(input) {
return new Promise(function (resolve, reject) {
log('calculating ' + input + ' + ' + input + '...');
if(input === 'undefined')
reject('undefined');
if(isNaN(input))
reject('NaN');
setTimeout(resolve, 500, input + input);
});
}
var p = new Promise(function (resolve, reject) {
log('start new Promise...');
resolve(-1);
});
p.then(multiply).catch(function (r) {log('Error: ' + r);})
.then(add).catch(function (r) {log('Error: ' + r);})
.then(multiply).catch(function (r) {log('Error: ' + r);})
.then(add).catch(function (r) {log('Error: ' + r);})
.then(function (result) {
log('Got value: ' + result);
});
Log:
start new Promise...
calculating -1 x -1...
Error: less than 0
calculating undefined + undefined...
Error: NaN
calculating undefined x undefined...
Error: NaN
calculating undefined + undefined...
Error: NaN
Got value: undefined
catch之后依旧会往下执行
如果p用1初始化,直接忽略所有catch
Log:
start new Promise...
calculating 1 x 1...
calculating 1 + 1...
calculating 2 x 2...
calculating 4 + 4...
Got value: 8