
1. js有哪些数据类型,如何强制数据类型转换?
- 数据类型:string number boolean null undefined object symbol
- 相关数据类型转换题目具体请查看 js数据类型转换
2.手写bind
Function.prototype.myBind = function(obj){
const func = this; // 这里绑定this
const args = [...arguments].slice(1); // 拿到初始参数
return function(){ // 返回一个新的函数
// 参数不确定用 apply ,这里合并调用新函数时的参数
func.apply(obj,args.concat([...arguments]))
}
}
function fn(a,b){
console.log(this.name,"测试this绑定")
console.log(a.age,"测试初始参数")
console.log(b,"测试新函数的参数")
}
const o = {
name:"Alias"
}
const myFn = fn.myBind(o,{age:18});
myFn('hello world');
结果:

3.闭包是什么 查看 关于闭包的理解
闭包形成的本质是:外层函数调用之后,外层函数内的作用域对象无法被销毁,被内层函数引用着,无法直接释放内存,比普通函数要占更多的内存
举例:

4.事件模型:冒泡 + 捕获,根据 addEventListener的 第三个参数区分,默认false为冒泡
不支持冒泡的事件:
UI:load scroll resize
焦点事件:focus,blur
鼠标事件:mouseleave,mouseenter
5.事件委托:
父元素可以监听未出生得到子元素,动态添加元素时使用居多,这里不多说了。。
6.this是什么,这段代码this指向是什么
this是call的第一个参数,表示函数执行的作用域。
- fn() 里面的 this 就是 window
- fn() 是 strict mode,this 就是 undefined
- a.b.c.fn() 里面的 this 就是 a.b.c
- new Fn() 里面的 this 就是新生成的实例
- () => console.log(this) 里面 this 跟外面的 this 的值一模一样
- $("#btn").on("click",function(){ 事件监听里面的this是监听的那个DOM对象,就是#btn})
- 使用事件委托的事件监听里面的this仍然是开头绑定的DOM对象
- setInterval,setTimeout 里面的this:箭头函数的this看它外面的this,匿名函数为window

举例1:

难度1:结合闭包

难度2:

7.es5,es6继承,new操作符做了什么:查看 对js继承的理解
8.正则及使用:正则实践与详解
9.DOM深度遍历,遍历一个指定父节点的所有后代节点
function getChild(parent){
if(!parent.children){return}
let children = parent.children;
[...children].forEach((node,i) => {
getChild(node)
console.log(node.classList)
})
}
let parent = document.querySelector(".box");
getChild(parent);

10.为什么要使用虚拟DOM,直接操作DOM的弊端
1.书上的比喻:把DOM和JavaScript(这里指ECMScript)各自想象为一个岛屿,它们之间用收费桥梁连接,ECMAScript每次访问DOM,都要途径这座桥,并交纳“过桥费”,访问DOM的次数越多,费用也就越高。因此,推荐的做法是尽量减少过桥的次数,努力待在ECMAScript岛上。
2.修改DOM树结构会发生浏览器的重排重绘,消耗CPU和内存
虚拟DOM与真实DOM区别:
1.虚拟DOM不会发生重排重绘操作,真实DOM频繁排版与重绘的效率是相当低的造成性能损耗
2.虚拟DOM进行频繁修改,然后一次性比较(差异对比)并修改真实DOM中需要改(局部修改)的部分。
11.0.1+0.2===0.3?原因
这是一件非常诡异的事情,不过接触JavaScript的时间越长,你会不断发现许许多多不合逻辑的问题,比如下面的示例:


关于0.1 + 0.2的问题,参考 为什么0.1+0.2不等于0.3
因为计算机不能精确表示0.1, 0.2这样的浮点数,计算时使用的是带有舍入误差的数,并不是所有的浮点数在计算机内部都存在舍入误差,比如0.5就没有舍入误差,具有舍入误差的运算结可能会符合我们的期望,原因可能是“负负得正”。
那么如何来解决这种问题?
这里使用原生JS API:
parseFloat((数学表达式).toFixed(digits))

12.Number()的存储空间是多大,如果后台发送了一个超过最大字节的数字怎们办
根本原因:JavaScript的Number类型有个最大值(安全值),即2的53次方,为9007199254740992。如果超过这个值,那么js会出现不精确的问题。
解决:
- 后端使用字符串格式发送数据
- 控制用户新建数据时id的长度
13.JavaScript垃圾回收机制
更多阅读:
JS函数详解