JavaScript

Charliexiu Lv2

1
2
3
// 非正则分隔
'a, b,c, d'.split(',')
// [ 'a', ' b', 'c', ' d' ]
1
2
3
// 正则分隔,去除多余的空格
'a, b,c, d'.split(/, */)
// [ 'a', 'b', 'c', 'd' ]
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); // "{"foo":1}"

如果参数对象有自定义的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)
// "{"firstName":"三","lastName":"张","fullName":"张三"}"

现在,为这个对象加上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)
// "{"name":"张三"}"

并行与串行的结合,异步调用

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

上面代码输出的是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);
// 2

setInterval函数的用法与setTimeout完全一致,区别仅仅在于setInterval指定某个任务每隔一段时间就执行一次,也就是无限次的定时执行。

1
2
3
4
var i = 1
var timer = setInterval(function() {
console.log(2);
}, 1000)
  • 标题: JavaScript
  • 作者: Charliexiu
  • 创建于: 2023-04-08 20:58:06
  • 更新于: 2023-04-19 00:19:25
  • 链接: https://ccharlie-xiu.github.io/2023/04/08/JavaScript/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
JavaScript