1.寫出一個方法,可以數組去重
方法一:構建一個新的數組存放結果;for循環中每次從原數組中取出一個元素,用這個元素循環與結果數組對比;若結果數組中沒有該元素,則存到結果數組中.
<script> function unique(arr){ var result=[];//用來存放查找的元素 for(var i=0;i<arr.length;i++){//外層循環遍歷arr[i] for(var j=0;j<result.length;j++){//內層循環遍歷新的數組 if(arr[i]==result[j]){//如果相等 表示arr[i]在新的數組中已經存在不繼續執行 break; } } if (j==result.length) {//如果j==新數組的長度,表示遍歷新數組后沒有找到一樣的 result[result.length]=arr[i]; } } return result; } function testunique(){ arr[i] = [1,2,3,4,3,5,6,4,3,2,3]; var result=unique(); console.log(result); } </script>
方法二:
先將數組進行排序,排序之后重復數組會在相鄰的位置,然后檢查數組第一個和最后一個元素是否相同,如果不相同,就把元素放進新的數組中去。
這種方案改變了元素本來的順序,是排序過后的數組。
function unique(){ var arr= [1,2,3,4,3,5,6,4,3,2,3]; var result = [];//存放結果數組 arr = arr.sort(); // console.log(arr); for(var i=0;i<arr.length;i++){ if(arr[i]!= result[result.length-1]){ result.push(arr[i]); } } console.log(result); }
第三種方法(推薦方法)
function unique(arr){ var hash=[]; for (var i = 0; i < arr.length; i++) { for (var j = i+1; j < arr.length; j++) { if(arr[i]===arr[j]){ ++i; } } hash.push(arr[i]); } return hash; }
2.split()和join()的區別
join() 方法用於把數組中的所有元素放入一個字符串。
元素是通過指定的分隔符進行分隔的。
指定分隔符方法join("#");其中#可以是任意;
split,是把一串字符(根據某個分隔符)分成若干個元素存放在一個數組里。而Join是 把數組中的字符串連成一個長串,可以大體上認為是split的逆操作。
個人理解:jion("")表示把數組中所有的元素拼接成字符串存放在一個字符串中,split("")是把數組分割成若干個字符串然后存放在數組中。
3.javascript的typeof返回哪些數據類型:
boolean,string,number,function,object,undefined,
4.
1 var User = { 2 count: 1, 3 getCount: function() { 4 return this.count; 5 } 6 }; 7 console.log(User.getCount()); // what? 8 var func = User.getCount; 9 console.log(func()); // what?
兩處輸出的結果是什么?
答:輸出 1 和 undefined 解析:func是在window的上下文中被執行的,所以不會訪問到count屬性。
5.函數聲明與函數表達式的區別?
在JavaScript中,解析器在執行環境中加載數據時候,解析器會率先讀取函數聲明,並且使其在執行代碼之前可以訪問,
function fnName(){xxxx}; // 函數聲明:使用function關鍵字聲明一個函數,在指定一個函數名。
函數表達式就必須等到解析器執行到所在代碼行的時候才會被解析執行。
var fnName = function(){xxxx}; //函數表達式:使用function關鍵字聲明一個函數,但是未給函數命名,最后將匿名函數賦予給一個變量。
6.判斷字符串以字母開頭,后面可以是數字,下划線,字母,長度為6-30。
var reg=/^[a-zA-Z]\w{5,29}$/;
用正則表達式:var reg = /^[a-z]\w{5,29}$/ig;
解析:i表示不區分大小寫 g表示全局查找
[a-z]的所有字母 \w 匹配一個單字字符
^匹配字符串的開始 $匹配字符串的結束
7.
<script> var a = 100; function test(){ alert(a); a = 10; //去掉了var 就變成定義了全局變量了 alert(a); } test(); alert(a); </script>
彈框輸出的值是多少?
答:100,10,100 錯誤:在調用函數以后a = 10 在函數中a並不是在函數作用中重新聲明的變量 a 而是全局變量 a ,所以最后的a的值變化了。
8.javaScript的2種變量范圍有什么不同?
全局變量:在當前頁面中有效。
局部變量:在作用范圍內有效。
9.null和undefined的區別?
null表示“無”的對象,轉換為數值的時候為0,;undefined表示為“無”的原始值,轉為數值為NaN。
當聲明變量沒有初始化的時候默認值為undefined。null表示為尚未存在的對象。
undefined表示缺省值,意味此處應該有一個值,但為定義。
常見情況為:
1)聲明變量后但為賦值,變量值為undefined。
2)調用函數的時候沒有提供參數,此時該參數值為 undefined。
3)對象沒有賦值的屬性,屬性值為undefined。
4)函數沒有返回值時,默認返回undefined。
null表示沒有對象,意味此處不應該有值
常見情況為:
1)作為函數的參數,表示該函數的參數不是對象。
2)作為對象圓形鏈的終點。
10.程序輸出的是什么?
<script> var myObject ={ foo:"bar", func:function(){ var self =this; console.log(this.foo); console.log(self.foo); (function(){ console.log(this.foo); console.log(self.foo); }()); } }; myObject.func(); </script>
輸出結果為bar bar undefined bar
11.運行以下程序,輸出的結果為
var m=1;j=k=0; function add(n){ return n=n+1; } y=add(m); function add(n){ return n= n+3; } z = add(m); console.log(y); console.log(z);
解析:在以上程序中,function add(n)被兩次重新定義,所以上面的add(n)是不運行的,調用的是下面的這個函數
4 4
上面的函數add(n)不調用的
12.下列代碼輸出的結果是什么:
console.log(1+ +"2"+"2"); console.log("A"-"B"+"2"); console.log("A"-"B"+2);
解析: 第一個表達式中 : +是強制類型轉換 把"2"轉換成了 數字的2 ,最后輸出的值為 32
第二個和第三個表達式是:在進行非加法運算的時候,會自動的將能轉換成數字的都轉換成數字類型再進行運算
32 NaN2 NaN
13.下列代碼輸出的值為
function add(m){ return function b(n){ return n+m++ } } var add1 = add(070); var add2 = add(050); console.log(add1(010)); console.log(add2(010));
64 48
解析:070 和 050 是八進制數的 56 和 40
m++是先執行別的操作再進行自加運算
14.下列敘述不正確的是(C)
A)document:最頂層的節點,所有的其他節點都是附屬於它的
B)documentTypeDTD:引用(使用<!DOCTYPE>語法)的對象表現形式
C)Attr:代表一對特性名和特性值。這個節點類型能包含子節點
D)documentFragment:可以像document一樣來保存其他節點
15.javascirpt中的數字在計算機內存儲為多少Byte? C
A. 2 Byte
B. 4Byte
C. 8Byte
D. 16Byte
16.假設val已經聲明,可定義為任何值。則下面js代碼有可能輸出的結果為: C 解析:?前面的是一個非空的字符串 所以輸出define
console.log('Value is ' + (val != '0') ? 'define' : 'undefine'); //只有undefined,null,false,0,空串會轉換成false,其他的全部為true
A. Value is define
B. Value is undefine
C. define
D. undefine
E. Value is define 或者 Value is undefine
F. define 或者 undefine
17.call 和 apply的用法和區別
兩者都是用來改變指向的,功能相同,用法不同
而call的用法是 函數名.call.(指向的對象,“傳遞的值”)
apply傳遞進去的值必須是數組形式,用法是 函數名.apply.(指向的對象,[傳遞的值])
18.寫出javascript語言typeof可能返回的結果?
string number object function undefined boolean;
19.如今有一個Ul,里面有十億個Li,要求點擊li觸發事件,彈出對應的li的內容
里面有十億個li,所以用循環是不太現實的,現在要用事件委托。
var ul = document.getElementsByTagName('ul')[0]; ul.onclick=function(e) { var event = e || window.event; vartar = event.target || event.srcElement; if(tar.tagName.toLowerCase()==="li") alert(tar.innerText); }
20.如何阻止事件冒泡和事件默認事件
冒泡事件:即事件從最底層逐個經過上面一級級事件的過程,就是冒泡事件。在非IE瀏覽器中提供了一個事件對象stopPropagation,那么在IE瀏覽器中可以通過cancelBubble事件對象阻止。
默認事件:瀏覽器的默認事件就是瀏覽自己的行為,比如我們在點擊<a href="#">的時候,瀏覽器跳轉到指定頁面,或者是當我們滾動鼠標時頁面會向下滾動,但我們按空格鍵和按方向鍵時也會向下滾動,為了更好的用戶體驗,這時我們就需要阻止這種行為的發生。
阻止事件冒泡:
function stopBubble(e) { if(e && e.stopPropagation) { e.stopPropagation(); }else { window.event.cancelBubble = true; } }
阻止瀏覽器的默認事件:
function stopDefault(e) { if(e && e.preventDefault) { e.preventDefault(); }else { window.event.returnValue = false; } return false; }
21.
運行test(),new test()的結果是什么
var a = 5; function test() { a = 0; alert(a); //0 alert(this.a);//5 this指向window 函數本身沒this,就會去上層找this,就找到了window var a; //在預編譯中 就已經聲明過了 alert(a); }
//new test(); 運行結果,new在函數中生成一個this對象,然后沒有new的時候this指向外面,有new的時候this指向function的this對象。
//結果是0,undefined,0
22.有字符串“aaabbbcccdddeeefgggaa”,轉換成連續不重復的字符串,eg:abcdefga。
var reg = /(.)\1*/g; var str = 'aaabbbcccdddeeefgggaa'; str.replace(reg,str);
23.你了解js時間線嘛,能簡單描述一下
1.創建document。document.readyState = ‘loading’;
2.解析script(無defer async)阻塞執行
3.async異步加載,加載完執行
4.defer異步加載
5.遇到img等標簽,解析dom結構,然后加載src內容
6.dom解析完畢,document.readyState = ‘interactive’;
7.按順序執行defer腳本
8.dom觸發DOMContentLoaded事件,由同步腳本階段,轉變為異步事件監聽階段
9.async下載並執行完,img的src等都下載完,觸發document.readyState = ‘complete’;window觸發load事件。