vue面试指南

```

## 1. typeof运算符和instanceof运算符以及isPrototypeOf()方法的区别
typeof是一个运算符,用于检测数据的类型,比如基本数据类型null、undefined、string、number、boolean,以及引用数据类型object、function,但是对于正则表达式、日期、数组这些引用数据类型,它会全部识别为object; instanceof同样也是一个运算符,它就能很好识别数据具体是哪一种引用类型。它与isPrototypeOf的区别就是它是用来检测构造函数的原型是否存在于指定对象的原型链当中;而isPrototypeOf是用来检测调用此方法的对象是否存在于指定对象的原型链中,所以本质上就是检测目标不同。
## 2.call()和apply()的区别
实际上,apply和call的功能是一样的,只是传入的参数列表形式不同。apply传的是数组;
## 3.全局函数eval()有什么作用?
eval()只有一个参数,如果传入的参数不是字符串,它直接返回这个参数。如果参数是字符串,它会把字符串当成javascript代码进行编译。如果编译失败则抛出一个语法错误(syntaxError)异常。如果编译成功,则开始执行这段代码,并返回字符串中的最后一个表达式或语句的值,如果最后一个表达式或语句没有值,则最终返回undefined。如果字符串抛出一个异常,这个异常将把该调用传递给eval()。
## 4.描述以下变量的区别:null,undefined或undeclared
null 表示"没有对象",即该处不应该有值,转为数值时为0。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
undefined 表示"缺少值",就是此处应该有一个值,但是还没有定义,转为数值时为NaN。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
undeclared :js语法错误,没有申明直接使用,js无法找到对应的上下文。
## 5.==和===有什么区别?
首先,== equality 等同,=== identity 恒等。==,两边值类型不同的时候,要先进行类型转换,再比较。===,不做类型转换,类型不同的一定不等。
## 6.同步异步?
1>、进程同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事 
2>、异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
## 7. 什么是事件代理/事件委托?
事件代理/事件委托是利用事件冒泡的特性,将本应该绑定在多个元素上的事件绑定在他们的祖先元素上,尤其在动态添加子元素的时候,可以非常方便的提高程序性能,减小内存空间。
## 8.什么是事件冒泡?什么是事件捕获?
冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。
捕获型事件:事件从最不精确的对象(document 对象)开始触发,然后到最精确(也可以在窗口级别捕获事件,不过必须由开发人员特别指定)。
支持W3C标准的浏览器在添加事件时用addEventListener(event,fn,useCapture)方法,基中第3个参数useCapture是一个Boolean值,用来设置事件是在事件捕获时执行,还是事件冒泡时执行。而不兼容W3C的浏览器(IE)用attachEvent()方法,此方法没有相关设置,不过IE的事件模型默认是在事件冒泡时执行的,也就是在useCapture等于false的时候执行,所以把在处理事件时把useCapture设置为false是比较安全,也实现兼容浏览器的效果。
## 9.如何阻止冒泡?
w3c的方法是e.stopPropagation(),IE则是使用e.cancelBubble = true。例如: window.event? window.event.cancelBubble = true : e.stopPropagation();
return false也可以阻止冒泡。
## 10.如何阻止默认事件?
{
w3c的方法是e.preventDefault(),IE则是使用e.returnValue = false,比如:
function stopDefault( e ) { 
    //阻止默认浏览器动作(W3C) 
    if ( e && e.preventDefault ) 
        e.preventDefault(); 
    //IE中阻止函数器默认动作的方式 
    else 
        window.event.returnValue = false; 
}
}
return false也能阻止默认行为。
## 11.简述javascript中this的指向
第一准则是:this永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。
普通的函数调用,函数被谁调用,this就是谁。
构造函数的话,如果不用new操作符而直接调用,那即this指向window。用new操作符生成对象实例后,this就指向了新生成的对象。
匿名函数或不处于任何对象中的函数指向window 。
如果是call,apply等,指定的this是谁,就是谁。
## 12.原生对象和宿主对象
原生对象是ECMAScript规定的对象,所有内置对象都是原生对象,比如Array、Date、RegExp等;
宿主对象是宿主环境比如浏览器规定的对象,用于完善是ECMAScript的执行环境,比如Document、Location、Navigator等。
## 13.基本数据类型和引用数据类型
基本数据类型指的是简单的数据段,有5种,包括null、undefined、string、boolean、number;
引用数据类型指的是有多个值构成的对象,包括object、array、date、regexp、function等。
主要区别:
声明变量时不同的内存分配:前者由于占据的空间大小固定且较小,会被存储在栈当中,也就是变量访问的位置;后者则存储在堆当中,变量访问的其实是一个指针,它指向存储对象的内存地址。
也正是因为内存分配不同,在复制变量时也不一样。前者复制后2个变量是独立的,因为是把值拷贝了一份;后者则是复制了一个指针,2个变量指向的值是该指针所指向的内容,一旦一方修改,另一方也会受到影响。
参数传递不同:虽然函数的参数都是按值传递的,但是引用值传递的值是一个内存地址,实参和形参指向的是同一个对象,所以函数内部对这个参数的修改会体现在外部。原始值只是把变量里的值传递给参数,之后参数和这个变量互不影响。
## 14.AJAX的工作原理
ajax简单来说是通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。
ajax的优点
最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好。
使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。
可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本,ajax的原则是“按需取数据”,可以最大程度的减少冗余请求。
基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。
ajax的缺点
ajax对浏览器后退机制造成了破坏,也就是说用户无法通过浏览器的后退按钮回到前一次操作的页面。虽然有些浏览器解决了这个问题,比如Gmail,但它也并不能改变ajax的机制,它所带来的开发成本是非常高的,和ajax框架所要求的快速开发是相背离的。这是ajax所带来的一个非常严重的问题。
安全问题。技术同时也对IT企业带来了新的安全威胁,ajax技术就如同对企业数据建立了一个直接通道。这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。
对搜索引擎的支持比较弱。
破坏了程序的异常机制。至少从目前看来,像ajax.dll,ajaxpro.dll这些ajax框架是会破坏程序的异常机制的。关于这个问题,我曾经在开发过程中遇到过,但是查了一下网上几乎没有相关的介绍。后来我自己做了一次试验,分别采用ajax和传统的form提交的模式来删除一条数据……给我们的调试带来了很大的困难。
另外,像其他方面的一些问题,比如说违背了url和资源定位的初衷。例如,我给你一个url地址,如果采用了ajax技术,也许你在该url地址下面看到的和我在这个url地址下看到的内容是不同的。这个和资源定位的初衷是相背离的。
## 15.get和post有什么区别?
其实,GET和POST本质上两者没有任何区别。他们都是HTTP协议中的请求方法。底层实现都是基于TCP/IP协议。所谓区别,只是浏览器厂家根据约定,做得限制而已。
get是通过明文发送数据请求,而post是通过密文;
get传输的数据量有限,因为url的长度有限,post则不受限;
GET请求的参数只能是ASCII码,所以中文需要URL编码,而POST请求传参没有这个限制
GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
## 16.document.onload和document.ready两个事件的区别
页面加载完成有两种事件,一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件),二是onload,指示页面包含图片等文件在内的所有元素都加载完成。
## 17.什么是三元表达式
三元表达式:? :。三元--三个操作对象。
在表达式boolean-exp ? value0 : value1 中,如果“布尔表达式”的结果为true,就计算“value0”,而且这个计算结果也就是操作符最终产生的值。如果“布尔表达式”的结果为false,就计算“value1”,同样,它的结果也就成为了操作符最终产生的值。
## 18.JavaScript里arguments
Javascrip中国每个函数都会有一个Arguments对象实例arguments,它引用着函数的实参,可以用数组下标的方式"[]"引用arguments的元素。arguments.length为函数实参个数,arguments.callee引用函数自身。
在函数代码中,使用特殊对象arguments,开发者无需明确指出参数名,通过使用下标就可以访问相应的参数。
  function test() {
    var s = "";
    for (var i = 0; i < arguments.length; i++) {
        alert(arguments[i]);
        s += arguments[i] + ",";
    }
    return s;
}
test("name", "age");//name,age
arguments虽然有一些数组的性质,但其并非真正的数组,只是一个类数组对象。其并没有数组的很多方法,不能像真正的数组那样调用.jion(),.concat(),.pop()等方法。
## 19.什么是"use strict";?使用它的好处和坏处分别是什么?
在代码中出现表达式-"use strict"; 意味着代码按照严格模式解析,这种模式使得Javascript在更严格的条件下运行。
好处:
消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
消除代码运行的一些不安全之处,保证代码运行的安全;
提高编译器效率,增加运行速度;
为未来新版本的Javascript做好铺垫。
坏处:
    同样的代码,在"严格模式"中,可能会有不一样的运行结果;
 一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。
## 20.解释一下JavaScript的同源策略
同源策略,即拥有相同的协议(protocol),端口(如果指定),主机(域名)的两个页面是属于同一个源。 然而在IE中比较特殊,IE中没有将端口号加入同源的条件中,因此上图中端口不同那一项,在IE中是算同源的。 <script> <img> <iframe>中的src,href都可以任意链接网络资源,是不遵循通源策略的。
## 21.解释JSONP的工作原理
JSONP (JSON with Padding)是一个简单高效的跨域方式,HTML中的script标签可以加载并执行其他域的javascript,于是我们可以通过script标记来动态加载其他域的资源。例如我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的形式声明pageA需要的数据,然后在 pageA中用script标签把pageB加载进来,那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数,pageB加载完之后会执行pageA中定义的函数,所需要的数据会以参数的形式传递给该函数。JSONP易于实现,但是也会存在一些安全隐患,如果第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。
AJAX是不跨域的,而JSONP是一个是跨域的,还有就是二者接收参数形式不一样!
## 22.什么是跨域?
跨域需要针对浏览器的同源策略来理解,同源策略指的是请求必须是同一个端口,同一个协议,同一个域名,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。
受浏览器同源策略的影响,不是同源的脚本不能操作其他源下面的对象。想要操作另一个源下的对象是就需要跨域。
## 23. 什么是原型?
 原型链:简单来讲就是原型组成的链,比如函数的原型是Function,Function的原型是Object,Object的原型仍然是Object,一直追溯到最终的原型对象。
函数通过prototype来追溯原型对象,对象通过_proto_来追溯原型对象。
通过一个构造函数创建出来的多个实例,如果都要添加一个方法,给每个实例去添加并不是一个明智的选择。这时就该用上原型了。
在实例的原型上添加一个方法,这个原型的所有实例便都有了这个方法。
原型链继承:
``` function A(){
    this.name="amy";
}
function B(){
    this.age="20"; //B继承了A,通过原型,形成链条
}
B.prototype=new A();
var a=new B();
console.log(a.name)//结果:amy
## 24. 什么是闭包?
闭包就是能够读取其他函数内部变量的函数,通常是函数嵌套时产生,它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在外部函数调用后被自动清除。
## 25.如何防抖?
何为防抖 多次触发事件后,事件处理函数只执行一次,并且是在触发操作结束时执行,一般用于scroll事件。
解决原理 对处理函数进行延时操作,若设定的延时到来之前再次触发事件,则清除上一次的延时操作定时器,重新定时。
``` let timer;
window.onscroll  = function () {
    if(timer){
        clearTimeout(timer)
    }
    timer = setTimeout(function () {
        //滚动条位置
        let scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
        console.log('滚动条位置:' + scrollTop);
        timer = undefined;
    },200)
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北冥有鱼,其名为鲲......

你的鼓励是我最大的成长

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值