jsrosetta

Luồng điều khiển

Switch

switch/case của JavaScript so với Go (không fall through, có fallthrough), Rust match (không có khái niệm fallthrough), Swift (giống Go) và Java (giống JS).

Phiên bản tối thiểu
Node.js ≥ 12.20Go ≥ 1.0Rust ≥ 1.0Swift ≥ 2.0Java ≥ 25
Đã chạy thử trên
Node.js 24.12.0Go 1.27.1Rust 1.98.1Swift 6.2.4Java 25.0.4.1

Code Node.js là ES module: lưu file .mjs hoặc đặt "type": "module" trong package.json.

switch của Go trông giống JavaScript nhưng hành vi mặc định ngược lại hoàn toàn: JavaScript fall through sang case tiếp theo trừ khi có break, còn Go tự dừng sau case khớp trừ khi bạn viết fallthrough tường minh. Swift giống hệt Go (không fall through, có từ khoá fallthrough tường minh). Rust không có switch mà có match — và match không có khái niệm fallthrough dưới bất kỳ hình thức nào. Java (switch cổ điển dùng :) lại giống JavaScript: fall through mặc định, cần break để dừng — dù từ Java 14 đã có thêm switch expression dùng -> không bao giờ fall through.

switch không fall through vs fall through

const value = 'b'
 
switch(value) {
  case 'a':
    console.log('A')
    break
  case 'b':
    console.log('B')
    break
  case 'c':
    console.log('C')
    break
  default:
    console.log('first default')
}
 
switch(value) {
  case 'a':
    console.log('A - falling through')
  case 'b':
    console.log('B - falling through')
  case 'c':
    console.log('C - falling through')
  default:
    console.log('second default')
}
# Go / Swift / Java
B
B - falling through
C - falling through
second default
 
# Rust (match không có fallthrough, xem ghi chú)
B
A, B or C

Khác biệt chính

Node.js Go Rust Swift Java (switch cổ điển)
Mặc định sau một case khớp fall through sang case kế tiếp dừng lại (implicit break) dừng lại — không có khái niệm khác dừng lại (implicit break) fall through sang case kế tiếp
Muốn dừng lại phải viết break không cần làm gì, đã là mặc định không cần làm gì, đã là mặc định không cần làm gì, đã là mặc định phải viết break
Muốn fall through mặc định đã vậy phải viết fallthrough tường minh không thể — dùng or-pattern | nếu muốn gộp phải viết fallthrough tường minh mặc định đã vậy

Tham khảo: github.com/miguelmota/golang-for-nodejs-developers#switch