JavaScript Greeter类代码bug排查与修正求助
JavaScript Greeter类Bug排查与修复
你已经找到的greet方法内用const声明变量后尝试重赋值的问题是准确的:const声明的常量初始化后不允许重新绑定值,运行时会直接抛出"Assignment to Constant Variable"错误,修复时需要将这两个变量声明改为let。
除此之外代码还有3处影响核心逻辑的bug,具体问题原因如下:
- 构造函数参数顺序完全写反
根据需求规则,实例化时第一个入参是问候语、第二个入参是姓名,例如new Greeter("What's up", "Dog")返回结果中,"What's up"是问候语、"Dog"是姓名。但当前构造函数定义的参数顺序为(name, greeting),将第一个入参赋值给this.name、第二个赋值给this.greeting,直接导致参数存储错位:单传问候语时,问候语会被错存到name属性,greeting属性为空,后续默认值逻辑完全失效。 - 条件判断误将全等写为赋值
判断问候语是否为空的分支代码为if (greeting = undefined),这里使用了单等号赋值运算符=,而非用于严格相等判断的===。代码执行到这一行时会直接把greeting变量赋值为undefined,导致判断条件永远为真,无论实例化时有没有传入问候语,都会被强制重置为默认值"Hello"。 - 模板字符串使用了错误的包裹符号
返回值使用普通双引号"包裹,但JavaScript中支持${变量名}插值语法的模板字符串必须使用反引号`包裹。使用双引号时,插值占位符不会被引擎解析,会直接把${greeting}, ${name}!作为普通字符串文本返回,不会替换成变量的实际值。
修复后可正常运行的完整代码
class Greeter { // 修正参数顺序:第一个入参为问候语,第二个为姓名 constructor(greeting, name) { this.name = name; this.greeting = greeting; } greet() { // 将const改为let,允许后续设置默认值时重新赋值 let name = this.name; let greeting = this.greeting; if (!name) { name = "Anonymous"; } // 将赋值运算符=改为严格相等判断=== if (greeting === undefined) { greeting = "Hello"; } // 将双引号改为反引号,启用模板字符串插值 return `${greeting}, ${name}!`; } } // 测试用例运行结果 // new Greeter().greet() => "Hello, Anonymous!" // new Greeter("What's up", "Dog").greet() => "What's up, Dog!" // new Greeter("Hola").greet() => "Hola, Anonymous!"
内容的提问来源于stack exchange,提问作者al feratovic
相关产品推荐
相关产品推荐

