【问题标题】:Spread operator for strings字符串的扩展运算符
【发布时间】:2018-06-16 20:06:11
【问题描述】:

我在MDN 上阅读了spread syntax,它可以用于数组和字符串:

扩展语法允许在需要零个或多个参数(用于函数调用)的地方扩展诸如 array 表达式或 string 之类的迭代 - mdn。

数组对我来说很清楚。它将元素扩展为单独的参数。
但是我没有找到字符串的例子。

那么,在函数调用中使用扩展语法扩展字符串的规则是什么?
字符串字符是否应该用空格分隔,因为我尝试了这个并打印了 3.

var x = "1 2 3";
console.log(Math.max(...x));

【问题讨论】:

  • 请注意,MDN 不是 JavaScript 规范。
  • 为什么不打印 3,max 对数字进行操作,所以它会尝试将每个传递的值转换为数字,然后进行比较。如果您想要一个示例,请尝试:console.log(..."test") 在控制台中,您将看到每个字母分别放置
  • 我真的不确定为什么许多当前答案没有直接回答实际问题:“在函数调用中使用扩展语法扩展字符串的规则是什么”,但是扩展运算符将简单地将字符串的每个字符转换为参数,例如:"1 2 3" 变为 "1", " ", "2", " ", "3"
  • 非常感谢@KhauriMcClai,这就是我要找的。​​span>
  • @KhauriMcClain 这不正是我回答的吗?

标签: javascript ecmascript-6 spread-syntax


【解决方案1】:

展开语法会产生 5 个元素,其中 2 个是空格字符:

const x = "1 2 3";
console.log([...x]);

//=> ["1", "", "2", "", "3"]

详细说明:

展开运算符的结果将是包含空格字符的["1", "", "2", "", "3"]

根据这个结果,Math.max() 将通过将非数字类型转换为数字来尝试找到数组中的最大数字,类似于运行 Number("1") 来转换 @ 987654324@ 转换为Number。空格字符转换为数字 0,类似于Number("") === 0

因此,您会得到以下数字列表:[ 1, 0, 2, 0, 3 ]Math.max() 将在其中选择 3 作为最大的数字。

【讨论】:

    【解决方案2】:

    空字符串上的 Math.max 计算结果类似于 +" "Number(" ") 因此 0

    let num = "1 2 3";
    
    console.log( Math.max(...num))  // ["1"," ","2"," ","3"] >>> [1,0,2,0,3] >>> 3

    因此,直接用数字传播字符串是不明智的,因为34 8 9 将最大为9
    始终由分隔符 num.split(" ") 预先分割。

    【讨论】:

      【解决方案3】:
      var x = "123";
      console.log(Math.max(...x));
      
      // prints 3
      

      ... 将字符串视为可迭代的,相当于一个字符映射到一个元素的数组。

      【讨论】:

        【解决方案4】:

        正如我们在下面看到的,您的示例实际上扩展到 5 个元素,其中 2 个是空格字符。您还可以在下面看到,字符串上的展开运算符似乎与使用 .split('') 相同。

        const x = "1 2 3";
        console.log([...x]);
        
        console.log(x.split(''));

        【讨论】:

        • 很好的答案,虽然在函数调用方面我会说console.log.apply(null, x.split(""))console.log(...x) 是等价的。您当前的示例在两种情况下都将在使用 apply 时记录一个数组,或者扩展语法将使用数组的每个元素作为函数的单独参数。 IE。 console.log([a, b, c])console.log(a, b, c) 的区别
        • [..."?‍❤️‍?"] 将创建一个包含 6 个项目的数组,而 "?‍❤️‍?".split("") 将创建一个包含 8 个项目的数组
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-18
        • 2017-12-20
        • 2016-09-20
        • 2020-04-13
        • 2018-07-29
        相关资源
        最近更新 更多