JS中的程式設計題

水果哥發表於2019-04-02

1.實現一個函式printNum,接受一個引數n,輸出n個遞增自然數 ·

輸出的自然數不能含有7(17,71,176)或為7的倍數(14,63);如果含有7或為7的倍數,則輸出下一個自然數;

· 支援多次呼叫,從0開始,每次自上次呼叫的末尾自然數繼續列印

· 例子:

printNum(); // 0
printNum(2); // 1,2
printNum(5); // 3,4,5,6,8
printNum(17); // 9,10,11,...,26,29,30
複製程式碼

思路:

1.對引數為undefined特殊處理
2.輸入的引數為輸出數字的長度
3.對數字進行判斷不能含有7或7的倍數
4.需要對每次最後輸出的值進行記憶
5.將陣列轉為字串輸出
複製程式碼

考察知識點:

1.陣列方法的使用
2.正則基本功
複製程式碼

程式碼:

let lastNum = 0
function printNum (num) {
    if (!num) {
        return 0
    }
    
    let arr = []
    for (let i = 0; i < num; i++ ) {
        lastNum ++
        if (lastNum % 7 === 0 || /[7]/.test(lastNum) ) {
            num ++
            // 規避了 27 28這種情況
        }
        if (lastNum % 7 !== 0 && /[7]/.test(lastNum) ) {
            arr.push(lastNum)
        }
        
    }
    return arr.toString()
}

複製程式碼
最終輸出結果與題目一致,但此解法並不完美,1.判斷了兩次7的倍數和含有7的情況 2.動態改變了for迴圈的num值
複製程式碼

優化

let i = -1
function printNum (n) {
    let res = []
    res.push(++i)
    
    while(n > 1) {
        i++
        if (i % 7 != 0 && !(/[7]/.test(i))) {
            res.push(i)
            n--
        }
    }
    return res.join(',')
}
複製程式碼

用閉包實現

function printNum (n) {
    let i = -1
    return function temp (n) {
        let res = []
        ++i
        if (i % 7 === 0 || /[7]/.test(i)) {
            printNum(n)
        }
        res.push(i)
        if (n < 0) {
            return res.push(i)
        }
        while (n > 1) {
            i++
            if (i % 7 !== 0 && !(/[7]/.test(i)) {
                res.push(i)
                n--
            }
        }
        return res.join(',')
    }
}

複製程式碼

2.實現一個函式,接受一個url陣列作為引數,返回一個Promise。

  • 要求同時傳送請求獲取資源內容(傳送請求使用Fetch,fetch函式說明:fetch()必須接受一個引數-----資源的路徑。無論請求成功與否,它都返回一個promise物件,resolve對應請求的Response)
  • 當任意一個資源載入成功(通過請求的status狀態即可)則將promise的狀態置為resolve,並將該url作為resolve的引數
  • 當所有的資源都不成功時,promise狀態置為reject
題目解析(感覺這道題目不是重點)
1.引數為url陣列
2.同時傳送請求(讓我想到了預載入圖片、上傳多個檔案)
複製程式碼
  1. 寫出如下輸出值
this.a = 20
var test = {
    a: 40,
    init: () => {
        console.log(this.a)
        function go () {
            console.log(this.a)
        }
        go.prototype.a = 50
        return go
    }
}
var p = test.init() // 20 先執行 . 再執行 ()
p() // 20
複製程式碼

箭頭裡的this指向頂級物件test的作用域,指向window

this.a = 20
var test = {
    a: 40,
    init: function () {
        console.log(this.a)
        function go () {
            console.log(this.a)
        }
        go.prototype.a = 50
        return go
    }
}
test.init() // 40
複製程式碼
var handler = {
  id: '123456',

  init: function() {
    document.addEventListener('click',
      event => console.log(this), false);
  }
}
handler.init() // 呼叫列印的this是hander物件

var handler = {
  id: '123456',

  init: ()=> {
    console.log(this)
  }
}
handler.init() // 呼叫列印的this是window
複製程式碼

相關文章