一.(2014阿里巴巴校招在線筆試)
題目:請選擇出前端頁面開發,執行javascript代碼alert(1)的代碼:
1.<iframe src="javascript:alert(1);"></iframe>
2.<img src=""/onerror=alert(1);>
3.<s style="top:expression(alert(1))"></s>
4.<div onclick="alert(1)"></div>
分析:事實證明1,2,3都可以,just try...
1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta charset=utf-8> 5 <title>demo</title> 6 </head> 7 <style> 8 9 </style> 10 11 <body> 12 <!-- 成功alert(1) --> 13 <!-- <iframe src="javascript:alert(1);"></iframe> --> 14 <!-- 成功alert(1) --> 15 <!-- <img src=""/onerror=alert(1);> --> 16 <!-- ie下兼容性視圖成功alert(1) --> 17 <!-- <s style="top:expression(alert(1))"></s> --> 18 <!-- 沒有alert(1) --> 19 <div onclick="alert(1)"></div> 20 21 22 </body> 23 </html>
二、(2014阿里巴巴校招在線筆試)
題目:請指出以下哪些是ECMAScript5新增的特性:
1.Object.hasOwnProperty()
2.Object.create
3.Object.preventExtensions
4.Object.isExtensible
分析:資料表明,2,3,4都是新增的特性;
這個題目充分的說明了,我們要關注新的東西喔~~~
參考資料:http://blog.csdn.net/kabukon/article/details/6913381
三、下面代碼會返回什么
(function(){ return typeof arguments; })();
分析:
arguments是實參集合,有數組長度,沒有數組方法,typeof會返回對象。
於是乎,上面的代碼會返回“object”。
四、看下面代碼
1 var f = function g(){return 23;}; 2 typeof g();
分析:
這里面的表達式是有名函數表達式,不規范,g()只能在函數內部訪問。
typeof就會Error。
五、下面代碼return會返回什么
1 (function(x){ 2 delete x; 3 return x; 4 })(1);
分析:
delete不能刪除變量和參數,只能刪除對象下面的屬性,因此return還是會返回1。
六、下面代碼中的 x
1 var y=1,x=y=typeof x; 2 x;
分析:
后面表達式是從右向左執行的,typeof返回的都是字符串類型,最先運算的是typeof x,因為他先是'undefined'所以賦給了y,y再賦給x,於是乎最后就是'undefined'了。
七、下面函數會返回什么
1 (function f(f){ 2 return typeof f(); 3 })(function(){return 1;});
分析:
相當於typeof 1 然后會返回 'number'
八、下面代碼會返回什么:
1 var foo = { 2 bar:function(){return this.baz;}, 3 baz:1 4 } ; 5 (function(){ 6 return typeof arguments[0](); 7 })(foo.bar);
分析:
先看個例子:
1 function test(){ 2 alert(this); 3 }
其實這樣寫的話這里面的this根本就是不確定的,也就不會彈窗,this指向哪要看在哪調用。
像這樣寫:
1 var arr = [1,2,3]; 2 arr.test = test; 3 arr.test();
就會彈窗數組了喔。
所以,本題中,foo中的this指向是不明確的,要看調用的地方,向foo.bar這樣調用的話this是會指向foo的,但是foo.bar是整體作為參數傳進去的,arguments[0]就相當於foo.bar,整體都作為函數名了,於是 arguments[0]()這種調用方式就相當於
function test(){
alert(this);
}
上面說的這種調用方式了,也就是說this指向window了,window中沒有baz,於是就會
會返回'undefined'了。
九、下面的typeof f 會得到什么:
1 var f = (function f(){return "1";},function f(){return 2})(); 2 typeof f;
分析:
這里面首先有了分組選擇符,我們先看看什么事分組選擇符吧:
正常來說 var a = 1; 那么a就是1,但是如果這樣寫 var a = (1,2,3); 那么a就是3了,分組選擇符執行最后一位。
於是就執行分組選擇符后面那個return 2的函數了,於是typeof f就是 'number'。
十、看下面代碼中的x
1 var x =1; 2 if(function f(){}){ 3 x += typeof f; 4 } 5 x;
分析:
function f(){}這樣的函數必須是全局的或者是局部的,是不能寫在運算里面的,於是下面f找不到 typeof f返回'undefined',f雖然找不到,但是在if里面還是會返回真。於是變成了運算1+'undefined',然后就會返回'1undefined'了。
十一、
1 var x= [typeof x,typeof y][1]; 2 typeof typeof x;
分析:
很迷惑,其實根本不用管第一個表達式。typeof返回的必然是個字符串,於是typeof一個字符串了,於是就返回'string'。
十二、看下面的代碼
1 (function(foo){ 2 return typeof foo.bar; 3 })({foo:{bar:1}});
分析:
其實這里面的foo並不是指后面傳進的參數中的foo,而是指整個參數{foo:{bar:1}}這個對象,但是這個對象中根本不存在bar屬性,所以就會返回'undefined'了。
十三、下面代碼會return什么
(function f(){ function f(){return 1;} return f(); function f(){return 2;} })();
分析:
函數聲明預解析,后面函數已經把前面的覆蓋掉了於是在執行f()的時候就是后面那個函數了,於是就返回2了。
十四、看下面代碼
1 function f(){return f;} 2 new f() instanceof f;
分析:
只看后面的表達式的話new f()就是構造函數生成的對象然后他去instanceof構造函數,然后就返回true了。但是有return f 於是f覆蓋掉new f()這個生成的對象了,於是就變成了f instanceof f了,然后就會返回false了。
十五、
1 with (function(x,undefined){}) length;
分析:
函數的長度(length)就是函數的形參,而arguments是函數的實參集合。
比如說這樣的
function test(num1,num2,num3){}
alert(test.length);
就會彈出3
同理,本題就會得到2.