前端刷題 —— 牛客網前端題庫60道詳解(五) 目錄

目錄

  • 引言

    1. 使用 arguments (入門)
    2. 使用 apply 調用函數 (簡單)
    3. 二次封裝函數 (簡單)
    4. 柯里化 (入門)
    5. 或運算 (入門)
    6. 且運算 (入門)
    7. 模塊 (較難)
    8. 二進制轉換 (簡單)
    9. 二進制轉換 (入門)
    10. 二進制轉換 (簡單)

引言

牛客網這個前端筆試題庫,可以說這60道是最基礎的了,也是考察的東西比較雜,有時間4天差不多就可以刷完,鞏固基礎還是有些用的。做完題回顧一上午就可以過完一遍。現在我結合我的答案和參考的其他人的答案,在這裏做一個總結,也是自己知識的整理結果。

41. 使用 arguments

題目描述
函數 useArguments 可以接收 1 個及以上的參數。請實現函數 useArguments,返回所有調用參數相加後的結果。本題的測試參數全部爲 Number 類型,不需考慮參數轉換。
輸入:1, 2, 3, 4
輸出:10

// 方法一:直接遍歷
function useArguments() {
    let count = 0
    for(let i = 0; i < arguments.length; i++) {
        count+= arguments[i]
    }
    return count
}

// 方法二:ES6,把arguments轉化成數組用數組的方式相加
function useArguments() {
    return Array.from(arguments).reduce((prev, item) => prev + item, 0)
}

相關知識點:

  • arguments —— 函數參數的獲取和類數組的運算。

42. 使用 apply 調用函數

題目描述
實現函數 callIt,調用之後滿足如下條件
1、返回的結果爲調用 fn 之後的結果
2、fn 的調用參數爲 callIt 的第一個參數之後的全部參數
輸入:無 輸出:無

// 方法一:把參數從第一個開始截取,然後調用apply
function callIt(fn) {
    let newArr = Array.from(arguments).slice(1)
    return fn.apply(this,newArr)
}

相關知識點:

  • apply/arguments

43. 二次封裝函數

題目描述
實現函數 partialUsingArguments,調用之後滿足如下條件:
1、返回一個函數 result
2、調用 result 之後,返回的結果與調用函數 fn 的結果一致
3、fn 的調用參數爲 partialUsingArguments 的第一個參數之後的全部參數以及 result 的調用參數
輸入: 無 輸出:無

// 方法一:用call直接擴展運算符
function partialUsingArguments(fn) {
    let args = [].slice.call(arguments,1)
    return function result(...newArgs) {
        return fn.call(this,...args,...newArgs)
    }
}

// 方法二:用apply接收數組
function partialUsingArguments(fn) {
    let args = [].slice.call(arguments,1)
    return function result(...newArgs) {
        return fn.apply(this,args.concat(newArgs))
    }
}

// 方法三:bind
function partialUsingArguments(fn) {
    let args = [].slice.call(arguments,1)
    return function result(...newArgs) {
        return fn.bind(this,...args,...newArgs)()
    }
}

相關知識點:

  • arguments/apply/call/bind

44. 柯里化

題目描述
已知 fn 爲一個預定義函數,實現函數 curryIt,調用之後滿足如下條件:
1、返回一個函數 a,a 的 length 屬性值爲 1(即顯式聲明 a 接收一個參數)
2、調用 a 之後,返回一個函數 b, b 的 length 屬性值爲 1
3、調用 b 之後,返回一個函數 c, c 的 length 屬性值爲 1
4、調用 c 之後,返回的結果與調用 fn 的返回值一致
5、fn 的參數依次爲函數 a, b, c 的調用參數
輸入
var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);
輸出 6

function curryIt(fn) {
    let len = fn.length
    let args = []
    return function (arg){
        args.push(arg)
        if(len > args.length) {
            return arguments.callee
        }
        return fn.apply(this, args)
    }
}

相關知識點:

  • 柯里化

函數式編程(三)—— 柯里化

  • 函數形參長度獲取:fn.length

45. 或運算

題目描述
返回參數 a 和 b 的邏輯或運算結果
輸入: false, true ; 輸出: true

