feat: 实现 Symbol.for 和 Symbol.keyFor

This commit is contained in:
2026-06-14 17:48:31 +08:00
parent 4ce8fa75dc
commit cf55db1b26
5 changed files with 100 additions and 0 deletions
@@ -123,3 +123,38 @@ fn symbol_iterator_exists() {
let result = eval(&mut vm, "typeof Symbol.iterator").unwrap();
assert_eq!(to_str(&vm, result), "object");
}
#[test]
fn symbol_for_reuses_registered_symbol() {
let mut vm = Vm::new();
let result = eval(&mut vm, "var s1 = Symbol.for('shared'); var s2 = Symbol.for('shared'); s1 === s2").unwrap();
assert!(result.as_bool());
}
#[test]
fn symbol_for_is_distinct_from_symbol_constructor() {
let mut vm = Vm::new();
let result = eval(&mut vm, "var s1 = Symbol.for('shared'); var s2 = Symbol('shared'); s1 === s2").unwrap();
assert!(!result.as_bool());
}
#[test]
fn symbol_key_for_returns_registered_key() {
let mut vm = Vm::new();
let result = eval(&mut vm, "Symbol.keyFor(Symbol.for('shared'))").unwrap();
assert_eq!(to_str(&vm, result), "shared");
}
#[test]
fn symbol_key_for_unregistered_symbol_returns_undefined() {
let mut vm = Vm::new();
let result = eval(&mut vm, "Symbol.keyFor(Symbol('shared'))").unwrap();
assert!(result.is_undefined());
}
#[test]
fn symbol_key_for_non_symbol_throws_type_error() {
let mut vm = Vm::new();
let result = eval(&mut vm, "try { Symbol.keyFor(42) } catch (e) { e instanceof TypeError }").unwrap();
assert!(result.as_bool());
}