代码之家  ›  专栏  ›  技术社区  ›  Cain Nuke

函数将使用固定值,但不使用产生该值的变量

  •  0
  • Cain Nuke  · 技术社区  · 3 年前

    我有这个功能:

    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;
    

    为什么?

    在这里拉小提琴: https://jsfiddle.net/kr2bmaxp/2/

    1 回复  |  直到 3 年前
        1
  •  1
  •   James    3 年前

    你的 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