函数将使用固定值,但不适用于生成它的变量

function will work with a fixed value but not with the variable that produces it

我有这个功能:

function rgbtohex(val) {
  var clean = val.replace(/[^0-9\.,]/g, "");
  var colors = clean.split(',');
  var r = colors[0];
  var g = colors[1];
  var b = colors[2];

  return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}

console.log(rgbtohex('rgb(64, 128, 128)')); //should output #408080, instead it outputs #1004288128

它应该将 rgb 转换为十六进制,如下所示:

rgbtohex('rgb(64, 128, 128)') //should output #408080, instead it outputs #1004288128

但它输出了错误的值。分解后我发现如果 var b 等于固定值(在本例中为 128)而不是变量,它将使用给定值。像这样:

 var r = colors[0];
 var g = colors[1];
 var b = 128;

这是为什么?

Fiddle 这里:https://jsfiddle.net/kr2bmaxp/2/

您的 colors 数组是字符串数组,请尝试将其转换为数字:

function rgbtohex(val) {
 var clean = val.replace(/[^0-9\.,]/g, "");
 var colors = clean.split(',').map(Number);
 var r = colors[0];
 var g = colors[1];
 var b = colors[2];
 
  return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
} 

console.log(rgbtohex('rgb(64, 128, 128)')) //should output #408080, instead it outputs #1004288128

请注意,使用解构语法可以稍微减少代码:

let [r, g, b] = clean.split(',').map(Number);
// delete the individual r, g, b assignments