本题库总结于近年来各公司面试题及答案,若有错误,欢迎指正!
怎么理解js原型和原型链(戳本链接)
String,Number,Null,Undefined,Boolean
(补充:引用类型有Object)
js中的this指向问题(戳本链接)
(1)正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式通常缩写成“regex”。
下面先给出两个简单的示例:
^ 为匹配输入字符串的开始位置。
[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。
abc$匹配字母 abc 并以 abc 结尾,$ 为匹配输入字符串的结束位置。
又比如:
runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
colou?r 可以匹配 color 或者 colour,? 号代表前面的字符最多只可以出现一次(0次、或1次)。
(2)正则对象的创建方式
a.隐式创建(即字面量方式)
var 正则对象 = /正则表达式/匹配模式;
b.直接实例化(构造函数方法)
var 正则对象 = new RegExp(‘正则表达式’,’匹配模式’);
(补充:在Javascript中的正则表达式中,匹配模式只有两个。小写字母g:global的缩写,全局匹配;小写字母i:ignore的缩写,忽略大小写)
全局匹配:表达式加上参数g之后,表明可以进行全局匹配(var regx=/user\d/g)。
多行匹配:附加参数m,表明可以进行多行匹配,但是这个只有当使用^和$模式时才会起作用,在其他的模式中,加不加入m都可以进行多行匹配(var regx=/user\d/m)。
a.采用字面量隐式创建
var arr = [];//创建一个空数组
var arr2 = [1,2,3];//创建一个有三个元素的数组
b.采用构造函数创建(直接实例化)
var arr1 = new Array();//创建空数组
var arr2 = new Array(10);//创建一个长度为10的数组
var arr3 = new Array(5,4,3,2,1);//创建数组并初始化
js中一共有七种方法可删除数组元素。
(1)length属性
JavaScript中Array的length属性非常有特点一一它不是只读的。因此,通过设置这个属性可以从数组的末尾移除项或添加新项,请看下面例子:
1 var colors = ["red", "blue", "grey"]; //创建一个包含3个字符串的数组
2 colors.length = 2;
3 console.log(colors[2]); //undefined
(2)delete关键字
要注意的是,使用delete删除元素之后数组长度不变,只是被删除元素被置为undefined了。
1 var arr = [1, 2, 3, 4];
2 delete arr[0];
3 console.log(arr); //[undefined, 2, 3, 4]
(3)pop()栈方法
JavaScript中的Array对象提供了一个pop()栈方法用于弹出并返回数组中的最后一项,某种程度上可以当做删除用。
1 var colors = ["red", "blue", "grey"];
2 var item = colors.pop();
3 console.log(item); //"grey"
4 console.log(colors.length); //2
(4)shift()队列方法
JavaScript中的Array对象提供了一个shift()队列方法用于弹出并返回数组中的第一项,某种程度上也可以当做删除用。
1 var colors = ["red", "blue", "grey"];
2 var color = colors.shift();
3 console.log(color); // "red"
4 console.log(colors.length); // 2
(5)splice()操作方法
在JavaScript的Array对象中提供了一个splice()方法用于对数组进行特定的操作。在删除数组元素的时候,它可以删除任意数量的项,只需要指定2个参数:要删除的第一项的索引和要删除的长度。
1 var colors = ["red", "blue", "grey"];
2 var color = colors.splice(0, 1);
3 console.log(color); // "red"
4 console.log(colors); // ["blue", "grey"]
可以看出,在调用了splice(0, 1)方法时,数组从第一项开始,删除了一项。
(6)迭代方法
所谓的迭代方法就是用循环迭代数组元素,发现符合要删除的项则删除。用的最多的地方,可能是当数组中的元素为对象的时候,可以根据对象的某个属性(例如ID)来删除数组元素。
a.第一种用最常见的ForEach循环来对比元素找到之后将其删除
var colors = ["red", "blue", "grey"];
colors.forEach(function(item, index, arr) {
if(item === "red") {
arr.splice(index, 1);
}
});
可以看到这里还要配合splice()方法去实现删除,循环只是为了找到特定的元素。另外一种思路是循环将不需要删除的元素推入到新的数组中,也能达到假性删除特定元素的目的。
b.第二种用循环中的filter方法
var colors = ["red", "blue", "grey"];
colors = colors.filter(function(item) {
return item != "red"
});
console.log(colors); // ["blue", "grey"]
找出元素不是red的项数返回给colors(其实是得到了一个新的数组,并不是在原数组上进行删除操作),一定程度上也算是达到了删除特定元素的目的。
(7)prototype原型方法
Array.prototype.remove = function(dx) {
if(isNaN(dx) || dx > this.length){
return false;
}
for(var i = 0, n = 0; i < this.length; i++) {
if(this[i] != this[dx]) {
this[n++] = this[i];
}
}
this.length -= 1;
};
var colors = ["red", "blue", "grey"];
colors.remove(1);
console.log(colors); // ["red", "grey"]
这种方法其实就是自己实现一个删除的逻辑,然后把删除方法添加给了Array的原型对象,则在此环境中的所有Array对象都可以使用该方法。尽管可以这么做,但是不推荐在产品化的程序中修改原生对象的原型。道理很简单,如果只是某个实现中缺少某个方法,就在原生对象的原型中添加这个方法,那么当在另一个支持该方法的实现中运行代码时,就可能导致命名冲突。而且这样做可能会意外地导致原生方法被重写。
会报undefined错误,因为数组越界,超出范围了。
a.查
getElementById(id) - 获取带有指定 id 的节点(元素)
document.getElementsByTagName(tagname)-获取带有指定标签名 的节点
document.getElementsByName(name)-获取带有指定name的节点
小结:document.getElementById返回一个对象。document.getElementsByName和document.getElementsByClasName返回一个对象数组
b.增
appendChild(node) - 插入新的子节点(元素)
createElement("div")-通过传入指定的一个标签名来创建一个元素
(使用createElement要注意:通过createElement创建的元素并不属于html文档,它只是创建出来,并未添加到html文档中,要调用appendChild或insertBefore等方法将其添加到HTML文档树中)
c.删
removeChild(node) - 删除子节点(元素)
d.改
a.事件委托:是一种由其它元素而非事件目标元素来响应事件产生的行为的思想。用document元素来处理按钮的点击行为就是事件委托的一个例子,另一种常见情况是,用ul元素来处理其子元素li的事件。这是一种让父元素上的事件监听器也影响子元素的技巧。 可以减少dom的访问次数提高性能。通常,事件传播(捕获和冒泡)允许我们实现事件委托。 冒泡意味着当触发子元素(目标)时,也可以逐层触发该子元素的父元素,直到它碰到DOM绑定的原始监听器(当前目标)。 捕获属性将事件阶段转换为捕获阶段,让事件下移到元素; 因此,触发方向与冒泡阶段相反。
b.事件绑定:在Javascript中,事件绑定一共有3种方式。① 行内绑定;② 动态绑定;③ 事件监听
11 动态页面中一个后添加的按钮怎么绑定事件?
12 json格式的数据传到前端是怎么解析的?
https://blog.csdn.net/weixin_44427784/article/details/105370103(戳本链接)
https://blog.csdn.net/weixin_44427784/article/details/105471597(戳链接)
15 怎么在事件捕获阶段触发事件
16 JS的函数防抖和函数节流的区别?
ExternalInterface
Flash提供了ExternalInterface接口与JavaScript通信。
两个方法:
a.ExternalInterface.addCallback("在js里可调用的flash方法名",flash内方法) //在js里调用flash里的方法
b.ExternalInterface.call("js方法",传给js的参数) //在flash里调用js里的方法
18 js语句可以定义几种类型的值?
2种。混合值和变量值
混合值即字面量
https://blog.csdn.net/weixin_44427784/article/details/105500546(戳链接)
const定义的变量不可以修改,而且必须初始化。
var定义通常定义全局变量且可以修改,可以不初始化,会报undefined,但不会报错,存在变量提升。
let是块级作用域,函数内部使用let定义后,对函数外部无影响,不存在变量提升。
https://blog.csdn.net/weixin_44427784/article/details/105790169(戳链接)
用js的worker类创建实例
var worker=new Worker(参数) //参数填js文件路径
worker.onmessage 接收主线程数据
worker.postMessage 向主线程发送数据