整理一下js面试题
1、Javascript的typeof返回值的类型有哪些
答:number、string、boolean、object、function、undefined
其中Array、object、null的返回值类型为object
2、说出几种显示类型转换和隐式类型转换
答:显示类型转换:
number(将目标转换为数字,如果其中带有字母则转换为NaN;true转换为1,false转换为0;null转换为0;undefined转换为NaN)。
string(将任何目标转换为字符串,包括true、false、undefined、null等)
parseInt(将目标转换为整型,true、false、null、undefined全部转换为NaN;将正常的数字转换为整数,小数直接去掉。注:如果parseInt中含有两个参数,含义就是以第二个参数为基底,将第一个数字转换为十进制的数字)
boolean(将目标转换为true或false)
toString(将其转换为字符串类型)
parseFloat(转换为小时类型,将第一个小数点后面的第一个数字返回,其余截断)
3、split()和join()的区别
答:join()的作用是将数组拼接为字符串,括号中可以填写需要的连接字符,默认的连接字符是“,”。(john.htlm)
split()的作用是将字符串分割,返回数组。
4、数组方法.pop()、.push()、.unshift()、.shift的作用
答:pop()是在尾部删除;push()是在尾部添加;
shift()是在头部删除;unshift()是在头部添加;
5、ajax请求时get和post方式的区别
答:get和post本质上就是TCP连接,并无差别。http请求最初设定了八种方法,这八种方法本质上没有区别,只是让请求更加语义化而已。但是由于http的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
1、发送机制不同
1)get请求时将参数跟在url后面进行传递,而post请求是将参数作为http消息的实体内容发送给web服务器。
2)get请求提交的数据限制是1024字节,这是由于特定浏览器和服务器的限制,如ie的url长度限制是2083字节,而火狐理论上没有长度显示。注意这个限制是url的整个长度的限制,而不只是参数的长度。post理论上没有长度限制。
3)get请求的数据会被浏览器缓存起来,因此其他人可以从浏览器的流失记录中提取到这些数据,如账户名称和密码等等。所以get方式会带来严重的安全问题,而post可以避免这些问题。
2、服务端的区别
1)客户端使用get请求时,服务端使用Request.QueryString来获取,而客户端使用post请求时,服务端使用Request.Form来获取。
2)post用于创建资源,资源的内容会被编入http请示的内容中,例如,处理订货表单等等。
3)当请求无副作用时(如进行搜索),使用get方法,当请求有副作用时(如添加数据),则使用post方法。
6、call和apply的作用是什么,有什么区别
答:call和apply的作用是改变this指向,区别是传参列表不同。
7、什么是闭包,闭包的作用是什么,使用闭包的注意点
1、什么是闭包:
JS的变量分为局部变量和全局变量,函数内部可以读取全局变量,但是函数外部不能读取局部变量。任何未声明而直接赋值的变量都会变为全局变量。因此在正常情况下函数外部不能获得函数内部的局部变量,为了获得这个局部变量,可以在函数内部再定义一个函数,将此函数作为返回值,这样在函数外部就能得到这个局部变量了。因此阿可以理解为闭包是将函数内部和函数外部连接起来的桥梁。
如果一个函数用到了它作用域外面的变量,那么这个变量和这个函数之间的环境就叫闭包。
2、闭包的作用:
1)模仿块级作用域
所谓块级作用域就是指在循环中定义的变量,一旦循环结束,变量也随之销毁,它的作用范围只在这一小块。而在JavaScript中没有这样的块级作用域,由于JavaScript不会告诉你变量是否已经被声明,所以容易造成命名冲突,如果在全局环境定义的变量,就会污染全局环境,因此可以利用闭包的特性来模仿块级作用域。
2)储存变量
闭包的另一个特点是可以保存外部函数的变量,内部函数保留了对外部函数的活动变量的引用,所以变量不会被释放。这种写法可以用在把一些不经常变动计算起来又比较复杂的值保存起来,节省每次的访问时间。
3)封装私有变量
我们可以把函数当做一个范围,函数内部的变量就是私有变量,在外部无法引用,但是我们可以通过闭包的特点访问私有变量。
3、使用闭包的注意点
1)由于闭包会使得函数的变量保存在内存中,内存的消耗很大,所以不能滥用闭包,可能会导致内存泄漏。解决方法是在函数退出之前,将不适用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
8.事件委托是什么,为什么要使用事件委托
答:
1)事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事件,举个例子:页面上有这么一个节点树,div>ul>li>a;比如给最里面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序a>li>ul>div。因此如果我们给最外面的div加点击事件,同时点击div内的ul或li或a标签,都会触发父级div上的点击事件,这就是事件委托,委托它们父级代为执行事件。
2)js中性能优化的主要思想就是减少js直接操作dom的次数,这也就是为什么vue等框架使用虚拟dom的原因,因为每一次直接操作dom节点都会导致浏览器的重拍与重绘,严重影响了浏览器的交互时间。每一个函数就是一个对象,是对象就会占用内存,对象越多占用内存越大,100个li就会占用100个内存空间。如果使用事件委托,就只对它的父级进行操作,与dom的交互就只有一次,大大减少dom的操作次数,显著提高系统性能。
9、简述一下浏览器处理dom事件的过程,如何阻止事件冒泡
答:
dom2.0模型简时间处理流程分为三个阶段
一、事件捕获阶段:当某个元素触发某个事件(如:onlick),顶层对象document就会发出一个事件流,随着DOM树的节点向目标元素节点流去,直到达到真正发生的目标元素。在这个过程中,事件相应的监听函数是不会触发的。
二、事件目标阶段:到达目标元素之后,执行目标元素该事件的相应处理函数。如果没有绑定监听函数,那就不执行。
三、事件起泡阶段:从目标元素开始,往顶层传播。途中如果有节点绑定了相应的事件处理函数,这些函数都会被依次触发。
阻止事件冒泡
ie:e.cancelBubble = true
非ie:e.stopPropagation()
10、如何取消默认事件
答:
W3Cde方法是:e.preventDefault();
IE的方法是:e.returnValue = false;
默认事件:如a标签,具有点击跳转功能,button按钮的默认提交功能等。
11、添加节点、删除节点、替换节点、插入节点的方法
1)创建新节点:
createElement()//创建一个具体的元素节点
createTextNode()//创建一个指定文本的节点
2)操作节点
添加:appendChild()
移除:removeChild()
替换:replaceChild()
插入:insertBefore()
3)查找节点
通过标签名称:getElementByTagName()
通过name属性:getElementByName()
通过元素id(具有唯一性):getElementById()
12、简述一下什么是ajax,如何发送一个ajax请求
答:
1)AJAX = Asynchronous JavaScript and XML,这不是新的编程语言,而是一种使用现有标准的新方法,它最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。AJAX不需要任何的浏览器插件,但需要用户允许JavaScript在浏览器上执行。
2)发送ajax请求的步骤
1创建一个对象XMLHttpRequest
var xhr = new XMLHttpRequest();为了支持ie6以及更早的版本,要 var xhr=new ActiveXObject()
2监听请求成功后的状态变化
3设置请求参数
4发起请求
5操作dom,实现动态局部刷新
13、一个完整的http请求的步骤是什么
1、建立tcp连接
2、web浏览器向web服务器发送请求命令
3、web浏览器发送请求头信息
4、web服务器应答
5、web服务器向浏览器发送应答头信息
6、web服务器向浏览器发送数据
7、web服务器关闭tcp连接
14、解释一下什么是jsonp,为什么不是真正的ajax
jsonp是用来解决跨域获取数据的一种解决方案,具体是通过动态创建script标签,然后通过标签的src属性获取js文件中的js脚本。该脚本的内容是一个函数调用,参数就是服务器返回的数据,为了处理这些返回的数据,需要事先在页面定义好回调函数,本质上使用的并不是ajax技术。
ajax的核心是:通过XmlHttpRequest获取非本页的内容
jsonp的核心是:通过动态添加