Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Hướng dẫn hoành tráng này cung cấp một bài tập vững chắc cho những người mới bắt đầu sử dụng JavaScript bằng cách mô tả cách có thể phát triển một ứng dụng máy tính đơn giản bằng ngôn ngữ này

Dự án JavaScript dành cho người mới bắt đầu (sê-ri 8 phần)

  • 1 Tạo ứng dụng JavaScript đầu tiên của bạn — Trình tạo trích dẫn ngẫu nhiên
  • 2 Cách tạo Ứng dụng Tìm kiếm Wikipedia bằng JavaScript
  • 3 Cách tạo Ứng dụng Máy tính bằng JavaScript
  • 4 Cách tạo Ứng dụng Todo List bằng JavaScript
  • 5 Cách tạo Trình phát video HTML5 tùy chỉnh bằng JavaScript
  • 6 Cách xây dựng Trò chơi Simon bằng JavaScript
  • 7 Cách tạo Ứng dụng hẹn giờ Pomodoro bằng JavaScript
  • 8 Cách tạo tiện ích mở rộng Chrome đầu tiên của bạn

Ứng dụng máy tính mà chúng ta sẽ phát triển trong hướng dẫn này rất đơn giản. Nó ít nhiều theo cách của những máy tính được tìm thấy tại các cửa hàng tạp hóa. Bố cục của ứng dụng được tạo bằng lưới CSS. Nếu bạn muốn tìm hiểu cách đạt được nó, hãy nhớ xem hướng dẫn này vì hướng dẫn này chỉ tập trung vào logic JavaScript được sử dụng để làm cho máy tính hoạt động

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Đây là bản demo trực tiếp của dự án đã hoàn thành. Bạn có thể chơi xung quanh nó để cảm nhận về những gì bạn sẽ xây dựng trước khi lao vào

điều kiện tiên quyết

Hướng dẫn này giả định rằng bạn đã có kiến ​​thức cơ bản về JavaScript. Tôi sẽ chia nhỏ từng bước một cách tốt nhất có thể để bạn có thể dễ dàng làm theo ngay cả khi bạn chưa có kinh nghiệm xây dựng ứng dụng trong trình duyệt trước đó

Trước khi bắt đầu

Bạn có thể tìm điểm bắt đầu cho hướng dẫn này trên JSFiddle. Nó chứa tất cả các đánh dấu và kiểu cần thiết được sử dụng để tạo bố cục máy tính. Đánh dấu gần giống với trạng thái cuối cùng của hướng dẫn trước, trong đó tôi đã thảo luận về cách tạo bố cục máy tính, nhưng tôi đã thực hiện một số thay đổi nhỏ, vì vậy hãy đảm bảo sử dụng thay đổi này

Bắt đầu bằng cách rẽ nhánh mã sang một câu đố mới và làm theo bằng cách nhập từng bước cho đến khi kết thúc. Vui lòng thực hiện hướng dẫn này trên các sân chơi mã trực tuyến khác hoặc trên máy cục bộ của bạn nếu bạn thích

Bắt đầu

Bất kỳ ai cũng có thể thực hiện bốn phép toán số học phổ biến nhất (cộng, trừ, nhân và chia) trên ứng dụng máy tính của chúng tôi bằng cách xây dựng một biểu thức hợp lệ bằng cách sử dụng các nút nhập và hiển thị kết quả trên màn hình. Một ví dụ về biểu thức hợp lệ được hiển thị bên dưới

12 + 10

Để xây dựng một biểu thức số học hợp lệ, chúng ta cần theo dõi một số điều. toán hạng thứ nhất (

function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();
9), toán tử (
<input type="text" class="calculator-screen" value="" disabled />
0) và toán hạng thứ hai (_______2_______1)

Hãy bắt đầu bằng cách tạo một đối tượng để giúp chúng tôi theo dõi các giá trị này. Thêm mã sau vào đầu ngăn JavaScript trong JSFiddle

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};

Đối tượng

