提示:预解析 作用域 作用域链 浅拷贝深拷贝 闭包 原型链 没有深入的去写 你们可以深入了解一下
一般 原型链和继承还有闭包问的多(闭包会问在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链接(第四次握手)