笔试题

389 阅读2分钟

1.输出以下代码执行结果

function wait() {
  return new Promise(resolve =>
    setTimeout(resolve, 10 * 1000)
  )
}

async function main() {
  console.time();
  const x = wait();
  const y = wait();
  const z = wait();
  await x;
  await y;
  await z;
  console.timeEnd();
}
main();

输出结果并解释原因


2. 解析 URL Params 为对象

尽可能的全面正确的解析一个任意 url 的所有参数为 Object,注意边界条件的处理。

let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
parseParam(url)
/* 结果
{ user: 'anonymous',
  id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
  city: '北京', // 中文需解码
  enabled: true, // 未指定值得 key 约定为 true
}
*/


3. 实现一个简单的模板引擎

// 例子:
let template = '我是{{name}},年龄{{age}},性别{{sex}}';
let data = {
  name: '姓名',
  age: 18
}
render(template, data); // 我是姓名,年龄18,性别undefined

4. 字符串查找

请使用最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中,并返回第一次出现的位置(找不到返回 -1)。

// 例子:
a='34';b='1234567'; // 返回 2
a='35';b='1234567'; // 返回 -1
a='355';b='12354355'; // 返回 5
isContain(a,b);

5. 两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。 

示例 给定 nums = [2, 7, 11, 15], target = 9 

因为 nums[0] + nums[1] = 2 + 7 = 9 

所以返回 [0, 1]



答案:

1、略大于 10000

2、

let parseParam = function (url) {
	let obj = new Object();
	let data = url.slice(url.indexOf('?'), url.length);
	let params = data.substr(1).split('&');
	for (let i = 0 ; i < params.length ; i ++) {
		let param = params[i].split('=');
		if (param[1]) {
			param[1] = decodeURIComponent(param[1])
		}
		if (obj[param[0]]) {
			obj[param[0]] = [obj[param[0]]]
			obj[param[0]].push(param[1])
		} else {
			obj[param[0]] = param[1]
		}
		if (!param[1]) {
			obj[param[0]] = true
		}
	}
	console.log(obj)
}

3、

let render =  function (template, data) {
	let key, value, reg;
	for (key in data) {
		reg = new RegExp('{{' + key + '}}', 'g');
		value = data[key];
		template = template.replace(reg, value);
	}
	
	template = template.replace(/{{\w+}}/g, 'undefined')
	return template;
}

4、

let isContain = function (a, b) {
	if (a.length > b.length) return -1
	for (let i = 0 ; i < b.length ; i++) {
		if (b[i] === a[0]) {
			let k = 0;
			let flag = true;
			while (k < a.length) {
				if (b[i + k] !== a[k]) {
					flag = false;
				}
				k++
			}
			if (flag) {
				return i
			}
		}
	}
	return -1
}

5、

let twoSum = function (nums, target) {
	let len = nums.length;
	while (len > 1) {
		let last = nums.pop();
		if (nums.indexOf(target - last) > -1) {
			return [nums.indexOf(target - last), nums.length]
		}
		len--
	}

}