<input type="text" class="calculator-screen" value="" disabled />
2 ở trên bao gồm mọi thứ mà chúng ta cần để xây dựng một biểu thức hợp lệ

  • <input type="text" class="calculator-screen" value="" disabled />
    3 giữ một giá trị chuỗi đại diện cho đầu vào của người dùng hoặc kết quả của một hoạt động. Đó là cách chúng tôi theo dõi những gì sẽ được hiển thị trên màn hình
  • <input type="text" class="calculator-screen" value="" disabled />
    4 sẽ lưu trữ toán hạng đầu tiên cho bất kỳ biểu thức nào. Hiện tại, nó được đặt thành
    <input type="text" class="calculator-screen" value="" disabled />
    5
  • Phím
    <input type="text" class="calculator-screen" value="" disabled />
    6 sẽ lưu trữ toán tử cho một biểu thức. Giá trị ban đầu của nó cũng là
    <input type="text" class="calculator-screen" value="" disabled />
    5
  • <input type="text" class="calculator-screen" value="" disabled />
    8 về cơ bản phục vụ như một cách để kiểm tra xem cả toán hạng đầu tiên và toán tử đã được nhập chưa. Nếu là
    <input type="text" class="calculator-screen" value="" disabled />
    9, các số tiếp theo mà người dùng nhập sẽ tạo thành toán hạng thứ hai

Cập nhật màn hình

Hiện tại, màn hình máy tính trống. Chúng tôi cần nội dung của thuộc tính

<input type="text" class="calculator-screen" value="" disabled />
3 luôn được hiển thị trên màn hình. Chúng tôi sẽ tạo một chức năng cho mục đích này để bất cứ khi nào một thao tác được thực hiện trong ứng dụng, chúng tôi luôn có thể gọi nó để cập nhật màn hình với nội dung của
<input type="text" class="calculator-screen" value="" disabled />
3

Hãy tiếp tục và nhập nội dung này bên dưới đối tượng

<input type="text" class="calculator-screen" value="" disabled />
2

function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();

Nếu bạn nhìn vào mã HTML của ứng dụng, bạn sẽ thấy rằng “màn hình” thực sự chỉ là một kiểu nhập văn bản bị vô hiệu hóa

<input type="text" class="calculator-screen" value="" disabled />

Chúng tôi không thể nhập trực tiếp bằng bàn phím, nhưng chúng tôi có thể thay đổi giá trị của nó bằng JavaScript. Và đó là chức năng của hàm

const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (event) => {
  // Access the clicked element
  const { target } = event;

  // Check if the clicked element is a button.
  // If not, exit from the function
  if (!target.matches('button')) {
    return;
  }

  if (target.classList.contains('operator')) {
    console.log('operator', target.value);
    return;
  }

  if (target.classList.contains('decimal')) {
    console.log('decimal', target.value);
    return;
  }

  if (target.classList.contains('all-clear')) {
    console.log('clear', target.value);
    return;
  }

  console.log('digit', target.value);
});
3. Bây giờ bạn sẽ thấy số không hiển thị trên màn hình của máy tính

Hãy thư giãn và xem mã hoàn chỉnh ở cuối bước này

Xử lý phím bấm

Chúng tôi có bốn bộ chìa khóa trên máy tính. chữ số (0-9), toán tử (+, −, ⨉, ÷, =), dấu thập phân (. ) và phím đặt lại (AC). Trong phần này, chúng tôi sẽ lắng nghe tiếng bấm trên các phím máy tính và xác định loại phím nào đã được bấm

Thêm đoạn mã này vào cuối tab JavaScript

const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (event) => {
  // Access the clicked element
  const { target } = event;

  // Check if the clicked element is a button.
  // If not, exit from the function
  if (!target.matches('button')) {
    return;
  }

  if (target.classList.contains('operator')) {
    console.log('operator', target.value);
    return;
  }

  if (target.classList.contains('decimal')) {
    console.log('decimal', target.value);
    return;
  }

  if (target.classList.contains('all-clear')) {
    console.log('clear', target.value);
    return;
  }

  console.log('digit', target.value);
});

Trong đoạn mã trên, chúng ta đang lắng nghe một sự kiện

