有關JS的一些經典題目

1、數組模塊:

一、找出元素 item 在給定數組 arr 中的位置
若是數組中存在 item,則返回元素在數組中的位置,不然返回 -1複製代碼

示例1es6

輸入 [ 1, 2, 3, 4 ], 3正則表達式

輸出 2算法

function indexOf(arr, item) { return arr.indexOf(item);}複製代碼
二、數組求和

計算給定數組 arr 中全部元素的總和:數組中的元素均爲 Number 類型編程

input [ 1, 2, 3, 4 ] 數組

output 10瀏覽器

不考慮算法複雜度,用遞歸作:function sum(arr) {    var len = arr.length;    if(len == 0){        return 0;    } else if (len == 1){        return arr[0];    } else {        return arr[0] + sum(arr.slice(1));    }}常規循環:function sum(arr) {    var s = 0;    for (var i=arr.length-1; i>=0; i--) {        s += arr[i];    }    return s;}函數式編程 map-reduce:function sum(arr) {    return arr.reduce(function(prev, curr, idx, arr){        return prev + curr;    });}forEach遍歷:function sum(arr) {    var s = 0;    arr.forEach(function(e) {        s += e;    })    return s;};evalfunction sum(arr) {    return eval(arr.join("+"));};​​複製代碼
三、移除數組中的元素

移除數組 arr 中的全部值與 item 相等的元素。不要直接修改數組 arr,結果返回新的數組bash

輸入 [1, 2, 3, 4, 2], 2 網絡

輸出 [1, 3, 4]閉包

