面经 2019/11/28 未完待续...
1、如何判断变量类型?typeof、instance of、constructor、Object.prototype.toString.call()。只用前2个会有局限性
typeof:在判断变量类型的时候比较适合用来处理基本数据类型,如果是引用类型的值 typeof恐怕就心有余而力不足了。
instanceof:会根据_proto_一层层往上找,找到匹配的数据类型就会输出true 找到null找不到才输出false 该运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
constructor: 为了避免_propo_的一层层找 我们引用constructor方法 此属性返回对创建此对象的数组函数的引用
Object.prototype.toString.call():在js中该方法可以精准的判断对象类型,也是推荐使用的方法。可以判断基本数据类型:
2、call,apply,bind的不同? bind返回的是一个函数,而apply会立即执行
call、apply与bind区别:前两个可以自动执行,bind不会自动执行,需要手动调用
call、bind与apply区别:前两个都有无数个参数,apply只有两个参数,而且第二个参数为数组
3、跨域解决办法:document.domain, location.hash, window.name, window.postMessage, JSONP, WebSocket, CORS 。
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
由 XMLHttpRequest 或 Fetch 发起的跨域 HTTP 请求。
document.domain:若两个源所用协议、端口一致,主域相同而二级域名不同的话,可以借鉴该方法解决跨域请求。
JSONP:全称 JSON with Padding,是使用 AJAX 实现的请求不同源的跨域
jsonp虽然很简单,但是有如下缺点:
1)安全问题(请求代码中可能存在安全隐患)
2)要确定jsonp请求是否失败并不容易
XMLHttpRequest :
abort():停止当前请求;
getAllResponseHeaders():把HTTP请求的所有相应首部作为键/值对返回;
getResponseHeader("header"):返回指定首部的串值;
open("method", "url"):建立对服务器的调用;
send(content):向服务器发送请求;
setRequestHeader("header", "value"):把指定首部设置为所提供的值,在设置任何首部之前必须先调用open();
web sockets:
4、原生ajax的步骤:记忆不深。
原生:oAjax.open("GET", "a.txt?t='+new Date().getTime()", true);//加上t='+new Date().getTime()"
oAjax.send();
//客户端和服务器端有交互的时候会调用onreadystatechange
oAjax.onreadystatechange = function () {
if (oAjax.readyState == 4) {
if (oAjax.status == 200)//判断是否成功,如果是200,就代表成功
{
alert("成功" + oAjax.responseText);//读取a.txt文件成功就弹出成功。后面加上
oAjax.responseText会输出a.txt文本的内容
}
else {
alert("失败");
}
}
ajax的jquery写法:
$.ajax({
url: "", //请求的url地址 dataType: "json", //返回格式为json
async: true, //请求是否异步,默认为异步,这也是ajax重要特性
data: { }, //参数值 type: "GET", //请求方式
processData: false, //对表单data数据是否进行序列化
contentType: false, //dataType设置你收到服务器数据的格式
beforeSend: function () {
//请求前的处理
},
success: function (req) {
//请求成功时处理
},
complete: function () {
//请求完成的处理
},
error: function () {
//请求出错处理
}
});
5、promise.all方法不了解。类似的还有race、finally等有兴趣跨域看一下
6、箭头函数与普通函数的区别:回答不太好
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
7、es6等新特性了解的较浅:promise的方法、async、模板字符串`` 解构赋值
8、spa单页面应用不了解。
9、vue keep-alive、vue router路由模式、vuex常用命令、active生命周期
keep-alive: 组件实例能够被在它们第一次被创建的时候缓存下来
vue router路由模式:
state gettters mutations action modules
active生命周期: 创建 挂载 更新 删除
ES6、7等新特性学习不深,建议花时间学习一下阮一峰的ECMAScript 6 入门。如常用的结构赋值、模板字符串、class、async、module等。 框架方面库建议选择react、vue、angular中的一个深入学习使用。
也可以了解一下现在前端的发展方向https://github.com/kamranahmedse/developer-roadmap。