const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (event) => {
  // Access the clicked element
  const { target } = event;

  // Check if the clicked element is a button.
  // If not, exit from the function
  if (!target.matches('button')) {
    return;
  }

  if (target.classList.contains('operator')) {
    console.log('operator', target.value);
    return;
  }

  if (target.classList.contains('decimal')) {
    console.log('decimal', target.value);
    return;
  }

  if (target.classList.contains('all-clear')) {
    console.log('clear', target.value);
    return;
  }

  console.log('digit', target.value);
});
4 trên phần tử có lớp là
const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (event) => {
  // Access the clicked element
  const { target } = event;

  // Check if the clicked element is a button.
  // If not, exit from the function
  if (!target.matches('button')) {
    return;
  }

  if (target.classList.contains('operator')) {
    console.log('operator', target.value);
    return;
  }

  if (target.classList.contains('decimal')) {
    console.log('decimal', target.value);
    return;
  }

  if (target.classList.contains('all-clear')) {
    console.log('clear', target.value);
    return;
  }

  console.log('digit', target.value);
});
5. Vì tất cả các phím trên máy tính đều là con của phần tử này nên sự kiện
const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (event) => {
  // Access the clicked element
  const { target } = event;

  // Check if the clicked element is a button.
  // If not, exit from the function
  if (!target.matches('button')) {
    return;
  }

  if (target.classList.contains('operator')) {
    console.log('operator', target.value);
    return;
  }

  if (target.classList.contains('decimal')) {
    console.log('decimal', target.value);
    return;
  }

  if (target.classList.contains('all-clear')) {
    console.log('clear', target.value);
    return;
  }

  console.log('digit', target.value);
});
4 cũng lọc xuống chúng. Điều này được gọi là ủy quyền sự kiện

Bên trong chức năng gọi lại của trình xử lý sự kiện, chúng tôi trích xuất thuộc tính

const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (event) => {
  // Access the clicked element
  const { target } = event;

  // Check if the clicked element is a button.
  // If not, exit from the function
  if (!target.matches('button')) {
    return;
  }

  if (target.classList.contains('operator')) {
    console.log('operator', target.value);
    return;
  }

  if (target.classList.contains('decimal')) {
    console.log('decimal', target.value);
    return;
  }

  if (target.classList.contains('all-clear')) {
    console.log('clear', target.value);
    return;
  }

  console.log('digit', target.value);
});
7 của sự kiện nhấp chuột bằng cách sử dụng phép gán phá hủy giúp dễ dàng giải nén các thuộc tính đối tượng thành các biến riêng biệt

const { target } = event;
// is equivalent to
const target = event.target;

Biến

const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (event) => {
  // Access the clicked element
  const { target } = event;

  // Check if the clicked element is a button.
  // If not, exit from the function
  if (!target.matches('button')) {
    return;
  }

  if (target.classList.contains('operator')) {
    console.log('operator', target.value);
    return;
  }

  if (target.classList.contains('decimal')) {
    console.log('decimal', target.value);
    return;
  }

  if (target.classList.contains('all-clear')) {
    console.log('clear', target.value);
    return;
  }

  console.log('digit', target.value);
});
7 là một đối tượng đại diện cho phần tử đã được nhấp vào. Nếu phần tử này không phải là nút (chẳng hạn như nếu bạn nhấp vào khoảng cách giữa các nút), chúng tôi sẽ thoát chức năng bằng cách quay lại sớm. Mặt khác, loại nút được nhấp sẽ được ghi vào bảng điều khiển cùng với giá trị của nó

Hãy chắc chắn dùng thử trước khi chuyển sang bước tiếp theo. Mở bảng điều khiển trình duyệt của bạn và nhấp vào bất kỳ nút nào. Loại và giá trị của khóa phải được ghi vào bảng điều khiển tương ứng

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Loại khóa chính xác được phát hiện và ghi vào bảng điều khiển

Hãy thư giãn và xem mã hoàn chỉnh ở cuối bước này

Nhập các chữ số

Trong bước này, chúng tôi sẽ làm cho các nút chữ số hoạt động để khi nhấp vào bất kỳ nút nào trong số chúng, giá trị tương ứng sẽ được hiển thị trên màn hình

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Vì thuộc tính

<input type="text" class="calculator-screen" value="" disabled />
3 của đối tượng
<input type="text" class="calculator-screen" value="" disabled />
2 đại diện cho đầu vào của người dùng, chúng tôi cần sửa đổi nó khi bất kỳ chữ số nào được nhấp vào. Tạo một hàm mới có tên là
const { target } = event;
// is equivalent to
const target = event.target;
1 bên dưới đối tượng
<input type="text" class="calculator-screen" value="" disabled />
2

function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}

