运行计算
# this 指向有关
# 题1
var o = {
a: 10,
b: {
a: 12,
fn: function(){
console.log(this.a);
console.log(this);
}
}
}
var j = o.b.fn;
j();
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 题2
var length = 10;
function fn(){
console.log(this.length);
}
var obj = {
length:5,
method: function(fn){
fn();
arguments[0]();
}
}
obj.method(fn,1);
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 题3
var name = "window";
var object = {
name : "object",
getNameFunc : function(){
return function(){
console.log(this.name);
};
}
};
object.getNameFunc()();
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 题4
var btn = {
name: "点我",
click: function() {
setTimeout(() => {
console.log(this)
}, 1000);
},
show: () => {
console.log(this);
},
hide: function() {
return () => {
console.log(this)
}
}
}
btn.show();
btn.hide()();
var aa = btn.hide();
aa();
var bb = btn.hide
bb()();
btn.click();
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
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
#
1.完成函数 flatten,接受数组作为参数,数组元素包含整数或数组,函数返回扁平化后的数组
function flatten(arr) {
// TODO
var _arr = [];
var eachArr = function(ars){
ars.forEach(v=>{
if (v.length) {
eachArr(v);
} else{
_arr.push(v);
}
});
}
eachArr(arr);
return _arr;
}
console.log(flatten([1, [2, [3, 4], 5], 6])); // [1, 2, 3, 4, 5, 6]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2.实现一个格式化数字的函数 addComma,给数字添加千位分隔符
function addComma(num) {
// TODO
num = num.toString().split(".");
var arr=num[0].split("").reverse();
var res=[];
for(var i=0,len=arr.length;i<len;i++){
if(i%3===0&&i!==0){
res.push(",");
}
res.push(arr[i]);
}
res.reverse();
if(num[1]){ // 如果有小数的话添加小数部分
res=res.join("").concat("."+num[1]);
} else{
res=res.join("");
}
return res;
}
expect(addComma(1234)).toBe('1,234');
// 你还会添加哪些测试用例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
3.阅读下面的代码,你觉得有什么问题,怎么解决?
$('.time-tab').on('click', (e) => {
// 获得用户点击的时间参数,如 today/yesterday
const time = $(e.target).data('time')
$.ajax({
url: 'http://api.example.com/GetDataByTime',
data: { time },
onSuccess: (result) => {
// 服务器返回结果后渲染在页面上
render(result);
}
});
});
onSuccess 改为 success
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4.实现一个解析url参数的函数
function parseUrl(urlStr) {
// TODO
var params_arr = urlStr.split('?')[1].split('&');
var resURL_OBJ = {};
params_arr.forEach(v=>{
var _key = v.split('=')[0];
var _value = v.split('=')[1];
resURL_OBJ[_key] = _value;
})
return resURL_OBJ;
}
parseUrl('https://cloud.tencent.com?a=1&b=2&c=3');
// 返回 {a: 1, b: 2, c: 3}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
5.有一个扁平的数组描述了一系列的地理信息,类似于
var locationList = [
{ id: 0, name: "中国" },
{ id: 1, pid: 0, name: "广东省" },
{ id: 2, pid: 1, name: "深圳市" },
{ id: 3, pid: 1, name: "广州市" },
...
]
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
其中每个节点的 pid
指向了它所属上级地区。现在要求你把这个数组转换成树状结构:
var locationTree = buildLocationTree(locationList);
console.log(locationTree);
function buildLocationTree(locationList) {
// 请实现
var result = []
// 检测
if(!Array.isArray(locationList)) {
return result
}
var mapObj = {};
locationList.forEach(item => {
mapObj[item.id] = item;
});
locationList.forEach(item => {
var parent = mapObj[item.pid];
if(parent) {
(parent.subLocations || (parent.subLocations = [])).push(item);
} else {
result.push(item);
}
});
return {
root: result[0]
};
}
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
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
其中 locationTree
的结构应该如下:
{
root: {
id: 0,
name: '中国',
subLocations: [
{
id: 1,
pid: 0,
name: '广东省',
subLocations: [
{ id: 2, pid: 1, name: "深圳市" },
{ id: 3, pid: 1, name: "广州市" },
// ...
]
},
// ...
]
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TS 类型:
interface LocationTree {
root: LocationNode;
}
interface LocationNode {
id: number;
pid?: number; // 问号表示可选属性
name: string;
subLocations?: LocationNode[];
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
请实现 buildLocationTree()
。