為何 temp.("name"+1) 報錯,而 temp['name'+1] 正常?Groovy 支持前者,JS 為何不支援?
obj.identifier 中 identifier 必須是 靜態標識符,符合變量命名規則(字母/下劃線/$ 開頭,後接字母/數字/下劃線/$),不能是表達式obj[expression] 中 expression 可以是 任意字符串表達式,運行時求值後作為屬性鍵Groovy 的 . 操作符被重載為動態屬性訪問,編譯器將 obj.("name"+1) 轉換為 obj.getProperty("name1") 呼叫。JS 為保持語法簡潔與解析效率,未採用此設計。
const temp = { name1: 'a', name2: 'b', name3: 'c' };
// ✅ 正確:方括號語法 + 模板字符串
for (let i = 1; i <= 3; i++) {
console.log(temp[`name${i}`]); // 輸出 a, b, c
}
// ✅ 正確:Object.keys 遍歷
Object.keys(temp).forEach(key => console.log(temp[key]));
// ❌ 錯誤:點語法配合表達式
// temp.("name" + 1) // SyntaxError: Unexpected string
function collectFormData(prefix, count) {
const data = {};
for (let i = 1; i <= count; i++) {
const key = `${prefix}${i}`;
data[key] = document.getElementById(key)?.value;
}
return data;
}
// ES2020 可選鏈操作符
const value = obj?.[dynamicKey]?.nestedProp; // 任意環節為 null/undefined 返回 undefined
const handler = {
get(target, prop) {
if (prop.startsWith('name')) {
const index = prop.slice(4);
return target[`data_${index}`];
}
return target[prop];
}
};
const proxy = new Proxy({ data_1: 'value1' }, handler);
console.log(proxy.name1); // 'value1' - 實現了點語法動態訪問
obj[`key${i}`] 模板字符串,可讀性最佳Proxy 或封裝 getProp(obj, 'name'+i) 工具函數