console.log 未解析 css 样式

console.log not parsing css styling

我想让 console.log 中的文本以一系列彩虹色显示。问题是控制台似乎没有解析样式。相反,当我在控制台中尝试 rainbowify(myString); 时,它输出的是文字字符串。我已经尝试过 toString() 但没有用。

奇怪的是,如果我复制并粘贴输出并将其放入控制台日志(在控制台中),它就可以正常工作。我需要了解为什么它不解析 css 样式,而只是将其作为字符串输出。

var myString = "abcdefghijklmnopqrstuvwxyz";
var rainbow = ["red", "yellow", "pink", "green", "purple", "orange", "blue"];

function rainbowify(string) {
  var splitString = string.split("");
  var stringConCat = "";
  var stringCss = "";
  for (var i = 0, j = 0; i < splitString.length; i++, j++) {
    stringConCat += "\"%c" + splitString[i] + "\"" + " + ";
    stringCss += "\"color : " + rainbow[j] + "\"" + ", ";
    if (j === rainbow.length - 1) {
      j = 0;
    }
  }
  var stringSliced = stringConCat.slice(0, -3);
  var cssSliced = stringCss.slice(0, -2);
  console.log(stringSliced + ", " + cssSliced);
}

您正在生成一个包含一堆 JavaScript 的字符串。当您将该字符串复制并粘贴到您的控制台(不带引号)时,将评估 JavaScript。当您将该字符串直接传递给 console.log 时,将输出字符串本身。

您正在生成这样的字符串:

"\"%ca\" + \"%cb\", \"color : red\", \"color : green\""

当您 console.log 结果时,您使用单个字符串参数调用 log,它记录给定的字符串:

 console.log("\"%ca\" + \"%cb\", \"color : red\", \"color : green\"");

正确的调用将是三个个参数:

 console.log("%ca%cb", "color : red", "color : green")

与其输出包含一堆 + 连接和逗号分隔参数的字符串,不如生成一个参数数组并使用 apply 调用 console.log:

["%ca%cb", "color : red", "color : green"]

var rainbow = ["red", "yellow", "pink", "green", "purple", "orange", "blue"];

function rainbowify(string) {
  var splitString = string.split("");
  var formatString = "";
  var colorArguments = [];

  for (var i = 0; i < splitString.length; ++i) {
    formatString += "%c" + splitString[i];
    colorArguments.push("color : " + rainbow[i % rainbow.length]);
  }

  return [formatString].concat(colorArguments);
}


// output the array
console.log(rainbowify("test string"));

// Invoke console.log with the array as its arguments
console.log.apply(console, rainbowify("test string"));

请注意,Whosebug 的伪控制台不支持颜色。上面片段的实际输出呈现如下:

使用 .reduce().map() 的函数的简化实现。

var myString = "abcdefghijklmnopqrstuvwxyz";
var rainbow = ["red", "yellow", "pink", "green", "purple", "orange", "blue"];

function rainbowify(string) {
  var strArr = string.split("");
  var logs = [strArr.reduce((result, char) => result.concat("%c" + char + " "), "")];
    
  var logsWithColors = logs.concat(strArr.map((char, i) => {
    return "color: " + rainbow[i % rainbow.length] + ";"
  }));

  console.log.apply(console, logsWithColors);
}

rainbowify(myString);

在浏览器的控制台中生成以下内容: