1 2 3
| 'a, b,c, d'.split(',')
|
1 2 3
| 'a, b,c, d'.split(/, */)
|
1 2 3
| 'a, b,c, d'.split(/, */, 2) [ 'a', 'b' ]
|
JSON.stringify()
方法会忽略对象的不可遍历的属性。
1 2 3 4 5 6 7 8 9 10 11 12 13
| var obj = {}; Object.defineProperties(obj, { 'foo': { value: 1, enumerable: true }, 'bar': { value: 2, enumerable: false } });
JSON.stringify(obj);
|
如果参数对象有自定义的toJSON()
方法,那么JSON.stringify()
会使用这个方法的返回值作为参数,而忽略原对象的其他属性。
下面是一个普通的对象。
1 2 3 4 5 6 7 8 9 10 11
| var user = { firstName: '三', lastName: '张',
get fullName(){ return this.lastName + this.firstName; } };
JSON.stringify(user)
|
现在,为这个对象加上toJSON()
方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| var user = { firstName: '三', lastName: '张',
get fullName(){ return this.lastName + this.firstName; },
toJSON: function () { return { name: this.lastName + this.firstName }; } };
JSON.stringify(user)
|
并行与串行的结合,异步调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| var items = [ 1, 2, 3, 4, 5, 6 ]; var results = []; var running = 0; var limit = 2;
function async(arg, callback) { console.log('参数为 ' + arg +' , 1秒后返回结果'); setTimeout(function () { callback(arg * 2); }, 1000); }
function final(value) { console.log('完成: ', value); }
function launcher() { while(running < limit && items.length > 0) { var item = items.shift(); async(item, function(result) { results.push(result); running--; if(items.length > 0) { launcher(); } else if(running == 0) { final(results); } }); running++; } }
launcher();
|
setTimeout
还允许更多的参数。它们将依次传入推迟执行的函数(回调函数)。
1 2 3
| setTimeout(function (a,b) { console.log(a + b); }, 1000, 1, 1);
|
上面代码中,setTimeout
共有4个参数。最后那两个参数,将在1000毫秒之后回调函数执行时,作为回调函数的参数。
一个需要注意的地方,如果回调函数是对象的方法,那么setTimeout
使得方法内部的this
关键字指向全局环境,而不是定义时所在的那个对象。
1 2 3 4 5 6 7 8 9 10
| var x = 1;
var obj = { x: 2, y: function () { console.log(this.x); } };
setTimeout(obj.y, 1000)
|
上面代码输出的是1,而不是2。因为当obj.y
在1000毫秒后运行时,this
所指向的已经不是obj
了,而是全局环境。
为了防止出现这个问题,一种解决方法是将obj.y
放入一个函数。
1 2 3 4 5 6 7 8 9 10 11 12 13
| var x = 1;
var obj = { x: 2, y: function () { console.log(this.x); } };
setTimeout(function () { obj.y(); }, 1000);
|
setInterval
函数的用法与setTimeout
完全一致,区别仅仅在于setInterval
指定某个任务每隔一段时间就执行一次,也就是无限次的定时执行。
1 2 3 4
| var i = 1 var timer = setInterval(function() { console.log(2); }, 1000)
|