使用||合并第一个非空值

时间:2015-08-02 21:35:59

标签: javascript google-tag-manager

这是一个功能:

function() {

    // if on wordpress site decipher if English or Français by using url path
    var lang = '';  
    var wp_path = document.location.pathname.match(/^\/(en|fr)\//)[0];

        if (wp_path == "/en/") {
        lang = "Français";}
        else if (wp_path == "/fr/") {
        lang = "English"; 
        }

    // if on ruby site decipher if English or Français by using querySelector on element
    var ruby_lang = document.querySelector('.menu--primary a[href*="lang="]').textContent.trim();

    // either lang or ruby_lang will be null, assign value to opp_language accordingly
    var opp_language = lang || ruby_lang;

return opp_language;

}

在Chrome JS控制台中,如果我逐行输入,则可以正常工作:

E.g。在网址http://www.example.com/en/

var lang = '';  
        var wp_path = document.location.pathname.match(/^\/(en|fr)\//)[0];

            if (wp_path == "/en/") {
            lang = "Français";} // yes NOT English, it's opposite
            else if (wp_path == "/fr/") {
            lang = "English"; 
            }

按预期返回Français。

然后,当我在没有包含en或fr的url路径的页面上时,我知道变量“ruby_lang”将返回English或Français。我已经验证了该功能的第二部分可以在控制台中使用。

所以第三部分可能就是问题所在。我的期望是,在这一点上,lang或ruby_lang都设置为真值。所以:

// either lang or ruby_lang will be null, assign value to opp_language accordingly
        var opp_language = lang || ruby_lang;

但相反,每当我运行此功能时,opp_language都是未定义的。

双栏是否||语法的表现方式与我理解的不同?

2 个答案:

答案 0 :(得分:0)

如果在此行var opp_language = lang || ruby_lang;之后您的变量app_languageundefined,则表示langruby_lang评估为false。如果"合并系列中的所有值"如果计算结果为false,表达式将返回列表中的最后一个值。

如果你现在直接输入你的控制台var a = b || c bc undefined,然后登录a你会看到它确实是undefined

document.querySelector() ruby_language找不到某个元素时,nullundefinedundefined,如果您获得ActivityB,则很可能是String gender = getIntent().getStringExtra("gender");

因此,基本上要确保您的变量已初始化并且默认值不会被评估为false,我猜。

答案 1 :(得分:0)

我得到了这个工作,但我真的不明白。我使用过以前从未使用过的try和catch。根据我的理解,如果变量无法设置,那么它们只会是假的吗?

无论如何,这有效:

function() {

    // if on wordpress site decipher if English or Français by using url path
    var lang = '';  

  try {
    var wp_path = document.location.pathname.match(/^\/(en|fr)\//)[0];

        if (wp_path == "/en/") {
        lang = "Français";}
        else if (wp_path == "/fr/") {
        lang = "English"; 
        }
  } catch (e) {
    lang = false;
  }


  // if on ruby site decipher if English or Français by using querySelector on element

  try {
  var ruby_lang = document.querySelector('.menu--primary a[href*="lang="]').textContent.trim();
  }
  catch (e) {
    var ruby_lang = false;
  }

    // either lang or ruby_lang will be null, assign value to opp_language accordingly
    var opp_language = lang || ruby_lang;

return opp_language;

}