// 方法一:直接或運算符
function or(a, b) {
    return a || b
}

// 方法二:位運算中的或運算,返回0或者1,需要轉化類型爲布爾值
function or(a, b) {
    return a | b ? true : false
}

相關知識點:

  • 或運算

|| 運算符,a和b都爲false,纔是false,其中一個有true,就是false
| 運算符,是位運算,位置上都是0才返回0,位置上有一個1就返回1,如果返回需要布爾值,需要轉化

46. 且運算

題目描述
返回參數 a 和 b 的邏輯且運算結果
輸入:
false, true
輸出:
false

// 方法一:且運算符,返回布爾值
function and(a, b) {
    return a && b
}

// 方法二:位運算的且運算符,返回 0 和 1,需要轉化成布爾值
function and(a, b) {
    return a & b ? true : false
}

相關知識點:

  • 且運算

&& 運算符,a和b都爲true,纔是true,其中一個有false,就是false
& 運算符,是位運算,位置上都是1才返回1,位置上有一個0就返回0,如果返回需要布爾值,需要轉化

47. 模塊

題目描述
完成函數 createModule,調用之後滿足如下要求:
1、返回一個對象
2、對象的 greeting 屬性值等於 str1, name 屬性值等於 str2
3、對象存在一個 sayIt 方法,該方法返回的字符串爲 greeting屬性值 + ', ' + name屬性值

// 方法一:對象
function createModule(str1, str2) {
    return  {
        greeting: str1,
        name: str2,
        sayIt: function (){
            return this.greeting + ', ' + this.name
        }
    }
}

// 方法二: 構造函數
function createModule(str1, str2) {
    function Obj() {
        this.greeting = str1
        this.name = str2
    }
    Obj.prototype.sayIt = function () {
        return this.greeting + ', ' + this.name
    }
    return new Obj
}

相關知識點:

  • 模塊化、構造函數、對象

48. 二進制轉換

題目描述
獲取數字 num 二進制形式第 bit 位的值。注意:
1、bit 從 1 開始
2、返回 0 或 1
3、舉例:2 的二進制爲 10,第 1 位爲 0,第 2 位爲 1
輸入: 128,8
輸出: 1

// 方法一:while循環
function valueAtBit(num, bit) {
    let arr = []
    while(num){
        arr.push(num % 2)
        num = Math.floor(num / 2)
    }
    return arr[bit-1]
}

// 方法二:位運算右移 >> 位數 - 1 然後取模 2
function valueAtBit(num, bit) {
    return (num >> bit - 1) % 2
}

相關知識點:

  • 二進制數值運算
  • 取模
  • 位運算符 左移 >> 右移 << 無符號位右移 <<<

49. 二進制轉換

題目描述
給定二進制字符串,將其換算成對應的十進制數字
輸入:'11000000'
輸出:192

// 方法一:parseInt(str,2) 
// 方法二:
function base10(str) {
    let count = 0
    for(let i = 0; i < str.length; i++) {
        count = count * 2 + str[i]*1
    }
    return count
}

相關知識點:

  • 進制轉換

二進制轉十進制,從最高位開始乘2,十進制轉二進制,除2取餘後取逆向

50. 二進制轉換

題目描述
將給定數字轉換成二進制字符串。如果字符串長度不足 8 位,則在前面補 0 到滿8位。
輸入:65
輸出:01000001(字符串)

// 方法一:轉化之後檢查位(算法思維,推薦)
function convertToBinary(num) {
    let arr = []
    while(num) {
        arr.push(num % 2)
        num = num >> 1
    }
    let str = ''
    let len = arr.length > 8 ? arr.length : 8
    for(let i = len - 1; i >= 0; i--){
        str = arr[i] ? str + '1' : str + '0'
    }
    return str
}

// 方法二:使用API轉化成二進制然後看缺的(儘量不要前面加字符串,性能消耗大)
function convertToBinary(num) {
    var str = num.toString(2);
    while(str.length < 8) {
        str = "0" + str;
    }
    return str;
}

相關知識點:

  • 二進制轉換

還有一個就勝利了,真的是由淺到難的深度~~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章