面试题集

1.JS类型
一共有6大类型
数字类型
布尔类型
字符串类型
null
undefined
对象类型

2.字符串方法
(1). str.charAt(index);返回子字符串,index是字符串下标,范围在[0,str.length-1]
例如:

1
2
3
var str='abcd';
var a=str.charAt(0);
console.log(a); //'a'

(2). str.charCodeAt(index);返回的是子字符串的unicode编码,范围同上
例如:

1
str.charCodeAt(0);   //97

(3). str.indexOf(searchString,startIndex);返回子字符串第一次出现的位置,从startIndex开始,找不到就返回-1
例如:

1
2
3
var str='abcd';
str.indexOf('a'); //0
str.indexOf('e'); //-1

(4). str.lastIndexOf(searchString,startIndex);从右往左找子字符串,找不到时返回-1
例如:

1
2
3
var str='abcd';
str.lastIndexOf('b'); //1
str.lastIndexOf('e'); //-1

  • indexOf和lastIndexOf方法都只能返回一次

(5).字符串之间的比较
例如:

1
2
'10000' < '2'  //1的unicode值比2的unicode值小  true
'10000' > 2 //转成数字比较 true

比较第一个字符的unicode编码值,第一个字符要是相同,就比较第二个,依次往下

(6).截取字符串
a. str.substring(start,end);两个参数都是正数,返回值位[start,end)也就是返回从start开始到end-1的字符
b. str.substr(start,length);从start开始截取,截取的长度位length
例如:

1
2
var a = "abcdefg";
alert(a.substr(2,5)); //cdefg

c. str.slice(start,end);两个参数可正可负(同为正或同为负),负值代表从右截取,返回值[start,end),也就是说返回的是从start开始到end-1的字符串
例如;
1
2
var a = "abcdefg";
alert(a.slice(-5,-2)); //cde

(7).拼接两个字符串
str1.concat(str);//不影响原有字符串
例如:

1
2
3
4
var a = "abcdefg";
var b = "hijklm";
var c = a.concat(b);
alert(c); //abcdefghijklm

(8).分割字符串
str.split(separator,howmany);用指定字符分割字符串,返回数组。第一个参数可以是指定的字符,空字符串等也可以是正则表达式,第二个参数可选。
例如:

1
2
var a = "abcdefg";
alert(a.split("")); //a,b,c,d,e,f,g

指定符号
1
2
"2:3:4:5".split(":");	//将返回["2", "3", "4", "5"]
"|a|b|c".split("|") ; //将返回["", "a", "b", "c"]

正则表达式
1
2
var words = "seateace".split(/\a+/);
alert(words); //se,te,ce

1
2
var words = "seateace".split(/\a+/,2);
alert(words); //se,te

(9).替换指定的字符串
str.replace(regexp/substr,replacement);第一个参数可以是正则表达式,也可以是子字符串,第二个参数是要替换的内容(字符串),返回值是一个新字符串,用replacement替换了regexp第一次匹配或全部匹配的内容

用法:
a. 简单使用替换

b. 全局搜索替换

c.对大小写不敏感的替换操作

1
2
text = "javascript Tutorial";
alert(text.replace(/javascript/i, "JavaScript"));//JavaScript Tutorial

d.用替换方法来转换姓名格式

1
2
name = "Doe, John";
alert(name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1"));//John Doe

e.转换引号

1
2
name = '"a", "b"';		
alert(name.replace(/"([^"]*)"/g, "'$1'"));//'a', 'b'

f.将字符串里的每个单词的首字母都大写

1
2
3
4
5
name = 'aaa bbb ccc';
uw=name.replace(/\b\w+\b/g, function(word){
return word.substring(0,1).toUpperCase()+word.substring(1);}
);
alert(uw);//Aaa Bbb Ccc

*toUpperCase()是转换成大写字母

(10).在字符串内检索指定的值,或找到一个或多个正则表达式的匹配
str.math(searchvalue/regexp);searchvalue是规定要检索的字符串的值regexp是要匹配的模式的regexp的对象,如果该参数不是对象,则需要首先把他传给regexp构造函数转换成对象。返回值为存有符合条件的数组,该数组依赖具体要看regexp是否有全局标志

(11).检索指定的字符串在字符串里的起始位置
str.search(regexp); 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。stringObject 中第一个与 regexp 相匹配的子串的起始位置。
*如果没有找到任何匹配的子串,则返回 -1。


es6新增的方法:
(1).codePointAt() 能够正确处理4个字节储存的字符,返回指定索引出一个字符的码点。codePointAt方法是测试一个字符由两个字节还是由四个字节组成的最简单方法。

1
2
3
var s = '摸u';
alert(s.codePointAt(0)); // 25720
alert(s.codePointAt(1)); // 117

(2).for…of字符串遍历器接口

1
2
3
4
5
6
for (let codePoint of 'foo') {
console.log(codePoint)
}
// "f"
// "o"
// "o"

(3).includes():返回布尔值,表示是否找到了参数字符串。这三个方法都支持第二个参数,表示开始搜索的位置。

(4).startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。这三个方法都支持第二个参数,表示开始搜索的位置。

(5).endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。这三个方法都支持第二个参数,表示开始搜索的位置。

例如:

1
2
3
4
5
var s = 'Hello world!';

s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false

(6).repeat()方法返回一个新字符串,表示将原字符串重复n次。

1
2
3
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
'na'.repeat(0) // ""

(7).padStart(),padEnd()字符串补全长度的功能
padStart()用于头部补全
padEnd()用于尾部补全
padStart和padEnd一共接受两个参数,第一个参数用来指定字符串的最小长度,第二个参数是用来补全的字符串。

1
2
3
4
5
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'

'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'

如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。
1
2
'xxx'.padStart(2, 'ab') // 'xxx'
'xxx'.padEnd(2, 'ab') // 'xxx'

如果用来补全的字符串与原字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串。
1
'abc'.padStart(10, '0123456789') //0123456abc

如果省略第二个参数,默认使用空格补全长度。
1
2
'x'.padStart(4) // '   x'
'x'.padEnd(4) // 'x '

3.变量声明
用var关键词声明
在js里,一个变量可以不用var关键字声明,但是会被当作全局变量。一般不推荐这样使用,因为代码量大了之后会很难维护。

4.用JS选择css元素

1
2
3
element.getElementById(" ");
element.getElementsByTagName(" ");
element.getElementsByClassName(" ");

5.css选择器
(1).类别选择器
(2).标签选择器
(3).ID选择器
(4).后代选择器(包含选择器)
(5).子选择器
(6).伪类选择器
(7).通用选择器
(8).群组选择器
(9).相邻同胞选择器
(10).属性选择器
(11).伪元素选择器
(12).结构性伪类选择器
(13).UI元素状态伪类选择器

6.css选择器优先级

7.事件冒泡和事件捕捉
当事件发生后,这个事件就要开始传播(从里到外或者从外向里)。为什么要传播呢?因为事件源本身(可能)并没有处理事件的能力,即处理事件的函数(方法)并未绑定在该事件源上。例如我们点击一个按钮时,就会产生一个click事件,但这个按钮本身可能不能处理这个事件,事件必须从这个按钮传播出去,从而到达能够处理这个事件的代码中(例如我们给按钮的onclick属性赋一个函数的名字,就是让这个函数去处理该按钮的click事件),或者按钮的父级绑定有事件函数,当该点击事件发生在按钮上,按钮本身并无处理事件函数,则传播到父级去处理。