一、html&css
1.html5新增的标签属性
2.css3新增的属性
3.position定位
4.浮动
5.盒子模型
6.margin问题
7.display的属性值
8.background属性值
9.px、rem、em的区别
10. css动画和js动画的区别
1.js是帧动画,当js在浏览器主线程运行时,主线程还有其他需要运行的js脚本、样式、计算、布局、交互等一系列任务,对其干扰线程可能出现阻塞,造成丢帧的情况。
2. js动画通过js引擎解析,css通过 GUI渲染,效果更流畅
二、js相关问题
1.js的基本数据类型和引用数据类型
2.const,let,val的区别
3.说说作用域
在es6的let和const推出之前,js并没有块作用域的概念,只有全局作用域和函数作用域。
4.instanceof和typeof 的区别
5.隐式转换有哪些
6.闭包
7.原型和原型链
(1)、原型
任何对象都有一个原型对象除了null,这个原型对象由对象的内置属性_proto_指向它的构造函数的prototype
即任何对象都是由一个构造函数创建的,但是,不是每一个对象都有prototype,只有方法才有prototype。
(2)、什么是原型链?
原型链的核心就是依赖对象的_proto_的指向,当查找自身不存在的属性时,就一层层的扒出创建对象的构造函数,直至到Object时,就没有_proto_指向了。
因为_proto_实质找的是prototype,所以我们只要找这个链条上的构造函数的prototype。其中Object.prototype是没有_proto_属性的,它==null。
(3)、原型链查找分析:
当访问一个对象的成员的时候,会先在自身找有没有,如果找到直接使用。
如果没有找到,则去原型链指向的对象的构造函数的prototype中找,找到直接使用,没找到就返回undifined或报错。
function Person(name){
this.name = name;
}
var p = new Person();
p ---> Person.prototype --->Object.prototype---->null
8.call和apply的区别
9.new干了什么
10.this的指向
11.箭头函数
相对于普通函数的区别,新的书写方式 ,this 的改变,不能当构造函数,没有 prototype 属性,没有 arguments 对象
讨论箭头函数的 this 之前,不得不再熟悉一下 执行上下文(Execution Context),因为 this 指针(this value) 就存储在执行上下文中。
执行上下文保存着函数执行所需的重要信息,其中有三个属性:变量对象(variable object),作用域链(scope chain),this指针(this value),它们影响着变量的解析、变量作用域、函数 this 的指向。执行上下文分为 全局执行上下文 和 函数执行上下文。
函数预编译的 this 分下面四种情况:
第一种: 函数自主调用 如 fun() 或者是 普通的立即执行函数(区别于箭头函数方式的立即执行函数), this 指向 window;
第二种: 函数被调用,当函数被某个对象调用时,函数产生的执行上下文中的 this 指向 该对象;
第三种: 通过 call() apply() bind() 方法改变 this,this 指向被传入的 第一个参数;
第四种: 在构造函数中,this 指向被创建的 实例
箭头函数不会创建自己的 this,它只会从自己的作用域链上找父级执行上下文的 this
*由于箭头函数是不能通过 call() apply() bind() 方法改变 this,也不能当做构造函数
12.setTimeout、Promise、async/await 三者之间异步解决方案的区别?
13.实现节流和防抖
function throttle(fn){
let can = true;
return function(){
if(!can)return;
can = false;
setTimeout(() => {
fn.apply(this,arguments);
can = true
}, 2000);
}
}
function debounce(fn) {
let timeout = null; // 创建一个标记用来存放定时器的返回值
return function () {
clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉
timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 fn 函数
fn.apply(this, arguments);
}, 500);
};
}
14.对象深拷贝
function deepClone(source){
const targetObj = source.constructor === Array ? [] : {}; // 判断复制的目标是数组还是对象
for(let keys in source){ // 遍历目标
if(source.hasOwnProperty(keys)){
if(source[keys] && typeof source[keys] === 'object'){ // 如果值是对象,就递归一下
targetObj[keys] = source[keys].constructor === Array ? [] : {};
targetObj[keys] = deepClone(source[keys]);
}else{ // 如果不是,就直接赋值
targetObj[keys] = source[keys];
}
}
}
return targetObj;
}
15.setTimeout在跳转页面之后是否还会继续执行
16.多页面还单页面的区别
17.说一下设计模式有哪些
19.http缓存原理
20.常见的状态码有哪些
21.js事件流
22.get,post的区别
1.post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)
2.post发送的数据量更大(get有url长度限制)
3.post能发送更多的数据类型(get只能发送ASCII字符)
4.post支持4种提交格式
application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml
最重要的一条,post在真正接受数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据
post请求的过程:
1.浏览器请求tcp连接(第一次握手)
2.服务器答应进行tcp连接(第二次握手)
3.浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
4.服务器返回100 continue响应
5.浏览器开始发送数据
6.服务器返回200 ok响应
get请求的过程
1.浏览器请求tcp连接(第一次握手)
2.服务器答应进行tcp连接(第二次握手)
3.浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
4.服务器返回200 ok响应
23.js事件循环机制,宏任务与微任务有哪些
常见的微任务有Promise、process.nextTick、MutationObserver
常见的宏任务:script、setTimeout、setInterval、setImmediate
发出疑问:到底是宏任务优先还是微任务优先?(个人观点:微任务优于宏任务)
Event Loop执行顺序为:
先执行宏任务script,并执行里面的同步任务;执行栈为空后查询是否存在微任务,存在就立即执行,然后开始下一轮的事件循环
24.实现响应式数据
var oldArrayProto = Array.prototype;
var arrProto = Object.create(oldArrayProto);
['push', 'pop', 'shift', 'unshift', 'splice'].forEach(methodName => {
arrProto[methodName] = function () {
console.log("进来额")
update() // 触发视图更新
oldArrayProto[methodName].call(this, ...arguments)
}
})
function update(val) {
console.log("数据发生了变化",obj.nums);
}
function define(target,key,value){
observer(value)
Object.definePrototype(target,key,{
get(){
return value;
},
set(val){
if(val !== value){
value = val;
observer(value);
update()
}
}
})
}
function observer(obj){
if(typeof obj !== 'object' || obj === null) {
reutrn obj;
}
if(Array.isArray(obj)){
obj._proto_ = arrProto;
}
for(let key in obj){
define(obj,key,obj[key]);
}
}
25. 0.1+0.2 = ? js为什么会有精度问题?
JS 数字类型只有number类型,number类型相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型。
number 有四种进制表示方法,十进制,二进制,八进制和十六进制
由于Js的所有数字类型都是双精度浮点型(64位)采用 IEEE754 标准
计算机中的数字都是以二进制存储的,如果要计算 0.1 + 0.2 的结果,计算机会先把 0.1 和 0.2 分别转化成二进制,然后相加,最后再把相加得到的结果转为十进制,0.1 和 0.2 在转换为二进制时就发生了一次精度丢失,而对于计算后的二进制又有一次精度丢失 。
26. try catch的作用域
27.获取url ?后的参数
28.jquery的链式调用和promise的链式调用
jquery的方法都是挂在在原型上的,每次调用内部方法会返回this,返回当前的实例对象
promise的then,每次都会返回一个新的promise
29.async 和defer的区别