众所周知啊,面试主要难的都是编程题。而编程题主要考以写函数为主,一般有三道题,难度依次递增。这次我们先来讲最简单的第一题,先稳住一下心态。再进行下面的面试。
实战
话不多说,直接开始实战。
假设题目的要求是:输入一串长度为10的数组,把他转成电话号码的格式,类似于(xxx) xxx-xxxx
。我们能怎样做出来呢?
字符串拼接
这是最暴力的一种做法,毕竟面试嘛,我们只要得到结果就可以了,因此我们可以直接用下标就可以了。
function formatPhoneNumber(arr) {
if (arr.length !== 10) {
throw new Error('Array must contain exactly 10 digits');
}
return "("+arr[0]+arr[1]+arr[2]+") "+arr[3]+arr[4]+arr[5]+"-"+arr[6]+arr[7]+arr[8]+arr[9];
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
console.log(formatPhoneNumber(numbers)); // 输出: (123) 456-7890
但我们得到结果的方式也很重要。用这种方法可以得到我们的答案,但是真的能在面试得到满分吗?或者说,这种用法有什么缺陷?
我们要知道,从数组输入到字符串拼接,这个过程是十分机械化的,灵活性很低。功能我们确实实现了。但还是有许多地方可以优化。
身为一个一流的工程师在完成代码后,是要考虑它的优化的。根据什么标准来进行优化呢? 代码可读性是一个重要的标准。以电话模板来处理,使得更语义化,更好理解。
在上面的字符串拼接是es5时的用法,但此时我们应该使用es6中方法,可以优化我们代码的可读性和维护性。
在es6中我们的代码拼接常用${....}
实现,是模板字符串的一部分,允许在字符串中嵌入表达式。这些表达式会被计算然后其结果会转换为字符串,最后整个模板字符串会作为一个完整的字符串返回。
用${...}
来写,此时我们的代码会变成
return `(${arr[0]}${arr[1]}${arr[2]}) ${arr[3]}${arr[4]}${arr[5]}-${arr[6]}${arr[7]}${arr[8]}${arr[9]}`;
当然我们还可以用更简洁的,es6才出现的写法。
return `(${arr.slice(0, 3).join('')}) ${arr.slice(3, 6).join('')}-${arr.slice(6).join('')}`;
对其中slice和join不熟悉的可以翻看这篇作品(JavaScript基础之“数组”),里面详细介绍了一些数组的基本用法。
replace
这是JavaScript中一个强大的方法,可以查找和替换指定的字符串,这题我们也可以用repalce这样解:
function getPhoneNum(arr){
let format = "(xxx) xxx-xxxx"
for(let i =0 ;i<arr.length;i++){
format = format.replace('x',arr[i])
}
return format;
}
console.log(getPhoneNum([1,2,3,4,5,6,7,8,9,0]));
用变量状态解决问题,我们要知道电话号码初始状态(xxx) xxx-xxxx
,从而用replace方法把x用数字替换掉。当x一个都没有时,完成替换,可以返回了。
结语
一道小小的第一题,你以为面试官已经了解我们的能力。
考验了我们的快速编码能力,是否会es6,怎么提升代码可读性,有没有别的解法等。我们都要回答出来。这样我们才能在面试与别人拉开差距。更不要说现在行业越来越卷,面试稍有不对就会直接挂掉,我们更要学好知识底层。