Tiếp theo, thay thế dòng sau trong chức năng gọi lại trình nghe sự kiện

const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (event) => {
  // Access the clicked element
  const { target } = event;

  // Check if the clicked element is a button.
  // If not, exit from the function
  if (!target.matches('button')) {
    return;
  }

  if (target.classList.contains('operator')) {
    console.log('operator', target.value);
    return;
  }

  if (target.classList.contains('decimal')) {
    console.log('decimal', target.value);
    return;
  }

  if (target.classList.contains('all-clear')) {
    console.log('clear', target.value);
    return;
  }

  console.log('digit', target.value);
});
4

console.log('digit', target.value);

với đoạn mã sau

inputDigit(target.value);
updateDisplay();

Trong hàm

const { target } = event;
// is equivalent to
const target = event.target;
1, toán tử bậc ba (
const { target } = event;
// is equivalent to
const target = event.target;
5) được sử dụng để kiểm tra xem giá trị hiện tại được hiển thị trên máy tính có bằng 0 không. Nếu vậy,
const { target } = event;
// is equivalent to
const target = event.target;
6 được ghi đè bằng bất kỳ chữ số nào được nhấp vào. Mặt khác, nếu
<input type="text" class="calculator-screen" value="" disabled />
3 là một số khác 0, thì chữ số được nối vào nó thông qua phép nối chuỗi

Cuối cùng, hàm

const { target } = event;
// is equivalent to
const target = event.target;
8 được gọi để nội dung mới của thuộc tính
<input type="text" class="calculator-screen" value="" disabled />
3 được phản ánh trên màn hình sau mỗi lần nhấp vào nút. Dùng thử bằng cách nhấp vào bất kỳ nút chữ số nào. Màn hình sẽ được cập nhật với bất kỳ chữ số nào bạn đã nhấp

Hãy thư giãn và xem mã hoàn chỉnh ở cuối bước này

Nhập một dấu thập phân

Khi bấm vào phím dấu thập phân, chúng ta cần thêm dấu thập phân vào bất kỳ nội dung nào được hiển thị trên màn hình trừ khi nó đã chứa dấu thập phân

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Đây là cách chúng ta có thể đạt được điều đó. Tạo một chức năng mới gọi là

function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
0 bên dưới
const { target } = event;
// is equivalent to
const target = event.target;
1

function inputDecimal(dot) {
  // If the `displayValue` property does not contain a decimal point
  if (!calculator.displayValue.includes(dot)) {
    // Append the decimal point
    calculator.displayValue += dot;
  }
}

Trong hàm

function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
0, phương thức bao gồm () được sử dụng để kiểm tra xem
<input type="text" class="calculator-screen" value="" disabled />
3 chưa chứa dấu thập phân chưa. Nếu vậy, một dấu chấm được thêm vào số. Nếu không, chức năng thoát

Sau đó, thay thế dòng sau trong chức năng gọi lại trình nghe sự kiện của phím

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
0

với các dòng mã sau

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
1

Tại thời điểm này, bạn sẽ có thể thêm đầu vào thành công một dấu thập phân và nó hiển thị trên màn hình

Hãy thư giãn và xem mã hoàn chỉnh ở cuối bước này

xử lý các nhà khai thác

Bước tiếp theo là làm cho các toán tử (+, −, ⨉, ÷, =) trên máy tính hoạt động. Có ba kịch bản để giải thích

1. Khi người dùng nhấn một toán tử sau khi nhập toán hạng đầu tiên

Tại thời điểm này, nội dung của

<input type="text" class="calculator-screen" value="" disabled />
3 phải được lưu trữ trong thuộc tính
<input type="text" class="calculator-screen" value="" disabled />
4 và thuộc tính
<input type="text" class="calculator-screen" value="" disabled />
6 phải được cập nhật với bất kỳ toán tử nào được nhấp vào

Tạo một chức năng mới gọi là

function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
7 bên dưới
function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
0

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
2

Khi nhấn phím toán tử, nội dung của

<input type="text" class="calculator-screen" value="" disabled />
3 được chuyển đổi thành số dấu phẩy động (có nghĩa là số có dấu thập phân) và kết quả được lưu trong thuộc tính
<input type="text" class="calculator-screen" value="" disabled />
4

Thuộc tính

