【问题标题】:Javascript, string concatenation without ternary operatorJavascript,没有三元运算符的字符串连接
【发布时间】:2019-01-09 10:07:13
【问题描述】:

通常我用这个:

myVar = "myString is" + 1 === 1 ? " really true" : " false, I think";

也许我只需要真实的部分,比如说:

myVar = "myString is" + 1 === 1 ? " really true" : "";

我不喜欢这部分:: "" 因为没用。

有没有办法使用类似下面的东西?

myVar = "myString is" + 1 === 1 && " really true";

它可以工作,但是当它为 false 时会出现问题,因为它写 "false"!

【问题讨论】:

  • "myString is" + 1 === 1 && " really true" 被评估为((("myString is" + 1) === 1) && (" really true"))"myString is" + 1"myString is1",不等于 1
  • 是的,将 1 === 1 && " really true" 括在括号 () 中,就像我在答案中显示的那样,但仍会写类似 myString is false 的东西,我不知道它是否可以接受不管你是不是。
  • @ionizer 他很清楚(实际上是粗体字)写 false 是个问题。
  • 就我个人而言,我认为带有“不必要”"" 的三元组是要走的路。
  • 我同意@MarkMeyer。如果需要内联,添加隐式布尔转换和比较不会比三元更干净

标签: javascript string performance ecmascript-6 ecmascript-5


【解决方案1】:

你总是可以使用一个很好的旧 if 语句

var myVar = 'myString is';
if (1===1){myVar+=' really true';}

我认为这比单行布尔测试更具可读性

【讨论】:

  • 我需要内联。
  • @Fred Hors 那么是理论游戏还是编程问题?我不想拖钓,我想了解问题的大致情况。
【解决方案2】:

为了务实,最好的模式和写这个的最好方法是依赖一个助手:

myVar = "我的字符串是"+myHelper(...myParams);

然后在帮助器中,我们将有一个完全符合此目的并且非常可读的案例/开关。

【讨论】:

    【解决方案3】:

    你可以使用||

    myVar = (1 === 1 && "myString is really true") || "";
    

    【讨论】:

    • 这似乎并不比原来的三元更好(而且差一点)。
    • @MarkMeyer 只是好奇。以什么方式?
    • OP 想要将某些内容连接到原始字符串。当条件为假时,这会将myVar 设置为“”。
    • 例如我需要它用于 css 类。我有一个“btn w-100”,然后是所有的 JavaScript 逻辑,如果是真的。
    【解决方案4】:

    1 === 1 && " really true" 包裹在括号() 内并添加|| '' 如下所示(也包裹在括号中),或者可以使用模板文字来节省您输入+s 的时间

    let myString = "myString is" + ((1 === 1 && " really true") || '');
    let myFalseString = "myString is" + ((1 === 0 && " really true") || '');
    let onlyFalse = "myString is" + 1 === 1 && " really true";
    let myTL = `myString is ${(1 === 1 && "really true") || ''}`;
    
    console.log('My String:', myString);
    console.log('False String:', myFalseString);
    console.log('Only false:', onlyFalse);
    console.log('My Template Literal:', myTL);

    看起来比拥有额外的: "" 更糟糕,所以我仍然建议这样做:

    myVar = "myString is" + 1 === 1 ? " really true" : "";
    

    【讨论】:

    • 这仍然会在错误测试的情况下将false写入字符串,OP指出并且不希望
    • 更新了答案,不再写false,除了为演示提供的onlyFalse。不过太老套了。
    【解决方案5】:

    实现这样的事情的另一种方法是使用数组,如果它们不为假,则连接这些值。并不是说它比添加: '' 更短,但据我所知,没有办法摆脱: ''

    console.log( ["my string is", 1 === 1 && "really true"].filter(Boolean).join(" ") );
    console.log( ["my string is", 1 === 2 && "really true"].filter(Boolean).join(" ") );

    我可能会坚持使用: '' 或编写一个看起来像这样的辅助函数。

    function concat(){
      let str = "";
      for(let s of arguments){
        str += s ? s : '';
      }
      return str;
    }
    
    console.log( concat("my string is", 1 === 1 && "really true") );
    console.log( concat("my string is", 1 === 2 && "really true") );

    【讨论】:

      【解决方案6】:

      分析三元运算符我们得出结论是这样的:

      // Example: 1 === 1 ? ' is really true' : ''
      if (1 === 1) {
          return ' is really true';
      } else {
          return '';
      }
      

      所以解决方案是简单地从三元运算符中删除“else”,生成一个“二进制”。使用单独的 IF:

      if (1 === 1) {
          myVar += 'is really true';
      }
      

      使用内联逻辑运算符的最佳解决方案是三元运算符本身。将它的“假”部分作为空字符串“”不是问题。但是,如果您真的对此感到恼火,您可以创建一个函数并使用这样的模板文字:

      function myFunction(evaluation) {
          if (evaluation) {
              return ' really true';
          }
          return '';
      }
      
      let myVar = `My String is ${myFunction(1 === 1)}`;
      

      【讨论】:

      • 我可以内联使用它吗?
      猜你喜欢
      • 2020-07-23
      • 2016-05-03
      • 2015-06-09
      • 2010-11-21
      • 2013-09-21
      相关资源
      最近更新 更多