Javascript if-else条件中的Switch语句,未到达else
这是我编写的用于解析车辆VIN号信息的条件语句的缩写版本。如果我传入一个VIN,如JA3xxxxxxxxxxxx,它将返回并使用region:'Asia';的属性进行对象;,国家:'日本';制作:'五十铃';但如果我将其传递给2A5xxxxxxxxxxxx,我会期望一个属性设置为region的对象:'North America',国家:'加拿大';制造:'克莱斯勒';相反,我得到了一个region属性设置为'Asia'的对象,就是它。是一个JSFIDLE,代码如下所示Javascript if-else条件中的Switch语句,未到达else,javascript,if-statement,switch-statement,Javascript,If Statement,Switch Statement,这是我编写的用于解析车辆VIN号信息的条件语句的缩写版本。如果我传入一个VIN,如JA3xxxxxxxxxxxx,它将返回并使用region:'Asia';的属性进行对象;,国家:'日本';制作:'五十铃';但如果我将其传递给2A5xxxxxxxxxxxx,我会期望一个属性设置为region的对象:'North America',国家:'加拿大';制造:'克莱斯勒';相反,我得到了一个region属性设置为'Asia'的对象,就是它。是一个JSFIDLE,代码如下所示 var vehicle =
var vehicle = {},
nthDigit = function (stringifiedVin, i) {
var nthChar = stringifiedVin.charAt(i);
return nthChar;
},
parseVin = function () {
var i = 0;
for (i = 0; i < 16; i += 1) {
if (i === 0) {
if (nthDigit(stringifiedVin, 0) === 'J' || 'K' || 'L' || 'M' || 'N' || 'P' || 'R') {
vehicle.region = 'Asia';
switch (nthDigit(stringifiedVin, i)) {
case 'J':
vehicle.country = 'Japan';
switch (nthDigit(stringifiedVin, 1)) {
case 'A':
if (nthDigit(stringifiedVin, 2) === 'A' || 'B' || 'C' || 'D' || 'E' || 'F' || 'G' || 'H' || 'J' || 'K' || 'L' || 'M' || 'N' || 'P' || 'R' || 'S' || 'T' || 'U' || 'V' || 'W' || 'X' || 'Y' || 'Z') {
vehicle.make = 'Isuzu';
} else if (nthDigit(stringifiedVin, 2) === '3' || '4' || '5' || '6' || '7') {
vehicle.make = 'Mitsubishi';
} else {
vehicle.make = 'Not Read';
}
break;
}
break;
}
} else if (nthDigit(stringifiedVin, 0) === '1' || '2' || '3' || '4' || '5') {
vehicle.region = 'North America';
if (nthDigit(stringifiedVin, 0) === '2') {
vehicle.country = "Canada";
switch (nthDigit(stringifiedVin, 1)) {
case 'A':
if (nthDigit(stringifiedVin, 2) === '2' || '3' || '4' || '5' || '6' || '7' || '8') {
vehicle.make = 'Chrysler';
} else {
vehicle.make = 'Not Read';
}
break;
}
break;
}
}
return vehicle;
}
}
}
var vehicle={},
N位=功能(stringifiedVin,i){
var nthChar=stringifiedVin.charAt(i);
返回nthChar;
},
parseVin=函数(){
var i=0;
对于(i=0;i<16;i+=1){
如果(i==0){
如果(N位数(stringifiedVin,0)=='J'| | | K'| | | L'| | | M'| | | N'| | | P'| | | R'){
vehicle.region=‘亚洲’;
开关(第N位(stringifiedVin,i)){
案例“J”:
vehicle.country=‘日本’;
开关(第N位(stringifiedVin,1)){
案例“A”:
如果(第三数字(即stri化了的第五个数字)的数字(即字符串化了的第三个数字,2)如果(第三数字(即第三数字)的数字(即第三数字)如果(第三数字(即第三数字)如果(第三数字)的数字(即即第三数字)如果,2)2)的=====A”A”A”A”A”A”A”如果如果(包括包括数字数字(即即即即即即即即即即即即即即即即即即即即即即如果(第三数字数字数字数字数字数字(即即即即即即即即即即即如果(即即即即即即如果如果(第三数字数字,2)如果,2)如果,2)2)如果(如果(如果(第三数字数字数字数字数字数字数字数字数字(即即即即即即即即即第三)如果,2)如果,2 2)如果(如果(第三)如果)如果(第三数字数字数字数字数字数字(| |“X”| |“Y”| |“Z”){
vehicle.make=‘五十铃’;
}else if(n位数(stringifiedVin,2)==“3”| |“4”| |“5”| |“6”| |“7”){
vehicle.make=‘三菱’;
}否则{
vehicle.make=‘未读取’;
}
打破
}
打破
}
}else if(n位数(stringifiedVin,0)==“1”| |“2”| |“3”| |“4”| |“5”){
vehicle.region=‘北美’;
如果(第n位(stringifiedVin,0)=“2”){
vehicle.country=“加拿大”;
开关(第N位(stringifiedVin,1)){
案例“A”:
如果(n位数(stringifiedVin,2)==“2”| |“3”| |“4”| |“5”| |“6”| |“7”| |“8”){
vehicle.make=‘克莱斯勒’;
}否则{
vehicle.make=‘未读取’;
}
打破
}
打破
}
}
返回车辆;
}
}
}
我不认为| |部分的工作方式与你想象的不同。这将运行警报(),因为“2”不是false:
if ('A' === '1' || '2')
alert('match')
我会使用一个开关,否则你将不得不像这样拼写它:
var nd = nthDigit(stringifiedVin, 0);
if (nd === 'J' || nd === 'K' || nd === 'L' || ...
短一点的:
if("JKLMNP".indexOf(nthDigit(stringifiedVin, 0)) > -1){
//....
}
@JBrooks我认为关于双管道或运算符如何在条件语句中造成问题的说法是正确的。我认为这是由于运算符处理falsy值的方式,如SO post中所示。当我意识到JA3xxxxxxxxxxxx应该返回三菱而不是五十铃时,我最终完全摆脱了if语句。我在设置多个案例时使用@KennyTM answer找到了解决方案