switch语句中使用解构赋值出现‘变量未初始化’及变量不可达错误
问题描述
运行以下代码时,始终提示变量d未初始化,且title、age等变量不可达:
let chosen = 3; let myFriends = [ { title: "Osama", age: 39, available: false, skills: ["HTML", "CSS"] }, { title: "Ahmed", age: 25, available: false, skills: ["Python", "Django"] }, { title: "Sayed", age: 33, available: true, skills: ["PHP", "Laravel"] }, ]; switch (chosen) { case 1: let [d]=myFriends; let {title,age,available,skills:[,skill]}=d; console.log(title); console.log(age); console.log(available?"available":"notAvailable"); console.log(skill); break; case 2: [,d,]=myFriends; ({title,age,available,skills:[,skill]}=d); console.log(title); console.log(age); console.log(available?"available":"notAvailable"); console.log(skill); break; case 3: [,,d]=myFriends; ({title,age,available,skills:[,skill]}=d); console.log(title); console.log(age); console.log(available?"available":"notAvailable"); console.log(skill); break; }
问题原因
- 作用域共享冲突:switch的所有case块共享同一个作用域,
case 1中用let声明的d、title等变量,会导致其他case块无法重复声明同名变量,进而引发未初始化或不可达的错误。 - 变量未提前声明:
case 2和case 3中直接使用d但未用let/const声明,不符合JS变量声明规则;同时非声明式的解构赋值(如({...}=d))要求变量已提前声明,否则会抛出错误。
解决方案
有两种可行的修复方式:
方式一:给每个case块添加独立作用域(推荐)
用{}包裹每个case的代码,让每个case拥有独立作用域,彻底避免变量冲突:
let chosen = 3; let myFriends = [ { title: "Osama", age: 39, available: false, skills: ["HTML", "CSS"] }, { title: "Ahmed", age: 25, available: false, skills: ["Python", "Django"] }, { title: "Sayed", age: 33, available: true, skills: ["PHP", "Laravel"] }, ]; switch (chosen) { case 1: { let [d] = myFriends; let { title, age, available, skills: [, skill] } = d; console.log(title); console.log(age); console.log(available ? "available" : "notAvailable"); console.log(skill); break; } case 2: { let [, d] = myFriends; let { title, age, available, skills: [, skill] } = d; console.log(title); console.log(age); console.log(available ? "available" : "notAvailable"); console.log(skill); break; } case 3: { let [,, d] = myFriends; let { title, age, available, skills: [, skill] } = d; console.log(title); console.log(age); console.log(available ? "available" : "notAvailable"); console.log(skill); break; } }
方式二:提前声明所有需要的变量
在switch外部统一声明d、title等变量,确保所有case块都能合法使用:
let chosen = 3; let myFriends = [ { title: "Osama", age: 39, available: false, skills: ["HTML", "CSS"] }, { title: "Ahmed", age: 25, available: false, skills: ["Python", "Django"] }, { title: "Sayed", age: 33, available: true, skills: ["PHP", "Laravel"] }, ]; let d, title, age, available, skill; // 提前声明所有变量 switch (chosen) { case 1: [d] = myFriends; ({ title, age, available, skills: [, skill] } = d); console.log(title); console.log(age); console.log(available ? "available" : "notAvailable"); console.log(skill); break; case 2: [, d] = myFriends; ({ title, age, available, skills: [, skill] } = d); console.log(title); console.log(age); console.log(available ? "available" : "notAvailable"); console.log(skill); break; case 3: [,, d] = myFriends; ({ title, age, available, skills: [, skill] } = d); console.log(title); console.log(age); console.log(available ? "available" : "notAvailable"); console.log(skill); break; }
内容的提问来源于stack exchange,提问作者TAREK KOTB
相关产品推荐
相关产品推荐