<input type="text" class="calculator-screen" value="" disabled />
6 cũng được đặt thành bất kỳ phím toán tử nào được nhấp trong khi
<input type="text" class="calculator-screen" value="" disabled />
8 được đặt thành
<input type="text" class="calculator-screen" value="" disabled />
9 cho biết rằng toán hạng đầu tiên đã được nhập và bất kỳ chữ số nào người dùng nhập tiếp theo sẽ tạo thành toán hạng thứ hai

Tại thời điểm này, thật hữu ích khi xem các thuộc tính của đối tượng

<input type="text" class="calculator-screen" value="" disabled />
2 đang được cập nhật như thế nào trên mỗi lần nhấn nút. Thêm dòng sau vào cuối cả hai hàm
const { target } = event;
// is equivalent to
const target = event.target;
1 và
function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
7

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
3

Sau đó, thay thế dòng sau trong hàm gọi lại trình nghe sự kiện

const keys = document.querySelector('.calculator-keys');
keys.addEventListener('click', (event) => {
  // Access the clicked element
  const { target } = event;

  // Check if the clicked element is a button.
  // If not, exit from the function
  if (!target.matches('button')) {
    return;
  }

  if (target.classList.contains('operator')) {
    console.log('operator', target.value);
    return;
  }

  if (target.classList.contains('decimal')) {
    console.log('decimal', target.value);
    return;
  }

  if (target.classList.contains('all-clear')) {
    console.log('clear', target.value);
    return;
  }

  console.log('digit', target.value);
});
4 của phím

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
4

với đoạn mã sau

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
5

Tại thời điểm này, hãy cố gắng xây dựng một phép tính số học hợp lệ bằng cách nhấp lần lượt vào các phím sau.

console.log('digit', target.value);
8. Lưu ý rằng khi nhấn phím
<input type="text" class="calculator-screen" value="" disabled />
0, các giá trị của thuộc tính
<input type="text" class="calculator-screen" value="" disabled />
4 và
<input type="text" class="calculator-screen" value="" disabled />
6 được cập nhật lần lượt thành
function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();
9 và
<input type="text" class="calculator-screen" value="" disabled />
0 trong khi
<input type="text" class="calculator-screen" value="" disabled />
8 được đặt thành true cho biết máy tính hiện đang đợi toán hạng thứ hai được nhập

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Nếu bạn cố gắng nhập toán hạng thứ hai, bạn sẽ nhận thấy rằng toán hạng này được thêm vào toán hạng thứ nhất thay vì ghi đè lên toán hạng đó

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Hãy khắc phục điều đó bằng cách cập nhật chức năng

const { target } = event;
// is equivalent to
const target = event.target;
1 như hình bên dưới

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
6

Nếu thuộc tính

<input type="text" class="calculator-screen" value="" disabled />
8 được đặt thành
<input type="text" class="calculator-screen" value="" disabled />
9, thì thuộc tính
<input type="text" class="calculator-screen" value="" disabled />
3 được ghi đè bằng chữ số đã được nhấp. Mặt khác, kiểm tra tương tự được thực hiện như trước, ghi đè hoặc thêm vào
<input type="text" class="calculator-screen" value="" disabled />
3 khi thích hợp

Hãy thư giãn và xem mã hoàn chỉnh ở cuối bước này

2. Khi người dùng nhấn một toán tử sau khi nhập toán hạng thứ hai

Tình huống thứ hai chúng ta cần xử lý xảy ra khi người dùng nhập toán hạng thứ hai và nhấn phím toán tử. Khi đó đã có đầy đủ các thành phần để đánh giá biểu thức nên ta cần thực hiện và hiển thị kết quả ra màn hình.

<input type="text" class="calculator-screen" value="" disabled />
4 cũng cần được cập nhật để có thể sử dụng lại kết quả trong lần tính toán tiếp theo

Tạo một chức năng mới gọi là

function inputDecimal(dot) {
  // If the `displayValue` property does not contain a decimal point
  if (!calculator.displayValue.includes(dot)) {
    // Append the decimal point
    calculator.displayValue += dot;
  }
}
1 bên dưới
function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
7 như hình bên dưới

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
7

Hàm này lấy toán hạng thứ nhất, toán hạng thứ hai và toán tử làm đối số và kiểm tra giá trị của toán tử để xác định cách đánh giá biểu thức. Nếu toán tử là

