为什么在||中没有以下值?条件设定?

时间:2016-05-03 05:55:26

标签: javascript conditional

以下函数根据浏览器中设置的语言设置框架的语言:

util.setLang = (lang) => {
  console.log(lang)
  let selectedLang = ''
  const english = 'en' || 'en-US' || 'en-UK'
  const chinese = 'zh' || 'zh-TW' || 'zh-CN'
  if (lang === english) selectedLang = 'en'
  if (lang === chinese) selectedLang = 'zh'
  Vue.config.lang = selectedLang
}

console.log(lang)记录' zh'。有用。 selectedLang设置为' zh'。当console.log(lang)记录' zh-Tw' selectedLang它设置为空字符串。

为什么会这样?

3 个答案:

答案 0 :(得分:3)

const english = 'en' || 'en-US' || 'en-UK'
const chinese = 'zh' || 'zh-TW' || 'zh-CN'

直接评估

const english = 'en'
const chinese = 'zh'

,下一行取决于lang

的值
if (lang === english) selectedLang = 'en'
if (lang === chinese) selectedLang = 'zh'

虽然englishchinese只有一个值,但比较会将此单个值与其竞争,但不会与所有三个值竞争。

更好地使用

const english = ['en', 'en-US', 'en-UK']
const chinese = ['zh', 'zh-TW', 'zh-CN']

使用indexOf方法的数组,并使用

if (english.indexOf(lang) !== -1) selectedLang = 'en'
if (chinese.indexOf(lang) !== -1) selectedLang = 'zh'

答案 1 :(得分:2)

  

为什么在||中没有以下值?条件正在设定?

因为当你说

const chinese = 'zh' || 'zh-TW' || 'zh-CN'

只有chinese为真,才会将zh设置为Boolean('zh')

它不会超过此链中的 zh

如果您想确保中文选择应该是'zh', 'zh-TW', 'zh-CN'之一,那么请将其设为

util.setLang = (lang) => {
  console.log(lang)
  let selectedLang = ''
  const english = ['en','en-US','en-UK'];
  const chinese = ['zh','zh-TW','zh-CN'];
  if ( english.indexOf(selectedLang) != -1 ) selectedLang = 'en'
  if ( chinese.indexOf(selectedLang) != -1 ) selectedLang = 'zh'
  Vue.config.lang = selectedLang
}

更通用的解决方案可能是

var constLanguages = [
  ['en','en-US','en-UK'],
  ['zh','zh-TW','zh-CN']
];
selectedLang = constLanguages.filter(function(val){
  return val.indexOf(selectedLang) != -1;
})[0]; 

这将确保如果其中一个项目在数组中匹配,则其第一个项目将成为selectedLang

答案 2 :(得分:0)

多数民众赞成是因为字符串 “a”|| “B” 总是等于“a”。

你应该在条件中使用or运算符而不是字符串中的:

if(lang =='a'|| lang =='b')