js中,数组 减 数组 是如何算的?

codewars中一个优质的代码,代码功能:对给定的字符串排序。字符串中的每个单词都包含一个数字。这个数字是单词在结果中的位置。
输入--> 输出样例:
"is2 Thi1s T4est 3a" --> "Thi1s is2 3a T4est"
"4of Fo1r pe6ople g3ood th5e the2" --> "Fo1r the2 g3ood 4of th5e pe6ople"

function order(words){
  
  return words.split(' ').sort(function(a, b){
      return a.match(/\d/) - b.match(/\d/);
   }).join(' ');
}  

请问下,a.match(/d/)返回的是一个数组,类似:["4", index: 0, input: "4a", groups: undefined] 这样,为什么 a.match(/d/) - b.match(/d/)可以相减?请问下这里的两个数组相减是如何执行的?

阅读 3.7k
3 个回答

在处理操作符时,程序会做隐式的类型转换。

// 模拟数组
const a = ["4"];
a.index = 0;
a.input = "4a"

// 模拟数组
const b = ["5"];
b.index = 0;
b.input = "5bbbb";

const c = b - a;

match得到的数组,本质上元素的个数=1,所以你可以理解成是一位数组的加减,["5"] - ["4"],接着做(隐式)类型转换,["5"].toString() - ["4"].toString()得到"5" - "4",即两个字符串的操作。

减法操作中,程序会默认隐式转换字符串成数字,即5 - 4 = 1

加法操作中,只要有非数字的,都会当成字符串拼接,即"5" + "4" = "54"

搜了一圈没搜到相关的官方说明

我就自测了一下, 当数组长度为1的时候,会在四则运算时可以将其转化成数组包含的字符类型,即

[1] + [5] // '1' + '5'
// 15

所以 a.match(/\d/)匹配出字符串中出现的数字
"is2 Thi1s T4est 3a"为例,
第一次sort时

return a.match(/\d/) - b.match(/\d/);
// 其他无关属性,暂时忽略 ->
return ['2'] - ['1']
// ->
return 2 - 1 // return 1

因为return > 0,所以把Thi1s 放到is2前面

同理,进行相似处理.
最后join
就得出来结果。

这个其实就是数字相减,因为匹配出了数字(最先匹配的)会返回一个结果数组(只有一个元素,如果没有匹配,返回null,注意没有负数的,也没有多位数字——只支持1个数字),然后隐式类型转换成了数字(因为第一个字符是可以转换成数字的,null会转换成0)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题