function inputDecimal(dot) {
  // If the `displayValue` property does not contain a decimal point
  if (!calculator.displayValue.includes(dot)) {
    // Append the decimal point
    calculator.displayValue += dot;
  }
}
3, thì toán hạng thứ hai sẽ được trả về nguyên trạng

Tiếp theo, cập nhật chức năng

function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
7 như hình bên dưới

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
8

Khối

function inputDecimal(dot) {
  // If the `displayValue` property does not contain a decimal point
  if (!calculator.displayValue.includes(dot)) {
    // Append the decimal point
    calculator.displayValue += dot;
  }
}
5 được thêm vào
function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
7 kiểm tra xem thuộc tính
<input type="text" class="calculator-screen" value="" disabled />
6 đã được chỉ định người điều hành chưa. Nếu vậy, hàm
function inputDecimal(dot) {
  // If the `displayValue` property does not contain a decimal point
  if (!calculator.displayValue.includes(dot)) {
    // Append the decimal point
    calculator.displayValue += dot;
  }
}
1 được gọi và kết quả được lưu trong biến
function inputDecimal(dot) {
  // If the `displayValue` property does not contain a decimal point
  if (!calculator.displayValue.includes(dot)) {
    // Append the decimal point
    calculator.displayValue += dot;
  }
}
9

Kết quả này sau đó được hiển thị cho người dùng bằng cách cập nhật thuộc tính

<input type="text" class="calculator-screen" value="" disabled />
3. Ngoài ra, giá trị của
<input type="text" class="calculator-screen" value="" disabled />
4 được cập nhật vào kết quả để nó có thể được sử dụng trong máy tính tiếp theo

dùng thử. Nhập

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
02 vào máy tính và nhận thấy rằng kết quả chính xác được hiển thị trên màn hình. Nó cũng hoạt động khi bạn xâu chuỗi các hoạt động. Vì vậy, kết quả là
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
03 nên cho kết quả là
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
04

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Điều này là do việc nhấn phím trừ sẽ kích hoạt tính toán của phép toán đầu tiên (

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
05) mà kết quả (
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
06) sau đó được đặt thành
<input type="text" class="calculator-screen" value="" disabled />
4 cho phép tính tiếp theo, vì vậy khi chúng tôi nhập
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
08 làm toán hạng thứ hai và nhấn phím
function inputDecimal(dot) {
  // If the `displayValue` property does not contain a decimal point
  if (!calculator.displayValue.includes(dot)) {
    // Append the decimal point
    calculator.displayValue += dot;
  }
}
3,

Hãy thư giãn và xem mã hoàn chỉnh ở cuối bước này

3. Khi hai hoặc nhiều toán tử được nhập liên tiếp

Việc một người thay đổi suy nghĩ về loại hoạt động mà người đó muốn thực hiện là điều khá phổ biến nên máy tính phải xử lý việc này đúng cách

Giả sử bạn muốn cộng bảy và hai lại với nhau, bạn sẽ nhấp vào

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
13 sẽ cho ra kết quả chính xác. Nhưng hãy giả sử sau khi nhấn
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
14, bạn đổi ý và quyết định trừ 2 từ 7. Thay vì xóa máy tính và bắt đầu lại từ đầu, bạn có thể nhấn _______4_______15 để ghi đè _______2_______0 đã nhập trước đó

Hãy nhớ rằng tại thời điểm nhập toán tử,

<input type="text" class="calculator-screen" value="" disabled />
8 sẽ được đặt thành
<input type="text" class="calculator-screen" value="" disabled />
9 vì máy tính mong đợi toán hạng thứ hai được nhập sau phím toán tử. Chúng tôi có thể sử dụng chất lượng này để cập nhật phím toán tử và ngăn mọi phép tính cho đến khi toán hạng thứ hai được nhập

Sửa hàm

function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
7 thành như thế này

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
9

Thay đổi có liên quan được đánh dấu ở trên. Câu lệnh

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
20 kiểm tra xem một
<input type="text" class="calculator-screen" value="" disabled />
6 đã tồn tại chưa và nếu
<input type="text" class="calculator-screen" value="" disabled />
8 được đặt thành
<input type="text" class="calculator-screen" value="" disabled />
9. Nếu vậy, giá trị của thuộc tính
<input type="text" class="calculator-screen" value="" disabled />
6 được thay thế bằng toán tử mới và hàm sẽ thoát để không có phép tính nào được thực hiện

