将数组推入数组并使用它会抛出 NaN

Pushing array into array and using it throws NaN

我有一个名为 colorHM 的变量:

var colorHM = "50,50,74,255,100,255,4,3,50".

现在我在这里使用此代码段按照以下方案将其切割成碎片:R,g,b,R,g,b,R,g,b,然后再次切割成 var a = R,g,bvar b = R,g,b 等...

var firstColorHM = colorHM.split(",", 3);
firstColorHM = firstColorHM.toString();
var firstColorHMA = firstColorHM.split(",");
firstCMA.push(firstColorHMA[0]);
firstCMA.push(firstColorHMA[1]);
firstCMA.push(firstColorHMA[2]);

但是用它来计算 distance = eDist(firstCMA, firstCTA) 得到 NaN

function eDist (col1, col2) {
    var rmean = ((col1[0] + col2[0]) / 2);
    var dR = (col1[0] - col2[0]);
    var dG = (col1[1] - col2[1]);
    var dB = (col1[2] - col2[2]);

    return Math.sqrt((2 + (rmean / 256)) * Math.pow(dR, 2) + (4 * Math.pow(dG, 2)) + ( 2 + ((255- rmean) / 256)) * Math.pow(dB, 2));
}

使用 firstCMA.push(10); firstCMA.push(20); firstCMA.push(30); 而不是 firstCMA.push(firstColorHMA[0]);.. 使其再次工作。

变量firstCTA被省略,但解析方式相同。 我只是通过尝试从数组中调用不同的索引来检查数组是否正常工作。

为什么推送数字有用,但推送 firstColorHMA[0] 不行?

提前致谢!

正如评论所说,当你 split() 一个字符串时,生成的数组将包含字符串:

The split() method splits a String object into an array of strings by separating the string into substrings, using a specified separator string to determine where to make each split.

所以实际上数组 firstColorHMA 将数字保存为字符串,一个简单的解决方法是使用 unary plus 将数组项转换为数字,如下所示:

firstCMA.push(+firstColorHMA[0]);
firstCMA.push(+firstColorHMA[1]);
firstCMA.push(+firstColorHMA[2]);

或者,使用更明确的逻辑,例如:

firstCMA.push(Number(firstColorHMA[0]));
firstCMA.push(Number(firstColorHMA[1]));
firstCMA.push(Number(firstColorHMA[2]));