内容来自b站前端小哥
1.数据类型
基本类型引用类型举例:Symbol的作用null 和 undefined 比较像,容易被问到 详细解析链接2.判断变量的类型
typeofinstanceof及原理Object.toSring().call()及原理 [[class]](可以输出对象的内部属性)typeof null //object判断数组的方法判断空对象的方法 详细解析链接3.数据类型转换
相等 == 和 全等 ===强制转换和隐式转换包装类型 详细解析链接4.原型和原型链
构造函数、实例和原型之间的关系 详细解析链接5.闭包
优缺点6.call/apply/bind
7.DOM事件流 和事件委托
捕获、冒泡事件委托及好处p347 p4028.cookie 和 storage
cookie的构成localStorage 和 sessionStorage举例:cookie的HTTP Only9.数组/对象常见的方法
Array :slice/splice/concat/filter/map/reduce 会不会改变原始的值
Object: keys /assign (l可以用于浅拷贝)
10 .new对象时候内部做了什么 详细解析链接
11 .防抖 和 节流 12 .requestAnimationFrame 13 . this 14 . 作用域链 15 . let/var/const
var 的设计可以看做是js语言设计上的错误,于是添加了一个新的关键字let。用var声明一个变量的时候,变量的作用域主要是和函数有关。对于其他块定义来说是没有作用域的,比如if/for。
变量作用域:变量在什么范围内是可用的。
{ var name = "why"; console.log(name) //why } console.log(name); //why监听按钮点击案例
<body> <button>test</button> <button>test</button> <button>test</button> <button>test</button> <button>test</button> <script> console.log(name);*/ var buttons = document.getElementsByTagName("button"); for (var i = 0; i < buttons.length; i++){ buttons[i].addEventListener("click",function () { console.log(i) //i在函数里面,现在i引用的都是函数外面的i(var i) }) } </script> </body>无论点击哪个按钮都是5; 为什么会出现这个问题呢? 因为实际上,在上面的循环中 for(var i= 0)相当于
// 第一次 var = 0 { var i = 0 ; ...... } { ...... } ....... 第二次 var = 1 { ...... } { var i = 1 ...... } .......但是 var定义的i是没有自己的作用域的,执行到最后实际成了这样:
var i = 5; { buttons[i].addEventListener("click",function () { console.log(i) //i在函数里面,现在i引用的都是函数外面的i(var i) }) } { buttons[i].addEventListener("click",function () { console.log(i) //i在函数里面,现在i引用的都是函数外面的i(var i) }) } .......因为回调函数不是立即执行的,当执行到最后的时候 i = 5;因此无论点击哪个都是 5。 解决方案一:闭包(立即执行函数)
var buttons = document.getElementsByTagName("button"); for (var i = 0; i < buttons.length; i++){ (function (i) { buttons[i].addEventListener("click",function () { console.log(i); }) })(i) }因为上面的函数有自己的作用域,所以执行正确。
由于ES5之前因为if 和 for都没有块级作用域的概念,所以在很多时候,我们都借助于function的作用域来解决应用外面变量的问题。但是在ES6中加入了let,let是有块级作用域的。 解决案例二:let
var buttons = document.getElementsByTagName("button"); for (let i = 0; i < buttons.length; i++){ buttons[i].addEventListener("click",function () { console.log(i); })//每一个大括号都有自己的作用域,自己的i }const关键字,将某个变量修饰为常量,不可以再次赋值:
一旦给const修饰的标识符赋值以后,不能修改; 使用const定义标识符,必须进行赋值; 常量的含义是指向的对象不能修改,但是可以改变对象内部的属性。
const name = "why"; name = "abc" //报错 const obj = { name:"zzx"; age:19, height:1.88 } obj.name = "wrx"下面通过示意图解释其中的原理; 在上面的例子中,变量name指向的是字符串“why”,变量本质保存的是内存地址。const实质就是不允许改变其声明的变量的内存地址。 当const声明的是一个对象的时候,是可以改变其中属性的值,因为只改变属性的值不涉及地址的改变。
16 . 异步编程 Promise 和 async await
内部状态promise.race 和 promise.all17.箭头函数 18.js的运行机制
单线程、解释性语言 event loop 、setTimeout 和 promise结合的题目,写结果事件循环宏任务/微任务19.实现继承的方式 p162 详细解析链接
20.垃圾回收 p78
codeTop
1.防抖和节流 2.深拷贝 3.数组扁平化 将一个嵌套多层的数组转化为只有一层的数组 4.单例模式 5.数组去重 6.手写promise.all 和 promise.race 7.模拟实现new 8.实现call/apply/bind 9.模拟Object.ceate()的实现 10.千分位分隔符 数字(考虑数字是否合法、正负号、小数点)、字符串 foo(-1234567.9012) 11.实现三角形 12.实现三栏布局/双栏布局
1.单页应用(SPA)
概念优缺点比较单例应用和多页应用2.MVVM 3.Vue的响应式原理(双向数据绑定) 4.为什么是函数 5.v-model的原理 6.v-if 和 v-show的区别 7.compted、watch和method 8.vue的生命周期
哪个阶段可以操作DOM9.父子组件的生命周期 10.vue组件间的通信方式 11.vue的单向数据流 12.keep - alive组件 13.slot插槽 14.Vue检测数据或对象的变化
vue官方稳定-深入响应式原理vm.$set()**15.虚拟DOM
原理优缺点diff算法**16.vue中key的作用 17.nextTick的原理 18.Vuex
statemutationaction他们三个之间的关系dispatch和commit的区别19.vue-router的两种模式
hashhistory20.vue-router有哪几种导航钩子