2019年最新前端面試題,js程序設計題

都說機會是留給有準備的人的。css

一年之計在於春,面對衆多的前端技術,須要時刻充電本身。html

我如今整理一些前端js面試程序題。前端

1.判斷一個字符串中出現最多的字符,並計算出現的次數?html5

2.用css僞類實現下面的效果node

<!DOCTYPE html>
<html>
<head>
    <title>button</title>
    <style type="text/css">
            button{background:#000;color:#fff;border:0;width:150px;height:50px;position:relative;}
button:after{
/*content:url();
posittion:absolute;
right:0;
top:10px;*/
content:'';
width:30px;
height:30px;
border-radius:30px;
background:#fff;
display:block;
position:absolute;
right:-15px;
top:10px;
}
    </style>
</head>
<body>
<button>button</button>
</body>
</html>
<script>
var str='asdfssaaasasasasaa';
var json={};
for(var i=0;i<str.length;i++){
if(!json[str.charAt(i)]){
console.log(str.charAt(i));
json[str.charAt(i)]=1;
}else{
json[str.charAt(i)]++;
document.write(json[charAt(i));
}
};
var iMax=0;
var iIndex='';
for(var i in json){
if(json[i]>iMax){
iMax=json[i];
iIndex=i;
}
}
console.log('出現次數最多的是:'+iIndex+'出現'+iMax+'');
</script>

解釋: 1. 針對css僞類元素,可使用content:url();引入一個圖片進行實現,也可使用「content:' ' 」,設置塊狀元素實現,並使用定位web

2.charAt(i)函數是獲取字符串i位置的字符,console.log(str.charAt(i)),可輸出a,s,d,f等字符面試

if(!json[str.charAt(i)])首先獲得位置的字符char再判斷json【char】是否存在,若是不存在就賦值爲1,若是存在就加1,
document.write(json[charAt(i));輸出json[char]當前的值
var iMax=0;
var iIndex='';
for(var i in json){
if(json[i]>iMax){
iMax=json[i];
iIndex=i;
}
比較一組數,並求出最大值,並輸出這個值

 3.編寫一個方法,去掉一個數組的重複元素json

列舉兩種實現方法:數組

1.瀏覽器

<script>
/**第1種**/
    var arr=[0,2,3,4,4,0,2];
    var obj={};
    var tmp=[];
    for(var i=0;i<arr.length;i++){
        if(!obj[arr[i]]){
       obj[arr[i]]=1;
       tmp.push(arr[i]);
          }
   }
console.log(tmp);//[0,2,3,4]

/**第2種**/
 var arr=[2,3,4,4,5,2,3,6];
 arr2=[];
 for(var i=0;i<arr.length;i++){
  if(arr2.indexOf(arr[i])<0){
    arr2.push(arr[i]);
    }
}
console.log(arr2);//[2,3,4,5,6]

</script>

indexOf()可返回某個指定的字符串值在字符串中首次出現的位置

4.使用純js實現一組列表所在的索引值

<body>
    <ul>
        <li>test1</li>
        <li>test2</li>
        <li>test3</li>
        <li>test4</li>
        <li>test5</li>
        <li>test6</li>
        <li>test7</li>
        <li>test8</li>
        <li>test9</li>
        <li>test10</li>
    </ul>
    <script>
        var lis = document.querySelectorAll('ul li');
        /**1. 使用let 獲取索引
        for(let i = 0, len = lis.length; i < len; i++) {
            lis[i].addEventListener('click', function () {
                console.log(i);
            }, false);
        }
        **/
        /**2. 當即執行函數來切斷閉包對外部變量i的引用
        for(var i = 0, len = lis.length; i < len; i++) {
            (function(i){
                lis[i].addEventListener('click', function () {
                console.log(i);
            }, false);
            })(i)
        }
        **/
/**3.**/
var ul = document.querySelector('ul'); var lis = document.querySelectorAll('ul li'); ul.addEventListener('click', function (e) { var target = e.target; if(target.nodeName.toLowerCase() === 'li') { console.log([].indexOf.call(lis, target)); } }, false); </script> </body>

5.判斷輸入的值是否爲數字

<html>
 <input type="text" id="tel"  maxlength="11" onkeypress="checkint()" onkeyup="value=value.replace(/\D/g,'')"/>
<script>
function checkint() {

    var v = window.event.keyCode;
    if (!(v >= 48 && v <= 57)) {
        window.event.keyCode = 0;
        window.event.returnValue = false;
        alert("not a number;")
    }
}
</script>
</htm>

6.獲取字符串中出現次數最少的字符,並輸出,此時須要用到hash

<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title>test</title>
  <script>
    // 獲取字符串中出現次數最少的字符
function getRareChar(str) {
    let hash = {};
    // 將各個字符名字、首次出現位置及出現次數存到hash表
    for(let i = 0, len = str.length; i < len; i++) {
        // 若是hash[str[i]]不存在,則對其進行初始化
        hash[str[i]] = hash[str[i]] || {index: i, count: 0};
        hash[str[i]].count++; // count計數自增
    }
    // 由於哈希表很差排序,將它轉成數組
    return Object.keys(hash).map(function (key) {
       return Object.assign({char: key}, hash[key]);
    // 根據count屬性進行升序排序
    }).sort(function (a, b) {
        return a.count - b.count;
    // 取出count最小的
    }).filter(function (e, i, arr) {
        return e.count === arr[0].count;
    // 在count值最小的集合裏面再根據index屬性進行升序排序
    }).sort(function (a, b) {
        return a.index - b.index;
    })[0].char;
}
// 測試數據
var str = 'ablfdasfdarleoeorwqajhfdsafdlladaasrjhehafdalhewadadfahwesaew';
alert(getRareChar(str));
    </script>
</head>
<body>
 
</body>
</html>

7.js的delete方法如何使用

<script>
var arr = [1, 2, 3];
delete arr[1]
//arr[1] = undefined;
console.log(arr); // [1, undefined × 1, 2]
 console.log(delete arr[1]) // true
console.log(arr[1]); // undefined
/**若是想使用console.log(1 in arr);就不能使用delete,此時須要賦值arr[1] = undefined;
console.log(1 in arr)
**/

</script>

8.你如何獲取瀏覽器URL中查詢字符串中的參數?
測試地址爲:url?channelid=12333&name=xiaoming&age=23

實例以下:

function showWindowHref(){
var sHref = window.location.href;
var args = sHref.split('?');
if(args[0] == sHref){
return "";
}
var arr = args[1].split('&');
var obj = {};
for(var i = 0;i< arr.length;i++){
var arg = arr[i].split('=');
obj[arg[0]] = arg[1];
}
return obj;
}
var href = showWindowHref(); // obj
console.log(href['name']); // xiaoming

 

9.常見兼容性問題?

* png24位的圖片在iE6瀏覽器上出現背景,解決方案是作成PNG8.也能夠引用一段腳本處理.

* 瀏覽器默認的margin和padding不一樣。解決方案是加一個全局的*{margin:0;padding:0;}來統一。

* IE6雙邊距bug:塊屬性標籤float後,又有橫行的margin狀況下,在ie6顯示margin比設置的大。 

* 浮動ie產生的雙倍距離(IE6雙邊距問題:在IE6下,若是對元素設置了浮動,同時又設置了margin-left或margin-right,margin值會加倍。)
  #box{ float:left; width:10px; margin:0 0 0 100px;} 

 這種狀況之下IE會產生20px的距離,解決方案是在float的標籤樣式控制中加入 ——_display:inline;將其轉化爲行內屬性。(_這個符號只有ie6會識別)

*  漸進識別的方式,從整體中逐漸排除局部。 

  首先,巧妙的使用「\9」這一標記,將IE遊覽器從全部狀況中分離出來。 
  接着,再次使用「+」將IE8和IE七、IE6分離開來,這樣IE8已經獨立識別。

  css
      .bb{
       background-color:#f1ee18;/*全部識別*/
      .background-color:#00deff\9; /*IE六、七、8識別*/
      +background-color:#a200ff;/*IE六、7識別*/
      _background-color:#1e0bd1;/*IE6識別*/ 
      } 

*  IE下,可使用獲取常規屬性的方法來獲取自定義屬性,
   也可使用getAttribute()獲取自定義屬性;
   Firefox下,只能使用getAttribute()獲取自定義屬性. 
   解決方法:統一經過getAttribute()獲取自定義屬性.

* IE下,event對象有x,y屬性,可是沒有pageX,pageY屬性; 
  Firefox下,event對象有pageX,pageY屬性,可是沒有x,y屬性.

* 解決方法:(條件註釋)缺點是在IE瀏覽器下可能會增長額外的HTTP請求數。

* Chrome 中文界面下默認會將小於 12px 的文本強制按照 12px 顯示, 
  可經過加入 CSS 屬性 -webkit-text-size-adjust: none; 解決.

* 超連接訪問事後hover樣式就不出現了 被點擊訪問過的超連接樣式不在具備hover和active瞭解決方法是改變CSS屬性的排列順序:
L-V-H-A :  a:link {} a:visited {} a:hover {} a:active {}

* 怪異模式問題:漏寫DTD聲明,Firefox仍然會按照標準模式來解析網頁,但在IE中會觸發怪異模式。爲避免怪異模式給咱們帶來沒必要要的麻煩,最好養成書寫DTD聲明的好習慣。如今可使用[html5](http://www.w3.org/TR/html5/single-page.html)推薦的寫法:`<doctype html>`

* 上下margin重合問題
ie和ff都存在,相鄰的兩個div的margin-left和margin-right不會重合,可是margin-top和margin-bottom卻會發生重合。
解決方法,養成良好的代碼編寫習慣,同時採用margin-top或者同時採用margin-bottom。
* ie6對png圖片格式支持很差(引用一段腳本處理)

到底在調用哪一個函數?

 
 

再看下原題,如今知道了程序中有兩個fun函數(第一個和第三個相同),遂接下來的問題是搞清楚,運行時他執行的是哪一個fun函數?

function fun(n,o) {
 console.log(o)
 return {
  fun:function(m){
   return fun(m,n);
  }
 };
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,?,?,?
//問:三行a,b,c的輸出分別是什麼?

一、第一行a

var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);
能夠得知,第一個fun(0)是在調用第一層fun函數。第二個fun(1)是在調用前一個fun的返回值的fun函數,因此:

第後面幾個fun(1),fun(2),fun(3),函數都是在調用第二層fun函數。

遂:

在第一次調用fun(0)時,o爲undefined;

第二次調用fun(1)時m爲1,此時fun閉包了外層函數的n,也就是第一次調用的n=0,即m=1,n=0,並在內部調用第一層fun函數fun(1,0);因此o爲0;

第三次調用fun(2)時m爲2,但依然是調用a.fun,因此仍是閉包了第一次調用時的n,因此內部調用第一層的fun(2,0);因此o爲0

第四次同理;

即:最終答案爲undefined,0,0,0

二、第二行b

var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
先從fun(0)開始看,確定是調用的第一層fun函數;而他的返回值是一個對象,因此第二個fun(1)調用的是第二層fun函數,後面幾個也是調用的第二層fun函數。

遂:

在第一次調用第一層fun(0)時,o爲undefined;

第二次調用 .fun(1)時m爲1,此時fun閉包了外層函數的n,也就是第一次調用的n=0,即m=1,n=0,並在內部調用第一層fun函數fun(1,0);因此o爲0;

第三次調用 .fun(2)時m爲2,此時當前的fun函數不是第一次執行的返回對象,而是第二次執行的返回對象。而在第二次執行第一層fun函數時時(1,0)因此n=1,o=0,返回時閉包了第二次的n,遂在第三次調用第三層fun函數時m=2,n=1,即調用第一層fun函數fun(2,1),因此o爲1;

第四次調用 .fun(3)時m爲3,閉包了第三次調用的n,同理,最終調用第一層fun函數爲fun(3,2);因此o爲2;

即最終答案:undefined,0,1,2
 
 

 三、第三行c

var c = fun(0).fun(1);  c.fun(2);  c.fun(3);//undefined,?,?,?
根據前面兩個例子,能夠得知:

fun(0)爲執行第一層fun函數,.fun(1)執行的是fun(0)返回的第二層fun函數,這裏語句結束,遂c存放的是fun(1)的返回值,而不是fun(0)的返回值,因此c中閉包的也是fun(1)第二次執行的n的值。c.fun(2)執行的是fun(1)返回的第二層fun函數,c.fun(3)執行的也是fun(1)返回的第二層fun函數。

遂:

在第一次調用第一層fun(0)時,o爲undefined;

第二次調用 .fun(1)時m爲1,此時fun閉包了外層函數的n,也就是第一次調用的n=0,即m=1,n=0,並在內部調用第一層fun函數fun(1,0);因此o爲0;

第三次調用 .fun(2)時m爲2,此時fun閉包的是第二次調用的n=1,即m=2,n=1,並在內部調用第一層fun函數fun(2,1);因此o爲1;

第四次.fun(3)時同理,但依然是調用的第二次的返回值,遂最終調用第一層fun函數fun(3,1),因此o還爲1

即最終答案:undefined,0,1,1

相關文章
相關標籤/搜索