dùng thử. Nhấp vào nhiều toán tử sau khi nhập một số chữ số và theo dõi đối tượng máy tính trong bảng điều khiển. Lưu ý rằng thuộc tính

<input type="text" class="calculator-screen" value="" disabled />
6 được cập nhật mỗi lần và không có phép tính nào được thực hiện cho đến khi bạn cung cấp toán hạng thứ hai

Hãy thư giãn và xem mã hoàn chỉnh ở cuối bước này

Đặt lại máy tính

Nhiệm vụ cuối cùng là đảm bảo người dùng có thể đặt lại máy tính về trạng thái ban đầu bằng cách nhấn một phím. Trong hầu hết các máy tính, nút

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
26 được sử dụng để đặt lại máy tính về trạng thái mặc định, vì vậy đó là những gì chúng ta sẽ làm ở đây

Hãy tiếp tục và tạo một chức năng mới bên dưới

function inputDecimal(dot) {
  // If the `displayValue` property does not contain a decimal point
  if (!calculator.displayValue.includes(dot)) {
    // Append the decimal point
    calculator.displayValue += dot;
  }
}
1 như hình bên dưới

function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();
0

Sau đó thay thế dòng sau trong chức năng gọi lại trình nghe sự kiện của phím

function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();
1

với đoạn mã sau

function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();
2

Hàm

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
28 đặt tất cả các thuộc tính của đối tượng
<input type="text" class="calculator-screen" value="" disabled />
2 về giá trị ban đầu của chúng. Nhấp vào phím
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
26 trên máy tính bây giờ sẽ hoạt động như mong đợi. Bạn có thể kiểm tra đối tượng
<input type="text" class="calculator-screen" value="" disabled />
2 trong bảng điều khiển để xác nhận

Hãy thư giãn và xem mã hoàn chỉnh ở cuối bước này

Sửa lỗi thập phân

Nếu bạn nhập một dấu thập phân sau khi bấm vào một toán tử, nó sẽ được thêm vào toán hạng đầu tiên thay vì là một phần của toán hạng thứ hai

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Chúng ta có thể sửa lỗi này bằng cách thực hiện sửa đổi sau đối với chức năng

function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
0

function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();
3

Nếu

<input type="text" class="calculator-screen" value="" disabled />
8 được đặt thành
<input type="text" class="calculator-screen" value="" disabled />
9 và dấu thập phân được nhập, thì
<input type="text" class="calculator-screen" value="" disabled />
3 trở thành
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
36 và
<input type="text" class="calculator-screen" value="" disabled />
8 được đặt thành false để mọi chữ số bổ sung được thêm vào như một phần của toán hạng thứ hai

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Lỗi hiện đã được sửa

Hãy thư giãn và xem mã hoàn chỉnh ở cuối bước này

Tái cấu trúc trình nghe sự kiện

Cập nhật trình xử lý sự kiện của khóa như hình bên dưới. Tất cả các khối

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
20 đã được thay thế bằng một khối duy nhất
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
39 và
const { target } = event;
// is equivalent to
const target = event.target;
8 chỉ được gọi một lần ở cuối hàm

function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();
4

Bằng cách này, việc thêm các hàm mới vào máy tính sẽ dễ dàng hơn rất nhiều và bạn không cần phải gọi hàm

const { target } = event;
// is equivalent to
const target = event.target;
8 sau mỗi thao tác nữa

Hãy thư giãn và xem mã hoàn chỉnh ở cuối bước này

Độ chính xác của dấu phẩy động

Tôi muốn bạn chú ý đến một vấn đề xảy ra khi kết quả của một phép toán là một số động. Ví dụ:

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
42 tạo ra
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
43 thay vì
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
44 như bạn có thể mong đợi

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Trong các trường hợp khác, bạn nhận được kết quả mong đợi. Ví dụ:

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
45 mang lại
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
46. Một lời giải thích chi tiết về lý do tại sao điều này xảy ra có thể được tìm thấy ở đây. Hãy chắc chắn rằng bạn đọc nó

