Javascript面试题大全
1、JavaScript原型,原型链 ? 有什么特点?
2、eval是做什么的?
它的功能是把对应的字符串解析成JS代码并运行; 应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。
3、null,undefined 的区别?
4、写一个通用的事件侦听器函数。
1 // event(事件)工具集,来源:github.com/markyun 2 markyun.Event = { 3 // 页面加载完成后 4 readyEvent : function(fn) { 5 if (fn==null) { 6 fn=document; 7 } 8 var oldonload = window.onload; 9 if (typeof window.onload != 'function') { 10 window.onload = fn; 11 } else { 12 window.onload = function() { 13 oldonload(); 14 fn(); 15 }; 16 } 17 }, 18 // 视能力分别使用dom0||dom2||IE方式 来绑定事件 19 // 参数: 操作的元素,事件名称 ,事件处理程序 20 addEvent : function(element, type, handler) { 21 if (element.addEventListener) { 22 //事件类型、需要执行的函数、是否捕捉 23 element.addEventListener(type, handler, false); 24 } else if (element.attachEvent) { 25 element.attachEvent('on' + type, function() { 26 handler.call(element); 27 }); 28 } else { 29 element['on' + type] = handler; 30 } 31 }, 32 // 移除事件 33 removeEvent : function(element, type, handler) { 34 if (element.removeEnentListener) { 35 element.removeEnentListener(type, handler, false); 36 } else if (element.datachEvent) { 37 element.detachEvent('on' + type, handler); 38 } else { 39 element['on' + type] = null; 40 } 41 }, 42 // 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获) 43 stopPropagation : function(ev) { 44 if (ev.stopPropagation) { 45 ev.stopPropagation(); 46 } else { 47 ev.cancelBubble = true; 48 } 49 }, 50 // 取消事件的默认行为 51 preventDefault : function(event) { 52 if (event.preventDefault) { 53 event.preventDefault(); 54 } else { 55 event.returnValue = false; 56 } 57 }, 58 // 获取事件目标 59 getTarget : function(event) { 60 return event.target || event.srcElement; 61 }, 62 // 获取event对象的引用,取到事件的所有信息,确保随时能使用event; 63 getEvent : function(e) { 64 var ev = e || window.event; 65 if (!ev) { 66 var c = this.getEvent.caller; 67 while (c) { 68 ev = c.arguments[0]; 69 if (ev && Event == ev.constructor) { 70 break; 71 } 72 c = c.caller; 73 } 74 } 75 return ev; 76 } 77 }; 78 ```
5、Node.js的适用场景?
高并发、聊天、实时消息推送
6、介绍js的基本数据类型。
number,string,boolean,object,undefined
7、Javascript如何实现继承?
通过原型和构造器
8、["1", "2", "3"].map(parseInt) 答案是多少?
[1, NaN, NaN]
因为 parseInt 需要两个参数 (val, radix) 但 map 传了 3 个 (element, index, array)
9、如何创建一个对象? (画出此对象的内存图)
function Person(name, age) {
this.name = name;
this.age = age;
this.sing = function() { alert(this.name) }
}
10、谈谈This对象的理解。
this是js的一个关键字,随着函数使用场合不同,this的值会发生变化。 但是有一个总原则,那就是this指的是调用函数的那个对象。
this一般情况下:是全局对象Global。 作为方法调用,那么this就是指这个对象
11、事件、IE与火狐的事件机制有什么区别? 如何阻止冒泡?
- 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为。
- 事件处理机制:IE是事件冒泡、火狐是 事件捕获;
- ev.stopPropagation();
12、什么是闭包(closure),为什么要用它?
执行say667()后,say667()闭包内部变量会存在,而闭包内部函数的内部变量不会存在.使得Javascript的垃圾回收机制GC不会收回say667()所占用的资源,
因为say667()的内部函数的执行需要依赖say667()中的变量。这是对闭包作用的非常直白的描述.
1 function say667() { 2 // Local variable that ends up within closure 3 var num = 666; 4 var sayAlert = function() { alert(num); } 5 num++; 6 return sayAlert; 7 } 8 9 var sayAlert = say667(); 10 sayAlert()//执行结果应该弹出的667
13、"use strict";是什么意思 ? 使用它的好处和坏处分别是什么?
14、如何判断一个对象是否属于某个类?
15、new操作符具体干了什么呢?
- 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
- 属性和方法被加入到 this 引用的对象中。
- 新创建的对象由 this 所引用,并且最后隐式的返回 this 。
1 var obj = {};
2 obj.__proto__ = Base.prototype;
3 Base.call(obj);
16、Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?
hasOwnProperty
17、JSON 的了解?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小
18、js延迟加载的方式有哪些?
defer和async、动态创建DOM方式(用得最多)、按需异步载入js
19、ajax 是什么?
20、同步和异步的区别?
21、如何解决跨域问题?
jsonp、 iframe、window.name、window.postMessage、服务器上设置代理页面
22、模块化怎么做?
立即执行函数,不暴露私有成员
1 var module1 = (function(){ 2 var _count = 0; 3 var m1 = function(){ 4 //... 5 }; 6 var m2 = function(){ 7 //... 8 }; 9 return { 10 m1 : m1, 11 m2 : m2 12 }; 13 })();
23、AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别?
24、异步加载的方式有哪些?
-
defer,只支持IE
-
async:
-
创建script,插入到DOM中,加载完毕后callBack
25、.call() 和 .apply() 的区别?
例子中用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);
注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
1 function add(a,b) 2 { 3 alert(a+b); 4 } 5 6 function sub(a,b) 7 { 8 alert(a-b); 9 } 10 11 add.call(sub,3,1);
26、Jquery与jQuery UI 有啥区别?
-
jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。
-
jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。 提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等
27、JQuery的源码看过吗?能不能简单说一下它的实现原理?
28、jquery 中如何将数组转化为json字符串,然后再转化回来?
jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展:
1 $.fn.stringifyArray = function(array) { 2 return JSON.stringify(array) 3 } 4 5 $.fn.parseArray = function(array) { 6 return JSON.parse(array) 7 }
然后调用:
1 $("").stringifyArray(array)
29、针对 jQuery 的优化方法?
-
基于Class的选择性的性能相对于Id选择器开销很大,因为需遍历所有DOM元素。
-
频繁操作的DOM,先缓存起来再操作。用Jquery的链式调用更好。 比如:var str=$("a").attr("href");
*for (var i = size; i < arr.length; i++) {} for 循环每一次循环都查找了数组 (arr) 的.length 属性,在开始循环的时候设置一个变量来存储这个数字,可以让循环跑得更快: for (var i = size, length = arr.length; i < length; i++) {}
30、JavaScript中的作用域与变量声明提升?
31、如何编写高性能的Javascript?
32、那些操作会造成内存泄漏?
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。
如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
33、JQuery一个对象可以同时绑定多个事件,这是如何实现的?
34、documen.write和 innerHTML的区别
-
document.write只能重绘整个页面
-
innerHTML可以重绘页面的一部分