jsrosetta

Kiểu dữ liệu

Kiểm tra kiểu dữ liệu

typeof/Object.prototype.toString trong JavaScript so với reflect.TypeOf (Go), type(of:) (Swift), getClass() (Java) và std::any::type_name (Rust).

Phiên bản tối thiểu
Node.js ≥ 12.20Go ≥ 1.18Rust ≥ 1.65Swift ≥ 5.7Java ≥ 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.

typeof trong JavaScript chỉ phân biệt được vài nhóm lớn (object, function…), nên muốn biết chính xác một giá trị là Map, Date hay RegExp thì phải mượn Object.prototype.toString. Go không có typeof; package reflect cho bạn tên kiểu chính xác của bất kỳ giá trị any nào lúc chạy. Swift (type(of:)) và Java (getClass()) có reflection thật, lặp qua một danh sách giá trị không đồng nhất y như Go. Rust thì khác hẳn: std::any::type_name chỉ suy ra tại compile-time từ generic, không phải reflection lúc chạy trên giá trị đã bị xoá kiểu — nên không thể viết một vòng lặp kiểu Go.

Kiểm tra kiểu lúc chạy

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0,-1).toLowerCase()
}
 
const values = [
  true,
  10,
  'foo',
  Symbol('bar'),
  null,
  undefined,
  NaN,
  {},
  [],
  function(){},
  new Error(),
  new Date(),
  /a/,
  new Map(),
  new Set(),
  Promise.resolve(),
  function *() {},
  class {},
]
 
for (const value of values) {
  console.log(typeOf(value))
}

Output (Node.js):

boolean
number
string
symbol
null
undefined
number
object
array
function
error
date
regexp
map
set
promise
generatorfunction
function

Output (Go):

bool
int8
int16
int32
int64
uint
uint8
uint16
uint32
uint64
uintptr
float32
float64
complex64
complex128
string
uint8
int32
int32
struct {}
[]string
map[string]int
func()
chan bool
<nil>
*int
time.Time
*regexp.Regexp

Output (Rust — tên đầy đủ gồm cả module path, và tên crate type_check sẽ khác nếu bạn đặt tên project khác):

bool
i32
f64
&str
alloc::string::String
core::option::Option<i32>
alloc::vec::Vec<i32>
std::collections::hash::map::HashMap<alloc::string::String, i32>
type_check::main::{{closure}}
std::time::Instant
regex::regex::string::Regex

Output (Swift):

Bool
Int
Double
String
Optional<Int>
Array<Int>
Dictionary<String, Int>
() -> ()
Date
Regex<AnyRegexOutput>

Output (Java — tên lớp lambda kèm địa chỉ, sẽ khác nhau mỗi lần chạy):

Boolean
Integer
Double
String
ListN
Map1
Main$$Lambda/0x0000000301160210
Instant
Pattern

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