提示:预解析 作用域 作用域链 浅拷贝深拷贝 闭包 原型链 没有深入的去写 你们可以深入了解一下

一般 原型链和继承还有闭包问的多(闭包会问在vue项目中哪里使用过闭包 防抖)

如何判断数据类型

typeof(缺点不能判断null  对象  数组   他们返回的都是Obiect 注: undefined是null派生出来的)可以直接使用===全等运算符来判断(如果面试官还问你可以用什么判断Object.prototype.toString 方法)
 instanceof 不能用于判断原始数据类型的数据  
 Array.isArray(value)来判断这个对象是不是数组

如何判断二个对象是否相等

object.is(对象1,对象2)

如何判断是数组还是对象

方法一:通过 ES6 中的 Array.isArray 来识别
 Array.isArray([]) //true
 Array.isArray({}) //false
 方法二:通过 instanceof 来识别
 [] instanceof Array //true
 {} instanceof Array //false
 方法三:通过调用 constructor 来识别
 {}.constructor //返回 object
 [].constructor //返回 Array
 方法四:通过 Object.prototype.toString.call 方法来识别
 Object.prototype.toString.call([]) //["object Array"]
 Object.prototype.toString.call({}) //["object Object"】

什么是伪数组,伪数组如何转化为真数组

伪数组
 1、具有 length 属性
 2、按索引方式存储数据
 3、不具有数组的 push.pop 等方法
 伪数组转真数组
 1.使用 Arrray.from(‘要遍历的对象’,‘map方法’)--ES6
 2.[].slice.call(eleArr) 或则 Array.prototype.slice.call(eleArr)

介绍 this 各种情况

1、以函数形式调用时,this 永远都是 window
 2、以方法的形式调用时,this 是调用方法的对象
 3、以构造函数的形式调用时,this 是新创建的那个对象
 4、使用 call 和 apply 调用时,this 是指定的那个对象
 5、箭头函数:箭头函数的 this 看外层是否有函数
 如果有,外层函数的 this 就是内部箭头函数的 this
 如果没有,就是 window
 6、特殊情况:通常意义上 this 指针指向为最后调用它的对象。这里需要注意的一点就是
 如果返回值是一个对象,那么 this 指向的就是那个返回的对象,如果返回值不是一个对象那么
 this 还是指向函数的实例

数组中的 forEach 和 map 的区别?

相同点: 都是循环遍历数组中的每一项  都有三个参数item(当前每一项),index(索引值),arr(原数组)
 
 不同点
 1.map()会分配内存空间存储新数组并返回,forEach()不会返回数据。
 
 2.forEach()允许callback更改原始数组的元素。map()返回新的数组。

for循环的详细解释

遍历数组可以使用forEach和map
 ES5具有遍历数组功能的还有map、filter、some、every、reduce、等,
 只不过他们的返回结果不一样。但是使用foreach遍历数组的话,使用break不能中断循环,使用return也不能返回到外层函数。
 我们一般只用for in遍历对象  但是for in也可以遍历数组(不推荐),下面我们来说说他遍历数组的不好的地方
      1.index是索引是字符串,不能够直接进行几何运算
      2.遍历顺序有可能不是按照实际数组的内部顺序
      3.他会遍历数组的属性包括原型上的属性及方法(而且遍历的是键  所以for in不适合遍历数组)
      
      
 for of可以遍历数组的值,而不包括数组的原型属性method和索引name
 举个例子:
            var arr=["小林","小吴","小佳"];
           for(var v of arr){
                     console.log(v);
                }
                  打印结果://小林 //小吴 //小佳
 

Call 和 apply,bind 的区别

主要的用途:改变this指向
 call()方法的作用和 apply() 方法类似,区别就是 call()方法接受的是参数列表,而
 apply()方法接受的是一个参数数组
 bind()方法创建一个新的函数,当这个新的函数被调用时,其 this 置为提供的值,其参数
 列表前几项,置为创建时指定的参数序列

如何把二个数组合并成一个

例子:用concat方法拼接一个数组
 
            var array1 = ['a','b','c']; 
            var bArray = ['d','e','f']; 
            var cArray = array1.concat(bArray); 
            
 如何删除数组上的第二个元素:cArray.splice(1,1);

如何把对象合并成一个

object.assign(第一个参数是目标对象,原对象1,原对象2)

Split()和 join()的区别?

Split()是把一串字符(根据某个分隔符)分成若干个元素存放在一个数组里
 即切割成数组的形式;
 join() 是把数组中的字符串连成一个长串,可以大体上认为是 Split()的逆操作

对象遍历

方法一:利用  for...in
 for(键 in 对象){
     console.log(对象[键]);//对象的值  相当于   对象.属性(键)
     console.log(键)//属性
 }
 
 
 方法二:
 遍历对象的键可以用:Object.keys(对象)
 如何遍历对象值可以用:Object.values(对象)
 
 上面二个是新的方法
面试管还经常会问一个和前端不是太有关的问题 由于比较复杂我就不细讲了,你们可以百度

从你输入网址到页面的渲染都做了那些事情

1.输入网址
 2.dns进行缓存记录
 3.dns解析url对应的ip
 4.根据ip建立tcp链接(3次握手)
 5.客户端发起http请求
 6.服务器响应请求
 7.渲染页面,构建DOM树
 8.关闭tcp链接(第四次握手)