You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何position_1在判断语句中提示未定义,却可在menu_position对象及alert中正常访问?

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 20:14:29