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等内置方法,你会如何处理?)
解析:
- 方法一:for循环遍历字符串S的每一项,每次循环都让每一项从当前位置向后截取T.length个字符(使用
substr(start,length)
方法可在字符串中抽取从 start 下标开始的指定数目的字符),然后与T进行比较,如果不一样,继续循环;如果一样,返回当前索引即可并退出循环。 - 方法二:运用正则表达式,使用
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