经典笔试题

一些经典的笔试编程题

1.如何把一个字符串的大小写取反?例如:‘Abc’变成‘aBC’

解析:
首先用split()方法将字符串分割成数组,再利用for循环遍历数组每一个元素,遍历每一项过程中使用if语句判断当前元素的ACSII码值(使用charCodeAt()方法可以得到ASCII码值)在大写(小写)的范围内,就使用toLowerCase()方法(toUpperCase()方法)转换成小写(大写),并把所得的值保存起来,遍历完最后一项后退出for循环,并将数组用join()方法合并成字符串返回。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
function a(){
        let str = "Hello World! 你好,世界!"
        let len = str.length
            str = str.split('') //将字符串拆分为数组
        for(let i = 0; i < len; i++){
            if (str[i].charCodeAt() >= 65 && str[i].charCodeAt() <= 90){
                str[i] = str[i].toLowerCase()
            }else if(str[i].charCodeAt() >= 97 && str[i].charCodeAt() <= 122) {
                str[i] = str[i].toUpperCase()
            }
        }
        return str.join('') //将数组合并成字符串
    }


2.实现一个字符串的匹配算法,从字符串S中,查找是否存在字符串T,若存在返回所在位置,不存在返回-1。(如果不能基于indexOf/includes等内置方法,你会如何处理?)

解析:

  1. 方法一:for循环遍历字符串S的每一项,每次循环都让每一项从当前位置向后截取T.length个字符(使用substr(start,length)方法可在字符串中抽取从 start 下标开始的指定数目的字符),然后与T进行比较,如果不一样,继续循环;如果一样,返回当前索引即可并退出循环。
  2. 方法二:运用正则表达式,使用new RegExp(字符串)创建一个字符串的正则表达式,然后使用exec()(用于检索字符串的正则表达式的匹配;语法:RegExpObject.exec(string);如果找到匹配,返回一个数组,其中存放匹配结果;如果找不到匹配,则返回值为null)方法

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//方法一:使用for遍历
function myIndexOf(S, T){
    let lenS = S.length
        lenT = T.length
    let res = -1
    if(lenS < lenT) return -1; //如果S字符串的长度比T的短,直接返回-1
    for(let i = 0; i < lenS - lenT + 1; i++){//只需遍历到最后可截取到lenT长度的位置
        if(S.substr(i, lenT) === T){
            res = i
            break
        }
    }
    return res
}

//方法二:使用正则表达式
function myIndexOf(S, T){
    let reg = new RegExp(T)
    return reg.exec(S) ? reg.exec(S).index : -1  //reg.exec(S)会返回一个数组或者null值,通过其返回值return一个结果      
}


3.输出下面代码的运行结果

example 1:

1
2
3
4
5
var a = {}, b = '123', c = 123;
a[b] = 'b';
a[c] = 'c';
console.log(a[b])
//结果为c。因为a["123"]等价于a[123]

example 2:

1
2
3
4
5
var a = {}, b = Symbol('123'), c = Symbol('123');
a[b] = 'b';
a[c] = 'c';
console.log(a[b])
//结果为b。Symbol是ES6新增的基本数据类型,typeof Symbol('123') = "Symbol",他创建出来的值是惟一的,Symbol('123') === Symbol('123'):false

example 3:

1
2
3
4
5
var a = {}, b = {key = '123'}, c = {key = '456'};
a[b] = 'b';
a[c] = 'c';
console.log(a[b])
//结果为c。对象的属性名不能是一个对象(。如果遇到对象是属性名,会默认转化为字符串)由于普通对象上的toString()方法是调取Object.prototype上的方法,所以普通对象.toString() => "[object, Object]"


4.函数的三种角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Foo(){
    Foo.a = function(){//fn1
        console.log(1)
    }
    this.a = function(){//fn2
        console.log(2)
    }
}
Foo.prototype.a = function(){//把Foo当做类,在原型上设置实例公有的属性方法(只能通过实例.a()来使用)
    console.log(3)
}
Foo.a = function(){//把Foo当做普通对象设置私有的属性方法(只能通过Foo.a()来使用)
    console.log(4)
}
Foo.a()//输出结果:4
let obj = new Foo()//obj可以调取原型上的方法,此时Foo()执行,fn1执行后Foo.a被重新赋值,fn2执行后obj实例上添加一个私有的属性
obj.a()//输出结果:2   私有属性中有a
Foo.a()//输出结果:1


-->