Hướng dẫn javascript check missing parameter - javascript kiểm tra tham số bị thiếu

Cách để kiểm tra các tham số phụ thuộc vào loại thông tin bạn chuyển đến hàm và cách bạn muốn chức năng của mình xử lý các trường hợp cạnh.

Trong hầu hết các trường hợp, bạn có thể sử dụng:

...
bar = bar || ...default value here...
...

Tuy nhiên, nó có thể là một vấn đề khi bạn muốn vượt qua các giá trị giả (

function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
3,
function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
4,
function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
5,
function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
6,
function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
7,
function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
8):

function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted

Thay vào đó, bạn có thể kiểm tra chống lại

function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
7:

...
if (bar == undefined) {
    bar = 5
}
...

... Tuy nhiên, sử dụng kiểm tra lỏng lẻo cho phép cả

function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
8 và
function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
7 bị ghi đè (
...
if (bar == undefined) {
    bar = 5
}
...
2):

function foo(bar) {
  if (bar == undefined) {
      bar = 5
  }
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1

Vì vậy, thay vào đó, một so sánh bình đẳng nghiêm ngặt (

...
if (bar == undefined) {
    bar = 5
}
...
3) thường được ưa thích (
...
if (bar == undefined) {
    bar = 5
}
...
4):

function foo(bar) {
  if (bar === undefined) { 
      bar = 5
  }
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // null
foo(1)         // 1

ES2015 đã giới thiệu các tham số mặc định, về cơ bản tương đương với việc kiểm tra nghiêm ngặt đối với

function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
7:

function foo(bar = 5) {
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // null
foo(1)         // 1

Điều này có thể dẫn đến rắc rối nếu bạn cần biết liệu

function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
7 có được thông qua như một tham số hay không.

Nếu bạn muốn hoàn toàn chắc chắn rằng bạn sẽ không đưa ra một đối số được cung cấp, bạn có thể kiểm tra số lượng đối số được truyền cho hàm:

...
if (arguments.length < 1) {
  bar = 5
}
...

Điều đó có nghĩa là bạn có thể vượt qua thành công

function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
7 làm đối số trong khi cũng chọn sử dụng một mặc định khác:

function foo(bar) {
  if (arguments.length < 1) {
    bar = 5
  }
  console.log(bar)
}

foo()          // 5
foo(undefined) // undefined
foo(null)      // null
foo(1)         // 1


Nếu bạn có nhiều tham số, bạn có thể muốn sử dụng nhiều mặc định. Gần đây tôi đã tìm thấy một trường hợp sử dụng cho Fall trong một câu lệnh chuyển đổi, mặc dù tiện ích là đáng nghi ngờ:

function foo(bar, baz, fizz, buzz) {
  switch (arguments.length) {
    case 0:
      bar = 1;
      //continue; might as well point out that implicit fall-through is desired
    case 1:
      baz = 2;
      //continue;
    case 2:
      fizz = 3;
      //continue;
    case 3:
      buzz = 4;
      //continue;
  }
  console.log(bar, baz, fizz, buzz)
}

foo()               // 1 2 3 4
foo(10)             // 10 2 3 4
foo(10, 20)         // 10 20 3 4
foo(10, 20, 30)     // 10 20 30 4
foo(10, 20, 30, 40) // 10 20 30 40

Ngoại lệ JavaScript "Thiếu tham số chính thức" xảy ra khi khai báo hàm của bạn bị thiếu các tham số hợp lệ.

Thông điệp

SyntaxError: missing formal parameter (Firefox)
SyntaxError: Unexpected number '3'. Expected a parameter pattern or a ')' in parameter list. (Safari)
SyntaxError: Unexpected string literal "x". Expected a parameter pattern or a ')' in parameter list. (Safari)

Loại lỗi

Có chuyện gì?

"Tham số chính thức" là một cách nói "tham số chức năng" lạ mắt. Tuyên bố chức năng của bạn bị thiếu các tham số hợp lệ. Trong tuyên bố của một hàm, các tham số phải là định danh, không phải bất kỳ giá trị nào như số, chuỗi hoặc đối tượng. Khai báo các chức năng và chức năng gọi là hai bước riêng biệt. Khai báo yêu cầu định danh là tham số và chỉ khi gọi (gọi) hàm, bạn cung cấp các giá trị mà hàm nên sử dụng.

Trong JavaScript, các định danh chỉ có thể chứa các ký tự chữ và số (hoặc "$" hoặc "_") và có thể không bắt đầu bằng một chữ số. Một định danh khác với một chuỗi ở chỗ một chuỗi là dữ liệu, trong khi một định danh là một phần của mã.string in that a string is data, while an identifier is part of the code.

Ví dụ

Cung cấp các tham số chức năng thích hợp

Các tham số chức năng phải là định danh khi thiết lập một hàm. Tất cả các khai báo chức năng này đều thất bại, vì chúng đang cung cấp các giá trị cho các tham số của chúng:

function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
0

Bạn sẽ cần sử dụng số nhận dạng trong khai báo chức năng:

function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
1

Sau đó, bạn có thể gọi các chức năng này với các đối số bạn thích:

function foo(bar) {
  bar = bar || 5
  console.log(bar)
}

foo()          // 5
foo(undefined) // 5
foo(null)      // 5
foo(1)         // 1
foo(0)         // 5, probably not what you wanted
2

Xem thêm