为何position_1在判断语句中提示未定义,却可在menu_position对象及alert中正常访问?
嘿,我来帮你揪出这个问题的根源~
你遇到的这个矛盾其实是JS里「属性名标识符」和「变量」的区别在搞鬼,我给你拆解清楚:
问题出在哪?
你看判断语句里的这行代码:
if (question == position_1){
这里的position_1被JavaScript当成了一个变量,但你从头到尾都没有声明过名为position_1的变量(你只在menu_position对象里定义了叫这个名字的属性,不是变量),所以JS自然会报错“position_1未定义”。
那为什么之前的alert(menu_position.position_1.price)能正常工作?
因为这里的position_1是对象属性的访问标识符——用.点号访问对象属性时,后面跟的名字是直接对应对象里的属性名,它不是变量,就是JS用来定位对象属性的“名字标签”,所以能精准找到menu_position里的position_1属性。
怎么改?
最直接的修复方法是把判断里的position_1改成字符串形式,因为用户通过prompt输入的question本质是一个字符串,你得用字符串和字符串做比较:
if (question == 'position_1'){ alert(menu_position.position_1.position_Name) }
如果想让代码更灵活(比如以后要加更多商品、或者用变量动态选属性),也可以用方括号属性访问法,这样还能避免重复写属性名字符串:
// 先把要判断的属性名存成变量 const targetPosition = 'position_1'; if (question == targetPosition){ alert(menu_position[targetPosition].position_Name) }
额外小提示
顺便提一嘴,你代码里还有个小细节:menu_position.position_1.position_Name访问到的其实是属性名position_Name,而不是你输入的商品名(比如Coffee)。这是因为你用对象简写语法时,{ position_Name }等价于{ position_Name: position_Name },属性名是固定的字符串position_Name,不是用户输入的内容。如果想让属性名就是用户输入的商品名,得改成{ [position_Name]: price }这种计算属性名写法~
备注:内容来源于stack exchange,提问作者Alexander