Một trong những giải pháp tiềm năng cho vấn đề này được đề xuất trong trang được liên kết ở trên là định dạng kết quả thành một số vị trí thập phân cố định để các vị trí khác bị loại bỏ. Chúng ta có thể kết hợp hàm parseFloat của JavaScript với Số. toFixed để triển khai giải pháp này trong ứng dụng máy tính của chúng tôi

Trong hàm

function inputDigit(digit) {
  const { displayValue } = calculator;
  // Overwrite `displayValue` if the current value is '0' otherwise append to it
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
}
7, thay thế dòng sau

function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();
5

với đoạn mã sau

function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();
6

Phương thức

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
48 chấp nhận giá trị từ 0 đến 20 và đảm bảo rằng số chữ số sau dấu thập phân được giới hạn ở giá trị đó. Giá trị trả về có thể được làm tròn hoặc đệm bằng số 0 nếu cần

Trong ví dụ trước,

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
42 mang lại
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
43. Sử dụng
const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
51 trên kết quả sẽ hạn chế các chữ số sau dấu thập phân thành bảy chữ số

function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();
7

Những số không thừa đó không quan trọng, vì vậy chúng ta có thể sử dụng

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null,
};
52 để loại bỏ chúng

function updateDisplay() {
  // select the element with class of `calculator-screen`
  const display = document.querySelector('.calculator-screen');
  // update the value of the element with the contents of `displayValue`
  display.value = calculator.displayValue;
}

updateDisplay();
8

Và đó là cách chúng tôi có thể khắc phục sự cố này trong ứng dụng của mình. Tôi chọn số 7 trong trường hợp này vì nó đủ chính xác cho ứng dụng máy tính này. Một lượng chính xác cao hơn có thể được yêu cầu trong các tình huống khác

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Là một phần thưởng bổ sung, kết quả hiện vừa vặn trên màn hình

Hãy thư giãn và xem mã hoàn chỉnh ở cuối bước này

Nội dung thưởng

Tôi đã chuẩn bị thêm một số cải tiến cho ứng dụng máy tính này cho những người ủng hộ Patreon của tôi. Các chức năng sau đã được thêm vào ứng dụng. sin, cos, tan, log, bình phương, căn bậc hai, giai thừa, phần trăm, cộng/trừ, π và ce

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript?

Hỗ trợ tôi trên Patreon để mở khóa phần tiếp theo của hướng dẫn này

Nếu bạn muốn có quyền truy cập vào tất cả nội dung thưởng của tôi (bao gồm cả nội dung này), hãy cân nhắc hỗ trợ Sinh viên năm nhất trên Patreon. Sự hỗ trợ của bạn sẽ giúp tôi tạo ra nhiều hướng dẫn hơn với tốc độ nhanh hơn

Phần kết luận

Điều đó kết thúc hướng dẫn của tôi, tôi hy vọng bạn đã học được nhiều điều từ nó. Vui lòng để lại nhận xét nếu một phần của bài viết không đủ rõ ràng đối với bạn và đăng ký nhận bản tin của tôi để nhận thêm các hướng dẫn tuyệt vời như hướng dẫn này trong hộp thư đến của bạn

Tôi có thể tạo máy tính bằng JavaScript không?

Ở đây chúng tôi đã tạo một chương trình Máy tính sử dụng ngôn ngữ JavaScript , bao gồm lập trình web HTML và CSS. Trong Máy tính này, chúng ta có thể thực hiện các phép toán cơ bản như cộng, nhân, trừ và chia. Bây giờ chúng ta thực hiện một số thao tác trong chương trình JavaScript, như hình bên dưới.

Làm cách nào để tạo một máy tính đơn giản bằng JavaScript và HTML?

Các bước để tạo một máy tính đơn giản bằng HTML và JavaScript .
At first Insert a
element within tag..
Create a table using …. .. .
Insert two types of Input text and button within table data of table row using
…. .. .
Chỉ định sự kiện OnClick cho tất cả các nút có số và toán tử số học

Làm cách nào để tạo máy tính trong JavaScript bằng dấu nhắc?

hàm myFunction() {
var x,y,z,oper;
x=prompt("Nhập số đầu tiên");
y=prompt("Nhập số thứ hai");
oper=prompt("Nhập toán tử");
if(oper=="+"){
z=Số(x)+Số(y);

Làm cách nào để tạo một máy tính trong HTML?

Ví dụ về Máy tính sử dụng HTML.