function remove(arr, item) {     //聲明一個新數組保存結果     var a = [];     //循環遍歷     for(var i=0; i < arr.length; i++){         //若是arr[i]不等於item,就加入數組a         if(arr[i] != item){             a.push(arr[i]);         }     }     return a; }複製代碼

移除數組 arr 中的全部值與 item 相等的元素,直接在給定的 arr 數組上進行操做,並將結果返回app

輸入 [1, 2, 2, 3, 4, 2, 2], 2

輸出 [1, 3, 4]

function removeWithoutCopy(arr, item) {    for(var i = 0;i<arr.length;i++){        if(arr[i] == item){            arr.splice(i,1);//從數組的第i個位置開始,刪除後一個元素            i--;//由於他是直接刪除的,那個下標會改變的,因此要自減        }    }    return arr}  removeWithoutCopy([1, 2, 2,  4, 2, 2], 2);​​​​​1.splice()​function remove(arr,item){    for(var i=0;i<newarr.length;i++){        if(newarr[i] == item){            newarr.splice(i,1);        }    }    return newarr;}   ​2.push()function remove(arr,item){    var newarr = [];    for(var i=0;i<arr.length;i++){        if(arr[i] != item){            newarr.push(arr[i]);        }    }    return newarr;}​function remove(arr,item){    var newarr = [];    for(var i=0;i<arr.length;i++){        if(arr[i] == item)continue;       newarr.push(arr[i]);    }    return nawarr;}​3.Arra y.prototype.filter()function remove(arr,item){    return arr.filter(function(ele){         return ele != item;    })}​複製代碼
四、 添加元素

在數組 arr 末尾添加元素 item。不要直接修改數組 arr,結果返回新的數組

輸入 [1, 2, 3, 4], 10

輸出 [1, 2, 3, 4, 10]

function append(arr, item) {    var a=[];    for(var i=0;i<arr.length;i++){        a.push(arr[i]);    }    a.push(item);    return a;}append([1, 2, 3, 4],  10);複製代碼

在數組 arr 的 index 處添加元素 item。不要直接修改數組 arr,結果返回新的數組

輸入 [1, 2, 3, 4], 'z', 2

輸出 [1, 2, 'z', 3, 4]

//利用slice+concatfunction insert(arr, item, index) {    return arr.slice(0,index).concat(item,arr.slice(index));}//利用concat +splicefunction insert(arr, item, index) {    var newArr=arr.concat();    newArr.splice(index,0,item);    return newArr;}//利用slice+splicefunction insert(arr, item, index) {    var newArr=arr.slice(0);    newArr.splice(index,0,item);    return newArr;}//利用push.apply+splicefunction insert(arr, item, index) {    var newArr=[];    [].push.apply(newArr, arr);    newArr.splice(index,0,item);    return newArr;}//普通的迭代拷貝function insert(arr, item, index) {    var newArr=[];    for(var i=0;i<arr.length;i++){        newArr.push(arr[i]);    }    newArr.splice(index,0,item);    return newArr;}​複製代碼

五、刪除數組最後一個元素

刪除數組 arr 最後一個元素。不要直接修改數組 arr,結果返回新的數組

輸入 [1, 2, 3, 4]

輸出 [1, 2, 3]

function truncate(arr) {     var newArr=arr.slice(0)//slice() 方法可提取字符串的某個部分,並以新的字符串返回被提取的部分。//語法  stringObject.slice(start,end)    newArr.pop()//pop() 方法用於刪除並返回數組的最後一個元素。    return newArr}複製代碼
6.刪除數組第一個元素

刪除數組 arr 第一個元素。不要直接修改數組 arr,結果返回新的數組

輸入 [1, 2, 3, 4]

輸出 [2, 3, 4]

function curtail(arr) {
    var a = arr.slice(0)
    a.shift()
    return a
}
複製代碼
七、數組合並

合併數組 arr1 和數組 arr2。不要直接修改數組 arr,結果返回新的數組

輸入 [1, 2, 3, 4], ['a', 'b', 'c', 1]

輸出 [1, 2, 3, 4, 'a', 'b', 'c', 1]

//利用concatfunction concat(arr1, arr2) {    return arr1.concat(arr2);}//利用slice+push.applyfunction concat(arr1, arr2) {    var newArr=arr1.slice(0);    [].push.apply(newArr, arr2);    return newArr;}//利用slice+pushfunction concat(arr1, arr2) {    var newArr=arr1.slice(0);    for(var i=0;i<arr2.length;i++){        newArr.push(arr2[i]);    }    return newArr;}//普通的迭代拷貝function concat(arr1, arr2) {    var newArr=[];    for(var i=0;i<arr1.length;i++){        newArr.push(arr1[i]);    }    for(var j=0;j<arr2.length;j++){        newArr.push(arr2[j]);    }    return newArr;}​複製代碼
八、計數

統計數組 arr 中值等於 item 的元素出現的次數

輸入 [1, 2, 4, 4, 3, 4, 3], 4

輸出 3

//filter()-->利用指定的函數肯定是否在返回的數組中包含某一項
        function count(arr, item) {
            var count = arr.filter(function(a) {
                return a === item;   //返回true的項組成的數組
            });
            return count.length;
        }
        //map()-->對數組中的每一項進行給定函數,
        //返回每次函數條用的結果組成的數組;
        function count(arr, item) {
            var count = 0;
            arr.map(function(a) {
                if(a === item) {
                    count++;
                }
            });
            return count;
        }
        //for循環
        function count(arr, item) {
            var count = 0;
            for(var i=0; i<arr.length; i++) {
                if(arr[i] === item) {
                    count++;
                }
            }
            return count;
        }
        //reduce()-->從數組的第一項開始,逐個遍歷到最後;
        function count(arr, item) {
            var count = arr.reduce(function(prev, curr) {
                return curr === item ? prev+1 : prev;
            }, 0);
            return count;
        }
                //forEach()-->對數組中的每一項運行傳入的函數
        function count(arr, item) {
            var count = 0;
            arr.forEach(function(a) {
                a === item ? count++ : 0;
            });
            return count;
        }

複製代碼
九、查找重複元素

找出數組 arr 中重複出現過的元素

輸入 [1, 2, 4, 4, 3, 3, 1, 5, 3]

輸出 [1, 3, 4]

function duplicates(arr) {
    var a=arr.sort(),b=[];
    for(var i in a){
        if(a[i]==a[i-1] && b.indexOf(a[i])==-1)
            b.push(a[i]); 
    }
    return b;
}//先排序,若是後一個與前一個相等且未保存,則保存。
複製代碼
十、 求二次方

爲數組 arr 中的每一個元素求二次方。不要直接修改數組 arr,結果返回新的數組

輸入 [1, 2, 3, 4]

輸出 [1, 4, 9, 16]

// 1
function square(arr) {
    var a = arr.slice(0)
    a = a.map(function(val) {
        return val*val
    })
    return a
}

function square(arr) {
    var newarr = arr.slice(0);
        //複製一個arr數組
    for (var i=0;i<newarr.length;i++){
        newarr[i]= newarr[i]* newarr[i];
    }
    return newarr;
}
// 2
function square(arr) {
    return arr.map(function(item,index,array){
        return item*item;
    })
}

//3
function square(arr) {
   //聲明一個新的數組存放結果
     var a = [];
     arr.forEach(function(e){
         //將arr中的每個元素求平方後,加入到a數組中
         a.push(e*e);
     });
     return a;
 }

複製代碼
十一、查找元素位置

在數組 arr 中,查找值與 item 相等的元素出現的全部位置

輸入 'abcdefabc'

輸出 [0, 6]

//filter
function findAllOccurrences(arr, target) {
    var result=[];
    arr.filter(function(item,index){
        return item===target&&result.push(index);
    });
    return result;
}
//for
function findAllOccurrences(arr, target) {
    var result=[];
    for(var i=0;i<arr.length;i++){
        if(arr[i]===target){
            result.push(i);
        }
    }
    return result;
}
//lastIndexOf+slice/splice
function findAllOccurrences(arr, target) {
    var result=[],index=arr.lastIndexOf(target);
    while(index>-1){
        result.push(index);
        arr.splice(index,1);//arr=arr.slice(0,index);
        index=arr.lastIndexOf(target);
    }
    return result;
}
//indexOf
function findAllOccurrences(arr, target) {
    var result=[],index=arr.indexOf(target);
    while(index>-1){
        result.push(index);
        index=arr.indexOf(target,index+1);
    }
    return result;
}
複製代碼

2、函數部分 :

一、避免全局變量
function globals() {
     var myObject = {  //這裏須要加 var let等關鍵字
      name : 'Jory'
    };

    return myObject;
}
複製代碼
二、正確的定義函數

請修復給定的 js 代碼中,函數定義存在的問題

輸入 true

輸出 a

//源碼

function functions(flag) {
    if (flag) {
      function getValue() { return 'a'; }
    } else {
      function getValue() { return 'b'; }
    }

    return getValue();
}

//  改正後的
function functions(flag) {
    if (flag) {
     var getValue =function() { return 'a'; }
    } else {
     var getValue =function() { return 'b'; }
    }

    return getValue();
}

functions(true);
複製代碼
三、判斷兩個數是否相等

判斷 val1 和 val2 是否徹底等同

function identity(val1, val2) {
    if(val1===val2) {
        return true;
    }else{
            return false
        }
}
// 之後就簡寫裝逼
function identity(val1, val2) {
    if(val1===val2)return true;
    else return false;
}
/* 
通常使用雙等來判斷(==),若是還須要類型相同那麼就用三等(===)。
說一下這兩個的區別:
== equality 等同,=== identity 恆等。
==, 兩邊值類型不一樣的時候,要先進行類型轉換,再比較。 
==,不作類型轉換,類型不一樣的必定不等。 
下面分別說明: 
先說 ===,這個比較簡單。下面的規則用來判斷兩個值是否===相等: 
一、若是類型不一樣,就[不相等] 
二、若是兩個都是數值,而且是同一個值,那麼[相等]。
三、若是兩個都是字符串,每一個位置的字符都同樣,那麼[相等];不然[不相等]。 
四、若是兩個值都是true,或者都是false,那麼[相等]。 
五、若是兩個值都引用同一個對象或函數,那麼[相等];不然[不相等]。 
六、若是兩個值都是null,或者都是undefined,那麼[相等]。 
再說 ==,根據如下規則: 
一、若是兩個值類型相同,進行 === 比較。 
二、若是兩個值類型不一樣,他們可能相等。根據下面規則進行類型轉換再比較: 
a、若是一個是null、一個是undefined,那麼[相等]。 
b、若是一個是字符串,一個是數值,把字符串轉換成數值再進行比較。 
c、若是任一值是 true,把它轉換成 1 再比較;若是任一值是 false,把它轉換成 0 再比較。 
d、任何其餘組合,都[不相等]。
*/
複製代碼
四、計時器

實現一個打點計時器,要求 一、從 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一個數字,每次數字增幅爲 1 二、返回的對象中須要包含一個 cancel 方法,用於中止定時操做 三、第一個數須要當即輸出

function count(start, end) {
  //當即輸出第一個值
  console.log(start++);
     var timer = setInterval(function(){
         if(start <= end){
             console.log(start++);
         }else{
             clearInterval(timer);
         }
     },100);
    //返回一個對象
     return {
         cancel : function(){
             clearInterval(timer);
         }
     };
 }
複製代碼
五、流程控制

實現 fizzBuzz 函數,參數 num 與返回值的關係以下: 一、若是 num 能同時被 3 和 5 整除,返回字符串 fizzbuzz 二、若是 num 能被 3 整除,返回字符串 fizz 三、若是 num 能被 5 整除,返回字符串 buzz 四、若是參數爲空或者不是 Number 類型,返回 false 五、其他狀況,返回參數 num

輸入: 15

輸出: fizzbuzz

function fizzBuzz(num) {    if(num%3 == 0 && num%5 == 0)        return "fizzbuzz";    else if(num%3 == 0)        return "fizz";    else if(num%5 == 0)        return "buzz";    else if(num == null || typeof num != "number")        return false;    else return num;}​//又一方法function fizzBuzz(num) {    var a = num % 3;    var b = num % 5;    if (a == 0 && b == 0) {        return 'fizzbuzz';    } else if (a == 0) {        return 'fizz'    } else if (b == 0) {        return 'buzz'    } else if (num == 'null' || typeof (num) != 'number') {        return false    } else {        return num    }}複製代碼
六、 函數傳參

將數組 arr 中的元素做爲調用函數 fn 的參數

輸入:function (greeting, name, punctuation) {

return greeting + ', ' + name + (punctuation || '!');

}, ['Hello', 'Ellie', '!']

輸出:Hello, Ellie!

//調用函數可使用call或者apply這兩個方法,區別在於call須要將傳遞給函數的參數明確寫出來,是多少參數就須要寫多少參數。而apply則將傳遞給函數的參數放入一個數組中,傳入參數數組便可。
function argsAsArray(fn, arr) {
    return fn.apply(this, arr)
}

// 調用函數的三種方式
obj.func();
func.call(obj,args);//參數列出
func.apply(obj,[m,n......]);//參數數組

複製代碼
七、函數的上下文

將函數 fn 的執行上下文改成 obj 對象

輸入:function () {return this.greeting + ', ' + this.name + '!!!';}, {greeting: 'Hello', name: 'Rebecca'}

輸出:Hello, Rebecca!!!

//在JavaScript中,函數是一種對象,其上下文是能夠變化的,對應的,函數內的this也是能夠變化的,函數能夠做爲一個對象的方法,也能夠同時做爲另外一個對象的方法,能夠經過Function對象中的call或者apply方法來修改函數的上下文,函數中的this指針將被替換爲call或者apply的第一個參數。將函數 fn 的執行上下文改成 obj 對象,只須要將obj做爲call或者apply的第一個參數傳入便可。

function speak(fn, obj) {
  return fn.apply(obj, obj);
 }

複製代碼
八、返回函數

實現函數 functionFunction,調用以後知足以下條件: 一、返回值爲一個函數 f 二、調用返回的函數 f,返回值爲按照調用順序的參數拼接,拼接字符爲英文逗號加一個空格,即 ', ' 三、全部函數的參數數量爲 1,且均爲 String 類型

輸入:functionFunction('Hello')('world')

輸出:Hello, world

//首先執行functionFunction('Hello'),傳入參數str,而後返回函數f,f與('world')組合,執行f('world'),傳入參數s,f返回str+", "+s,即Hello, world。注意中間的逗號後面有一個空格。

function functionFunction(str) {
  var f = function(s){
         return str+", "+s;
     }
     return f;
 }
複製代碼
九、使用閉包

實現函數 makeClosures,調用以後知足以下條件: 一、返回一個函數數組 result,長度與 arr 相同 二、運行 result 中第 i 個函數,即 resulti,結果與 fn(arr[i]) 相同

輸入:[1, 2, 3], function (x) { ​ return x * x; }

輸出:4

function makeClosures(arr, fn) {
     var result = [];
    arr.forEach(function (obj) {
        result.push(function () {
            return fn(obj);
        })
    });
    return result;
}

//es6的
function makeClosures(arr, fn) {   
    var result = new Array();
    for(let i=0;i<arr.length;i++){
        result[i] = function(){
            return fn(arr[i]); //let聲明的變量只在let所在代碼塊內有效,所以每次循環的i都是一個新的變量           
        };
    }
    return result;
}


//es5的

//這種是錯誤的寫法會致使result中每一個函數的參數都是arr[arr.length]
function makeClosures(arr, fn) {
    var result = new Array();
     for(var i=0;i<arr.length;i++){
        result[i] = function(){
            return fn(arr[i]);            
        };
    }
    return result;
}
//參考《JavaScript高級程序設計》的典型方法
function makeClosures(arr, fn) {
    var result = new Array();
    for(var i=0;i<arr.length;i++){
        result[i] = function(num){
            return function(){
                return fn(num);
                 
            }
        }(arr[i]);
    }
    return result;
}
//使用ES5的bind()方法
function makeClosures(arr, fn) {
    var result = new Array();
    for(var i=0;i<arr.length;i++){
        result[i] = fn.bind(null,arr[i]);
    }
    return result;
}
//使用forEach()
function makeClosures(arr, fn) {
    var result = new Array();
    arr.forEach(function(curr){
        result.push(function(){return fn(curr)});
    })
    return result;
}
複製代碼
十、二次封裝函數

已知函數 fn 執行須要 3 個參數。請實現函數 partial,調用以後知足以下條件: 一、返回一個函數 result,該函數接受一個參數 二、執行 result(str3) ,返回的結果與 fn(str1, str2, str3) 一致

輸入:var sayIt = function(greeting, name, punctuation) { return greeting + ', ' + name + (punctuation || '!'); }; partial(sayIt, 'Hello', 'Ellie')('!!!');

輸出:Hello, Ellie!!!

// call和apply必須顯式地調用str3,當即執行// bind不是當即執行,未傳入str3時,並未執行,只是返回一個函數,等待參數傳入// this用於上下文不肯定的狀況 // callfunction partial(fn, str1, str2) {    function result(str3) {        return fn.call(this, str1, str2, str3);    }      return result;} // apply(這裏只是爲了對照)function partial(fn, str1, str2) {    function result(str3) {        return fn.apply(this, [str1, str2, str3]);    }     return result;} // 這個bind會生成一個新函數(對象), 它的str1, str2參數都定死了, str3未傳入, 一旦傳入就會執行function partial(fn, str1, str2) {    return fn.bind(this, str1, str2); // 或 return fn.bind(null, str1, str2);} // bind同上, 多了一步, 把str3傳入的過程寫在另外一個函數裏面,// 而另外一個函數也有str1, str2參數// 此法有種屢次一舉的感受,可是表示出了後續的調用。function partial(fn, str1, str2) {    function result(str3) {        return fn.bind(this, str1, str2)(str3);    }     return result;} // 匿名函數,默認this綁定global,與bind的第一個參數爲this時效果同樣。function partial(fn, str1, str2) {    return function(str3) {        return fn(str1, str2, str3);    }} // ES6。this指向undefined.const partial = (fn, str1, str2) => str3 => fn(str1, str2, str3);​複製代碼

實現函數 partialUsingArguments,調用以後知足以下條件: 一、返回一個函數 result 二、調用 result 以後,返回的結果與調用函數 fn 的結果一致 三、fn 的調用參數爲 partialUsingArguments 的第一個參數以後的所有參數以及 result 的調用參數

輸入:無

輸出:無

// ****相似與11題*****
//arguments不能用slice方法直接截取,須要先轉換爲數組,var args = Array.prototype.slice.call(arguments);合併參數可使用concat方法,而且也須要將arguments先轉換爲數組才能使用concat進行合併。最用使用apply執行傳入的函數便可。
function partialUsingArguments(fn) {
     //先獲取p函數第一個參數以後的所有參數
     var args = Array.prototype.slice.call(arguments,1);
     //聲明result函數
     var result = function(){
         //使用concat合併兩個或多個數組中的元素
         return fn.apply(null, args.concat([].slice.call(arguments)));
     }
     return result;
 }

複製代碼

十一、使用arguments

函數 useArguments 能夠接收 1 個及以上的參數。請實現函數 useArguments,返回全部調用參數相加後的結果。本題的測試參數所有爲 Number 類型,不需考慮參數轉換。

輸入:1, 2, 3, 4

輸出:10

function useArguments() {
  /*
   由於參數數量不定,能夠先獲取參數個數arguments.length
   而後循環求值
  */
  //聲明一個變量保存最終結果
  var sum = 0;
  //循環求值
  for(var i = 0; i < arguments.length; i++){
      sum += arguments[i];
  }
  return sum;
 }
console.log(useArguments(1,2,3,4));//output 10

複製代碼
十二、使用apply 調用函數

實現函數 callIt,調用以後知足以下條件 一、返回的結果爲調用 fn 以後的結果 二、fn 的調用參數爲 callIt 的第一個參數以後的所有參數

輸入:無

輸出:無

​//由於arguments並不是真正的數組,所以要得到callIt的第一個參數以後的全部參數,不能直接使用slice方法截取,須要先將arguments轉換爲真正的數組才行。有兩種常見的方法,一是使用slice方法:var args = Array . prototype . slice . call ( arguments );二是循環遍歷逐一填入新數組。在得到了args以後,就能夠調用apply來執行傳入的函數參數。​function callIt(fn) {    //將arguments轉化爲數組後,截取第一個元素以後的全部元素    var args = Array.prototype.slice.call(arguments,1);    //調用fn    var result = fn.apply(null,args);//由於調用calllt的第一個參數以後的所有參數,因此這裏是null     return result;}複製代碼
1三、柯里化

柯里化有3個常見做用: 1. 參數複用 ;2. 提早返回;3. 延遲計算/運行

已知 fn 爲一個預約義函數,實現函數 curryIt,調用以後知足以下條件: 一、返回一個函數 a,a 的 length 屬性值爲 1(即顯式聲明 a 接收一個參數) 二、調用 a 以後,返回一個函數 b, b 的 length 屬性值爲 1 三、調用 b 以後,返回一個函數 c, c 的 length 屬性值爲 1 四、調用 c 以後,返回的結果與調用 fn 的返回值一致 五、fn 的參數依次爲函數 a, b, c 的調用參數

輸入:var fn = function (a, b, c) {return a + b + c};

curryIt(fn)(1)(2)(3);

輸出:6

function curryIt(fn) {         return a = function(d){        var b1 = arguments[0];        return b = function(f){            var c1 = arguments[0];            return c = function(g){                var a1 = arguments[0];                return fn.call(this,d,f,g);            }        }    }}​//柯里化是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數且返回結果的新函數的技術。簡單理解題目意思,就是指,咱們將預約義的函數的參數逐一傳入到curryIt中,當參數所有傳入以後,就執行預約義函數。因而,咱們首先要得到預約義函數的參數個數fn.length,而後聲明一個空數組去存放這些參數。返回一個匿名函數接收參數並執行,當參數個數小於fn.length,則再次返回該匿名函數,繼續接收參數並執行,直至參數個數等於fn.length。最後,調用apply執行預約義函數。​function curryIt(fn) {     //獲取fn參數的數量     var n = fn.length;     //聲明一個數組args     var args = [];     //返回一個匿名函數     return function(arg){         //將curryIt後面括號中的參數放入數組         args.push(arg);         //若是args中的參數個數小於fn函數的參數個數,         //則執行arguments.callee(其做用是引用當前正在執行的函數,這裏是返回的當前匿名函數)。         //不然,返回fn的調用結果         if(args.length < n){            return arguments.callee;         }else return fn.apply("",args);     } }複製代碼

3、邏輯運算:

一、或運算

返回參數 a 和 b 的邏輯或運算結果

輸入:false, true

輸出:true

function or(a, b) {    if(a||b) return true;    else return false;}複製代碼
二、且運算

返回參數a 和 b 的邏輯且運算結果

輸入:false, true

輸出: false

functino add(a,b){    return a&&b;}複製代碼

4、其它部分:

一、模塊

完成函數 createModule,調用以後知足以下要求: 一、返回一個對象 二、對象的 greeting 屬性值等於 str1, name 屬性值等於 str2 三、對象存在一個 sayIt 方法,該方法返回的字符串爲 greeting屬性值 + ', ' + name屬性值

聲明對象有兩種常見的方式:var obj = {};和var obj = new Object();。前面一種能夠直接在括號中以key:value的方式定義屬性,後一種採用點運算符給對象添加屬性。function createModule(str1, str2) {     var obj = {         greeting : str1,         name     : str2,         sayIt    : function(){             //兩個屬性前面都須要加上this             return this.greeting+", "+this.name;         }     };     return obj; } console.log(createModule("11","22"))//{greeting: "11", name: "22", sayIt: ƒ}​複製代碼
二、二進制轉換

獲取數字 num 二進制形式第 bit 位的值。注意: 一、bit 從 1 開始 二、返回 0 或 1 三、舉例:2 的二進制爲 10,第 1 位爲 0,第 2 位爲 1

輸入:128,8

輸出:1

經過num.toString(2)能直接將num轉換爲2進制數格式的字符串,利用下標就能將對應值取出來。題目返回的數字是從右往左,所以下標爲倒數。

function valueAtBit(num, bit) {
  var s = num.toString(2);
  console.log(s);//1000 0000
  console.log(s.length)//8
     return s[s.length - bit];
 }

 console.log(valueAtBit(128,8))//1
複製代碼

給定二進制字符串,將其換算成對應的十進制數字

輸入:'11000000'

輸出:192

parseInt方法能夠將其它進制轉換爲十進制,只須要給該方法傳入須要轉換的字符串和該字符串的進製表示兩個參數便可。
function base10(str) {
    /**
        其它進制轉十進制
        parseInt(str,2)
        parseInt(str,8)
        parseInt(str,16)
    */
    return parseInt(str,2);
}
console.log(base10('11000000'))//192
複製代碼

將給定數字轉換成二進制字符串。若是字符串長度不足 8 位,則在前面補 0 到滿8位。

輸入:65

輸出:01000001

function convertToBinary(num) {
    var s = num.toString(2);
    while(s.length<8){
        s = '0'+s;
    }
    return s;
}

//首先經過toString方法將num轉爲2進制數形式,而後判斷其長度是否足夠8位。如不足8位,則聲明一個「0000000」字符串用於補0,由於目標的2進制數形式最少爲一位,所以最多隻須要7個0;經過slice方法對「0000000」進行截取,而後將其結果加在目標前面便可。
function convertToBinary(num) {
     //轉換爲2進制格式
     var s = num.toString(2);
     //得到2進制數長度
     if(  s.length<8){
         //聲明一個字符串用於補滿0
         var s1 = "0000000";
         var s2 = s1.slice(0,8-l);
         s = s2+s; 
     }
     return s;
 }

複製代碼
三、乘法

求 a 和 b 相乘的值,a 和 b 多是小數,須要注意結果的精度問題

輸入:3, 0.0001

輸出:0.0003

//  1 
function multiply(a, b) {
    return a*b*10000*10000/10000/10000
}


//  2
//根據兩個書中精度較高的一個來肯定,先將其轉換成字符串,而後根據小數點的位置肯定小數位數,
//字符串長度減去‘.'的位置後還要再減去1獲得正確的小數位數,兩個取其大,而後用toFixed()函數肯定 //結果的小數位數 function multiply(a, b) { //求兩個數中精度大的一個 var stra=a.toString(); var strb=b.toString(); var len=Math.max(stra.length-stra.indexOf('.')-1,strb.length-strb.indexOf('.')-1); // return parseFloat(a*b).toFixed(len); } // 3 //經過將a、b小數位數的相加,可以獲得a*b結果的小數位數最大可能值。而後使用toFixed方法能夠將結果的小數位數指定爲可能的最大值,即保證告終果的精度。但本題實際上,僅返回a*b也能經過。在瀏覽器上作實驗,最大17位的小數位數知足了該題所有的測試用例。 function multiply(a, b) { return a*b; } 複製代碼
四、改變上下文

將函數 fn 的執行上下文改成 obj,返回 fn 執行後的值

輸入:alterContext(function() {return this.greeting + ', ' + this.name + '!'; }, {name: 'Rebecca', greeting: 'Yo' })

輸出:Yo, Rebecca!

//主要有三種答案。
function alterContext(fn, obj) {
  return fn.bind(obj)();//.bind()返回的是一個函數,因此須要當即執行。 }
 
function alterContext(fn, obj) {
  return fn.call(obj);
}
 
function alterContext(fn, obj) {
  return fn.apply(obj);
}
    
//在JavaScript中,函數是一種對象,其上下文是能夠變化的,對應的,函數內的this也是能夠變化的,函數能夠做爲一個對象的方法,也能夠同時做爲另外一個對象的方法,能夠經過Function對象中的call或者apply方法來修改函數的上下文,函數中的this指針將被替換爲call或者apply的第一個參數。將函數 fn 的執行上下文改成 obj 對象,只須要將obj做爲call或者apply的第一個參數傳入便可。
function alterContext(fn, obj) {
  return fn.call(obj,obj);
 }
複製代碼
五、批量改變對象屬性 ( 涉及原型鏈問題 )

給定一個構造函數 constructor,請完成 alterObjects 方法,將 constructor 的全部實例的 greeting 屬性指向給定的 greeting 變量。

輸入:var C = function(name) {this.name = name; return this;}; var obj1 = new C('Rebecca'); alterObjects(C, 'What's up'); obj1.greeting;

輸出:What's up

//這是原型鏈問題。訪問一個對象的方法或者是屬性,首先會在該對象中尋找,若是找到則返回,若是沒找到,則在其原型鏈上面向上尋找,直至基原型,如還未找到,則返回undefined。將 constructor 的全部實例的 greeting 屬性指向給定的 greeting 變量,只須要在constructor的原型上面添加greeting屬性,並指定值。
function alterObjects(constructor, greeting) {
    //添加prototype的做用就是添加一個公共方法,或者公共屬性
  constructor.prototype.greeting = greeting;
 }
複製代碼
六、屬性遍歷

找出對象 obj 不在原型鏈上的屬性(注意這題測試例子的冒號後面也有一個空格~) 一、返回數組,格式爲 key: value 二、結果數組不要求順序

輸入:var C = function() {this.foo = 'bar'; this.baz = 'bim';}; C.prototype.bop = 'bip'; iterate(new C());

輸出:["foo: bar", "baz: bim"]

//可使用for-in來遍歷對象中的屬性,hasOwnproperty方法能返回一個布爾值,指出一個對象是否具備指定名稱的屬性。此方法沒法檢查該對象的原型鏈中是否具備該屬性,該屬性必須爲對象自己的屬性。
function iterate(obj) {
     var arr = [];
     //使用for-in遍歷對象屬性
     for(var key in obj){
         //判斷key是否爲對象自己的屬性
         if(obj.hasOwnProperty(key)){
             //將屬性和值按格式存入數組
             arr.push(key+": "+obj[key]);
         }
     }
     return arr;
 }
複製代碼
七、判斷是否包含數字(涉及正則表達式)

給定字符串 str,檢查其是否包含數字,包含返回 true,不然返回 false

輸入:'abc123'

輸出:true

// 方法一
//判斷字符串中是否含有數字,能夠用正則表達式。/\d/能夠匹配字符串中的數字字符,用test方法能夠檢測。

function containsNumber(str) {
     var b = /\d/;
     return b.test(str);
 }

//方法二
function containsNumber(str) {
    for(var i=0 ; i<str.length ; i++){
        if(str[i] > '0' && str[i] < '9'){
            return true;
        }
    }
    return false;
}

複製代碼
八、檢查重複字符串(正則表達式)

給定字符串 str,檢查其是否包含連續重複的字母(a-zA-Z),包含返回 true,不然返回 false

輸入:'rattler'

輸出:true

在正則表達式中,利用()進行分組,使用斜槓加數字表示引用,\1就是引用第一個分組,\2就是引用第二個分組。將[a-zA-Z]作爲一個分組,而後引用,就能夠判斷是否有連續重複的字母。

function containsRepeatingLetter(str) 
	return /([a-zA-Z])\1/.test(str);

複製代碼
九、判斷是否以元音字母結尾(正則表達式)

給定字符串 str,檢查其是否以元音字母結尾 一、元音字母包括 a,e,i,o,u,以及對應的大寫 二、包含返回 true,不然返回 false

輸入:'gorilla'

輸出:true

//首先肯定元音集合[a,e,i,o,u],而後是以元音結尾,加上$,最後通配大小寫,加上i。所以正則表達式爲:/[a,e,i,o,u]$/i,最後用test方法去檢測字符串str

function endsWithVowel(str) {
  return /[a,e,i,o,u]$/i.test(str);
 }
複製代碼
十、獲取指定字符串(正則表達式)

給定字符串 str,檢查其是否包含 連續3個數字 一、若是包含,返回最新出現的 3 個數字的字符串 二、若是不包含,返回 false

輸入:'9876543'

輸出:987

function captureThreeNumbers(str) {
  //聲明一個數組保存匹配的字符串結果
  var arr = str.match(/\d{3}/);
     //若是arr存在目標結果,則返回第一個元素,即最先出現的目標結果
     if(arr)
         return arr[0];
     else return false;
}

//題目描述有問題,實際考察的是字符串中是否含有連續的三個任意數字,而不是三個連續的數字。依題,若存在連續的三個任意數字,則返回最先出現的三個數字,若不存在,則返回false。所以須要用到match方法,match()返回的是正則表達式匹配的字符串數組,連續的三個任意數字用正則表達式表示爲/\d{3}/。

function captureThreeNumbers(str) {
     //聲明一個數組保存匹配的字符串結果
  var arr = str.match(/\d{3}/);
     //若是arr存在目標結果,則返回第一個元素,即最先出現的目標結果
     if(arr)
         return arr[0];
     else return false;
 }
複製代碼
十一、判斷是否符合指定格式 (正則表達式)

給定字符串 str,檢查其是否符合以下格式 一、XXX-XXX-XXXX 二、其中 X 爲 Number 類型

輸入:'800-555-1212'

輸出:true

//本題須要注意格式,開頭^和結尾$必須加上來限定字符串,3個數可表示爲\d{3},4個數則爲\d{4},{n}表示前面內容出現的次數。正則表達式可寫做/^\d{3}-\d{3}-\d{4}$/,有相同部分\d{3}-,所以也可寫做/^(\d{3}-){2}\d{4}$/
function matchesPattern(str) {
    return/^(\d{3}-){2}\d{4}$/.test(str);
}
複製代碼
十二、判斷是否符合 USD 格式 (正則表達式)
給定字符串 str,檢查其是否符合美圓書寫格式
一、以 $ 開始
二、整數部分,從個位起,滿 3 個數字用 , 分隔
三、若是爲小數,則小數部分長度爲 2
四、正確的格式如:$1,023,032.03 或者 $2.03,錯誤的格式如:$3,432,12.12 或者 $34,344.3

輸入:'$20,933,209.93'
輸出:true
複製代碼
//本題注意點有必須是USD格式,以$開頭,數字結尾,$和小數點的轉義。
首先,開頭必是$,而正則表達式中$表示結尾,須要進行轉義,所以開頭爲^\$
而後$後必然接數字,而且最少一位,最多三位數,可用{m,n}表示,最少m位,最多n位,所以此段爲\d{1,3}
接着,後面如還有數,則必然有,分隔,而且後面必有3個數,相似於,XXX的格式會出現0或者n次,所以此段可表示爲(,\d{3})*
最後,若有小數部分,則注意對小數點進行轉義,此段可表示爲(\.\d{2})?
所以,最後的正則表達式爲/^\$\d{1,3}(,\d{3})*(\.\d{2})?$/
使用test方法去檢測str
function isUSD(str) {
   return /^\$\d{1,3}(,\d{3})*(\.\d{2})?$/.test(str);
}
複製代碼


上述題目太多源於網絡,僅用於學習。

相關文章
相關標籤/搜索