Tìm số chẵn hoặc lẻ

Aug 21 2020

Tôi đang tìm kiếm những lời phê bình để xem tôi có thể làm gì tốt hơn hoặc theo những cách khác mà tôi có thể tiếp cận để viết một kịch bản để tìm số chẵn hoặc lẻ. Tôi là người mới lập trình với JavaScript và lập trình nói chung. Đây là một trong những thử thách đầu tiên tôi viết để tìm số chẵn hoặc lẻ.

    var numList = [];
    while(numList.length < 5){
    numList.push(window.prompt());
    }

    var evenNumbers = [];
    
    numList.forEach(function(element){
        if (element % 2 === 0){ 
            evenNumbers.push(element);
        }
    })
    document.write(evenNumbers);

Trả lời

9 LucasWauke Aug 21 2020 at 07:55

Bạn có thể sử dụng Array.prototype.filter .

Bạn có thể đọc như thế này: trả về một mảng chỉ có các phần tử thỏa mãn biểu thức hàm trả về.

Bằng cách này, bạn có thể tránh khởi tạo một mảng và chỉ sau lần lặp này để thực hiện push.

var numList = [];
while(numList.length < 5){
  numList.push(window.prompt());
}

var evenNumbers = numList.filter(function (element) {
  return element % 2 === 0
});
// that's the same that 
// var evenNumbers = numList.filter(element => element % 2 === 0);

document.write(evenNumbers);

Mặc dù, bạn có thể sử dụng các hàm mũi tên , có cú pháp rõ ràng hơn.

6 SᴀᴍOnᴇᴌᴀ Aug 21 2020 at 12:55

Các cách khác nhau để tìm số chẵn hoặc lẻ.

Mặc dù toán tử mô-đun hoạt động tốt để kiểm tra nếu một số là số chẵn hoặc lẻ, một kỹ thuật nhanh hơn (mà tôi không mong đợi một người mới bắt đầu biết về nó) là sử dụng bitwise AND - tức là& . Tham khảo bài viết này để được giải thích cặn kẽ về cách hoạt động của nó .

function isEven(number) {
     return !(number & 1);
}
for (let x = 0; x < 6; x++) {
    console.log(x, ' is even: ', isEven(x));
}

Các khía cạnh đánh giá khác

Lọc mảng

Như Lucas đã đề cập Array.prototype.filter()có thể được sử dụng để đơn giản hóa việc thêm các phần tử vào evenNumbers. Array.prototype.reduce()có thể được sử dụng mặc dù nó sẽ không ngắn gọn vì mỗi lần lặp sẽ cần trả về mảng tích lũy và giá trị ban đầu sẽ cần được đặt thành một mảng.

Trong khi bạn không hỏi cụ thể về hiệu suất , nếu bạn muốn mã để được như hiệu quả càng tốt (ví dụ như nó sẽ được chạy hàng triệu (hoặc hơn) lần trong một khoảng thời gian ngắn, sau đó tránh lặp - ví dụ như kỹ thuật chức năng với array.filter(), array.map(), cũng như for...ofvòng lặp - sử dụng một forvòng lặp.

Khai báo biến

constcó thể được sử dụng thay vì varđể tránh tình cờ gán lại cho cả hai mảng và nếu các biến nằm trong một khối, phạm vi sẽ bị giới hạn trong khối. Lưu ý rằng "Có thể đẩy các mục vào mảng" 1 ngay cả khi nó được khai báo bằng const.

Thúc đẩy người dùng nhập liệu

window.prompt()“Hiển thị một hộp thoại với thông báo tùy chọn nhắc người dùng nhập một số văn bản.” 2 . Một thông báo thân thiện có thể được chuyển làm đối số đầu tiên để cung cấp cho người dùng thông tin về đầu vào dự kiến- ví dụ:

window.prompt(“Please enter a number”);

Ngoài ra:

Xin lưu ý rằng kết quả là một chuỗi. Điều đó có nghĩa là đôi khi bạn nên truyền giá trị do người dùng cung cấp. Ví dụ: nếu câu trả lời của họ phải là Số, bạn nên chuyển giá trị thành Số.

  const aNumber = Number(window.prompt("Type a number", ""));

3

Vì vậy, hàm Numbertạo có thể được sử dụng để lưu trữ các số trong mảng.

numList.push(Number(window.prompt("Please enter a number")));

Gửi đầu ra với document.write()

Lưu ý : Vì document.write()ghi vào luồng tài liệu , việc gọi document.write()trên một tài liệu đã đóng (đã tải) sẽ tự động gọi document.open (), thao tác này sẽ xóa tài liệu .

4

Vì vậy, đừng có kế hoạch sử dụng chức năng đó trên các tập lệnh chạy trên các trang web có các phần tử DOM tồn tại trên trang, kẻo chúng bị xóa.

5 RenéSchaar Aug 21 2020 at 14:03

Sử dụng let ES6 thay vì var

var numList = [];
let numList = [];

Vân vân.

Sử dụng phương pháp lọc

numList.forEach(function(element){
    if (element % 2 === 0){ 
        evenNumbers.push(element);
    }
}) 

Theo gợi ý của Lucas Wauke

let evenNumbers = numList.filter(element => element % 2 === 0);

Cho người dùng biết những gì cần nhập trong lời nhắc

numList.push(window.prompt());
numList.push(window.prompt("Please enter a whole number"));

Bạn chắc chắn nên làm việc trên kiểu mã của mình để làm cho nó dễ đọc hơn

Sử dụng thụt lề

while(numList.length < 5){
numList.push(window.prompt());
}
while(numList.length < 5){
    numList.push(window.prompt());
}

Để lại khoảng trắng trước dấu ngoặc

numList.forEach(function(element){
    if (element % 2 === 0){ 
        evenNumbers.push(element);
    }
})
 numList.forEach(function(element) {
     if (element % 2 === 0) { 
         evenNumbers.push(element);
     }
 })

Theo tôi, cách đọc của nó tốt hơn nếu bạn để khoảng trắng trong ngoặc đơn.

Tôi cá nhân không biết nhiều người làm điều này nhưng hãy thử nó có thể nó phù hợp với bạn

numList.forEach(function(element){
    if (element % 2 === 0){ 
        evenNumbers.push(element);
    }
})
 numList.forEach( function( element ) {
     if ( element % 2 === 0 ) { 
         evenNumbers.push( element );
     }
 } )

Điều này đặc biệt hữu ích khi làm việc với nhiều dấu ngoặc đơn (mã giả):

method(function(method(getter())).setSomething(getSomethingFromSomewhere(somewhere)))
method( function( method( getter() ) ).setSomething( getSomethingFromSomewhere( somewhere ) ) )

Như bạn có thể thấy, khá dễ dàng để xem dấu ngoặc đơn nào thuộc về nhau

Phần kết luận

Trước

var numList = [];
while(numList.length < 5){
numList.push(window.prompt());
}

var evenNumbers = [];

numList.forEach(function(element){
    if (element % 2 === 0){ 
        evenNumbers.push(element);
    }
})
document.write(evenNumbers); 

Sau

let numList = [];

while ( numList.length < 5 ) {
    numList.push( window.prompt() );
}

let evenNumbers = numList.filter(element => element % 2 === 0);

document.write( evenNumbers );