JavaScript经典⾯试题系列
1.javascript的typeof返回哪些数据类型
Object number function boolean underfind
2.例举3种强制类型转换和2种隐式类型转换?
强制(parseInt,parseFloat,number) 隐式(== – ===)
3.split() join() 的区别
前者是切割成数组的形式,后者是将数组转换成字符串
4.数组⽅法pop() push() unshift() shift()
Push()尾部添加 pop()尾部删除 Unshift()头部添加 shift()头部删除
5.事件绑定和普通事件有什么区别
事件绑定就是针对dom元素的事件,绑定在dom元素上,普通事件即为⾮针对dom元素的事件、普通添加事件的⽅法不⽀持添加多个事件,最下⾯的事件会覆盖上⾯的,⽽事件绑定(addEventListener)⽅式添加事件可以添加多个。
提⽰:addEventListener不兼容低版本IE,使⽤addEventListener添加事件之前,请先处理兼容问题。普通添加事件的⽅法:
1 var btn = document.getElementById(\"hello\");2 btn.onclick = function(){3 alert(1);4 }
5 btn.onclick = function(){6 alert(2);7 }
执⾏上⾯的代码只会alert 2
事件绑定⽅式添加事件:
1 var btn = document.getElementById(\"hello\");2 btn.addEventListener(\"click\function(){3 alert(1);4 },false);
5 btn.addEventListener(\"click\function(){6 alert(2);7 },false);
执⾏上⾯的代码会先alert 1 再 alert 2
6.IE和DOM事件流的区别
1.执⾏顺序不⼀样、 2.参数不⼀样 3.事件加不加on 4.this指向问题
7.IE和标准下有哪些兼容性的写法
Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth Var target = ev.srcElement||ev.target
8.ajax请求的时候get 和post⽅式的区别
⼀个在url后⾯ ⼀个放在虚拟载体⾥⾯ 有⼤⼩ 安全问题
应⽤不同 ⼀个是论坛等只需要请求的,⼀个是类似修改密码的
9.call和apply的区别
Object.call(this,obj1,obj2,obj3) Object.apply(this,arguments)
10.ajax请求时,如何解释json数据
使⽤eval parse 鉴于安全性考虑 使⽤parse更靠谱 11.b继承a的⽅法
12.写⼀个获取⾮⾏间样式的函数⽅法1:
function getStyle(obj, attr, value) { if (!value) {
if (obj.currentStyle) {
return obj.currentStyle(attr) }
else {
obj.getComputedStyle(attr, false) } }
else {
obj.style[attr] = value }}
⽅法2
function getStyle(obj, attr) {
return obj.currentStyle ? obj.currentStyle : getComputedStyle(obj)[attr];}
13.事件委托是什么
让利⽤事件冒泡的原理,让⾃⼰的所触发的事件,让他的⽗元素代替执⾏!
14.闭包是什么,有什么特性,对页⾯有什么影响
闭包就是能够读取其他函数内部变量的函数。⼀个拥有许多变量和绑定了这些变量的环境的表达式(通常是⼀个函数),因⽽这些变量也是该表达式的⼀部分。闭包的特点:
1. 作为⼀个函数变量的⼀个引⽤,当函数返回时,其处于激活状态。
2. ⼀个闭包就是当⼀个函数返回时,⼀个没有释放资源的栈区。
简单的说,script允许使⽤内部函数---即函数定义和函数表达式位于另⼀个函数的函数体内。⽽且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中⼀个这样的内部函数在包含它们的外部函数之外被调⽤时,就会形成闭包。
1 (function(x, y){2 alert(x + y); 3 })(2, 3);
15.如何阻⽌事件冒泡和默认事件
canceBubble return false
16.添加 删除 替换 插⼊到某个接点的⽅法
obj.appendChidl() obj.innersetBefore obj.replaceChild obj.removeChild
17.解释jsonp的原理,以及为什么不是真正的ajax
动态创建script标签,回调函数 Ajax是页⾯⽆刷新请求数据操作
18.javascript的本地对象,内置对象和宿主对象
本地对象为array obj regexp等可以new实例化 内置对象为gload Math 等不可以实例化的 宿主为浏览器⾃带的document,window 等
19.document load 和document ready的区别
Document.onload 是在结构和样式加载完才执⾏js
Document.ready原⽣种没有这个⽅法,jquery中有 $().ready(function)
20.”==”和“===”的不同
”==”与”===”是不同的,⼀个是判断值是否相等,⼀个是判断值及类型是否完全相等。前者会⾃动转换类型,后者不会。
先说 ===,这个⽐较简单。下⾯的规则⽤来判断两个值是否===相等: 1、如果类型不同,就[不相等]
2、如果两个都是数值,并且是同⼀个值,那么[相等];(!例外)的是,如果其中⾄少⼀个是NaN,那么[不相等]。(判断⼀个值是否是NaN,只能⽤isNaN()来判断)
3、如果两个都是字符串,每个位置的字符都⼀样,那么[相等];否则[不相等]。 4、如果两个值都是true,或者都是false,那么[相等]。
5、如果两个值都引⽤同⼀个对象或函数,那么[相等];否则[不相等]。 6、如果两个值都是null,或者都是undefined,那么[相等]。 再说 ==,根据以下规则:
1、如果两个值类型相同,进⾏ === ⽐较。
2、如果两个值类型不同,他们可能相等。根据下⾯规则进⾏类型转换再⽐较: a、如果⼀个是null、⼀个是undefined,那么[相等]。
b、如果⼀个是字符串,⼀个是数值,把字符串转换成数值再进⾏⽐较。
c、如果任⼀值是 true,把它转换成 1 再⽐较;如果任⼀值是 false,把它转换成 0 再⽐较。
d、如果⼀个是对象,另⼀个是数值或字符串,把对象转换成基础类型的值再⽐较。对象转换成基础类型,利⽤它的toString或者valueOf⽅法。js核⼼内置类,会尝试valueOf先于toString;例外的是Date,Date利⽤的是toString转换。 e、任何其他组合,都[不相等]。
举例:
\"1\" == true
类型不等,true会先转换成数值 1,现在变成 \"1\" == 1,再把\"1\"转换成 1,⽐较 1 == 1, 相等。 = 赋值运算符 == 等于
=== 严格等于 例:
var a = 3; var b = \"3\"; a==b 返回 true a===b 返回 false 因为a,b的类型不⼀样
===⽤来进⾏严格的⽐较判断
简⽽⾔之就是“==”只要求值相等。“===”要求值和类型都相等。
21.javascript的同源策略 ⼀段脚本只能读取来⾃于同⼀来源的窗⼝和⽂档的属性,这⾥的同⼀来源指的是主机名、协议和端⼝号的组合22.编写⼀个数组去重的⽅法
window.onload = function () {
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; for (var i = 0; i < arr.length; i++) {
for (var j = i+1; j < arr.length; j++) { if (arr[i] == arr[j]) { arr.splice(j, 1); j--; } } }
alert(arr); }
23.编写⼀个数组从⼤到⼩的排序⽅法
1 //数组排序,从⼤到⼩,⽅法1:
2 var arrSimple=new Array(1,8,7,6); 3 arrSimple.sort();
4 document.write(arrSimple.join()); 5
6 //数组排序,从⼤到⼩,⽅法2:
7 var arrSimple2=new Array(1,8,7,6); 8 arrSimple2.sort(function(a,b){
9 return b-a;10 });
11 document.write(arrSimple2.join());12
13 //解释:a,b表⽰数组中的任意两个元素,若return > 0 b前a后;reutrn < 0 a前b后;a=b时存在浏览器兼容简化⼀下:a-b输出从⼩到⼤排序,b-a输出从⼤到⼩排序。14
24.如何交换两个数的位置
var a=10;var b=20;a= a+b;//30b= a-b;//10a= a-b;//20
alert('a:'+a + 'b:'+b);