奇葩面试题
1,考察this
在函数体内,标识符arguments是指向实参对象的引用,实参对象是一个类数组对象arguments[0],arguments.length
注:这里的坑主要是arguments,我们知道取对象属于除了点操作符还可以用中括号,这里fn的scope是arguments,即fn内的this===arguments,调用时仅传了一个参数fn,因此length为1
2,函数表达式具名(函数声明同时赋值给另一个变量)或函数声明立即执行时,名仅在该函数内可访问
3.变量声明早于代码运行
4.javascript是面向对象的,怎样体现javascript的继承关系
答:使用原型(prototype)方法
5.jquery判断checkbox是否选中的方法
答:
1)if ($("input[type='checkbox']:checked"))
2)if($("input[type='checknox']").is(":checked"))
6.form中的input可以设置为readonly和disabled,请问两者的区别
答:
readonly不可编辑,但可以选择和复制;值可以传到后台;
disabled不可编辑,不可选择和复制;值不能传到后台
7:Scope作用范围
(function() {
vara=b=5;
})();
console.log(b);//5
简述:()()自执行,a=b=5,所有console.log(b)是5
8.坑爹的this
答案:是Aurelio De Rosa和John Doe。原因是,在一个函数中,this的行为,取决于JavaScript函数的调用方式和定义方式,而不仅仅是看它如何被定义的。
在第一个 console.log()调用中,getFullname()被调用作为obj.prop对象的函数。所以,上下文指的是后者,函数返回该对象的 fullname。与此相反,当getFullname()被分配到test变量时,上下文指的是全
局对象(window)。这是因为test是被隐式设置为全局对象的属性。出于这个原因,该函数返回window的fullname,即定义在第一行的那个值。
9.attr和prop的区别
attr是操作属性节点,DOM的API setAttribute,getAttribute(HTML)
prop是操作获取到的对应js对象的属性 (JS)
场景:遇到要获取或设置checked,selected,readonly和disabled等属性时,用prop方法显然更好
prop更高效,因为attr要DOM访问
10.请给出异步加载js方案,不少于两种
简述:1)在用script标签时 有一个async属性 设置其为async
2)可以用回调实现 ,类似于ajax
11.addEventListener,第三个参数是用来表示事件是以事件冒泡还是事件捕获这个各位都知道!但是他问的问题是:
我们给一个dom同时绑定两个点击事件,一个用捕获,一个用冒泡,你来说下会执行几次事件,然后会先执行冒泡还是捕获!!!
简述:都会执行,先执行捕获再执行冒泡 (true为捕获,false为冒泡)
12.下面代码会输出什么:
简述:5(自执行函数和闭包)
14.不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标
解析:先创建一个长度为100的数组,然后再使用数组的实例方法Array.prototype.map来重新赋值,代码如下:
var a = new Array(100);
a = a.map(function(item, index) {
return index;
});
使用了map方法真是高端大气上档期啊!一开始,我也以为他的答案是正确的了,但是,后来我在控制台打印了一下,却发现也是不对的啊,因为,最终打出来的数组是一个长度为100的空的数组,如下:
好奇怪!这么好用的方法竟然输出的结果也不正确,心好累啊!
后来,查了API,才知道, JavaScript数组是稀疏数组,比如,通过new Array(100)创建一个新的数组的,虽然他的长度是100,但是实际上他是一个空数组,也就是说没有真实存在的元素。所以使用map方法,根本不会去遍历这个数组100次的。后来,知乎上问了一下,才学到了一个新的可行的方法,如下:
var a = Array(100).join(",").split(",").map(function(item, index) {
return index;
});
这个解法充满了曲折啊!先是创建一个数组,然后,通过join方法把它转成字符串,然后,再通过split方法把字符串转成数组,这时候,它就拥有100个值为空的元素了,然后,再通过map函数,改变这些元素的值即可。
15.有一个长度为100的数组,请以优雅的方式求出该数组的前10个元素之和
简述:
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
sum = 0;
sum = a.slice(0, 10).reduce(function(pre, current) {
return pre + current;
});
console.log(sum); //55
其中有两个知识点:slice()类似于string中的subString();还有reduce是原生的
jQueryObject.slice(startIndex[,endIndex]);
16.实现对数组进行乱序
简述:
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
sign = 1;
a.sort(function(a, b) {
//因为Math.random产生的数在0-1之间
//所以0.5两边的概率是相等的
//大于0.5时为升序,小于0.5时为降序
sign = (Math.random() > 0.5) ? 1 : -1;
return (a - b) * sign;
});
arrayObject.sort(sortby)
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。