马黑黑 发表于 2022-3-29 13:09

反单引号:让JS字符拼接更优雅

本帖最后由 马黑黑 于 2022-3-29 13:14 编辑

优雅之外,也更方便。我们一写 table 标签为例,我们知道,它是由一系列的父标签和子标签组成。比如下面的2*2表格代码:

<table>
    <tr>
      <td>行一 : 单元格一</td>
      <td>行一 : 单元格二</td>
    </tr>
    <tr>
      <td>行一 : 单元格一</td>
      <td>行一 : 单元格二</td>
    </tr>

</table>

用 HTML 写表格自然没啥问题,但多数情况下,我们需要用表格加载庞大的数据,这时候用 JS 写表格很省事,但有个问题,传统的字符串拼接方式,代码会令人眼花缭乱,一系列的加号带着一大堆的单引号、双引号,不太好区分哪个对哪个,tr、td写得不对称也是常用的是。为此,表格和数据相对复杂的,还是用反单引号写表格及其数据更好。先看常规的字串拼接写法(假设我们已经有了一个二维数组 arr ,我们要写一个 arr.length*4的表格):

var tbCode = "<table class='tbcl'><tr>";
for(j=0; j<arr.length; j++) {
    tbCode += "<td>" + (j+1) + "</td><td>" + arr + "</td><td>" + arr + "</td><td>" + arr + "</td>";
}
tbCode += "</tr></table>";

看得出来,循环语句内的拼接单元格的语句,长且不说,主要是拼接方法不易阅读,不方便查错。改用反单引号来写字串拼接,情况大不相同:

var tbCode = `<table class='tbcl'><tr>`;
for(j=0; j<arr.length; j++) {
    tbCode += `
      <td>${j+1}</td>
      <td>${arr}</td>
      <td>${arr}</td>
      <td>${arr}</td>`;
}
tbCode += `</tr></table>`;

这里,循环体内外的字串拼接,我们都用了反单引号,这是允许的。反单引号里面的字串,可以随意按语法规范使用单引号、双引号,最主要的,其一:字符串可以和变量、算式放在一起,方法是变量和算式用 ${变量或算式} 这样的语句格式,其前后都可以有字符串;其二:拼接的字串可以分行写,令所拼接的字串群能够一目了然。

这几个优点,便是这种字串拼接的写法的优雅与方便所在。

马黑黑 发表于 2022-3-29 13:15

我又不记得在论坛里,字母 i 放在中括号里有特殊意义(斜体)。现在改为 j 了。

马黑黑 发表于 2022-3-29 13:30

<style>
        .tbcl {
                margin: auto;
                border: 1px solid #696969;
                width: 760px;
                border-collapse: collapse;
                box-shadow: 2px 2px 4px #999;
        }
        .tbcl td, .tbcl th { padding: 4px; border:1px solid #696969; font: 16px Sans-serif; }
        .tbcl th { padding: 6px 0;background:#696969; color:white; font-weight:bold; text-align:center; }
</style>
</head>
<body>



<script language="javascript">

var clAr = [
        ['LightPink', '浅粉红', '#FFB6C1 ', '255,182,193'],
        ['Pink', '粉红', '#FFC0CB ', '255,192,203'],
        ['Crimson', '猩红', '#DC143C ', '220,20,60'],
        ['LavenderBlush', '脸红的淡紫色', '#FFF0F5 ', '255,240,245'],
        ['PaleVioletred', '苍白的紫罗兰红色', '#DB7093 ', '219,112,147'],
        ['HotPink', '热情的粉红', '#FF69B4 ', '255,105,180'],
        ['DeepPink', '深粉色', '#FF1493 ', '255,20,147'],
        ['MediumVioletred', '适中的紫罗兰红色', '#C71585 ', '199,21,133'],
        ['Orchid', '兰花的紫色', '#DA70D6 ', '218,112,214'],
        ['Thistle', '蓟', '#D8BFD8 ', '216,191,216'],
        ['plum', '李子', '#DDA0DD ', '221,160,221'],
        ['Violet', '紫罗兰', '#EE82EE ', '238,130,238'],
        ['Magenta', '洋红', '#FF00FF ', '255,0,255'],
        ['Fuchsia', '灯笼海棠(紫红色)', '#FF00FF ', '255,0,255'],
        ['DarkMagenta', '深洋红色', '#8B008B ', '139,0,139'],
        ['Purple', '紫色', '#800080 ', '128,0,128'],
        ['MediumOrchid', '适中的兰花紫', '#BA55D3 ', '186,85,211'],
        ['DarkVoilet', '深紫罗兰色', '#9400D3 ', '148,0,211'],
        ['DarkOrchid', '深兰花紫', '#9932CC ', '153,50,204'],
        ['Indigo', '靛青', '#4B0082 ', '75,0,130'],
        ['BlueViolet', '深紫罗兰的蓝色', '#8A2BE2 ', '138,43,226'],
        ['MediumPurple', '适中的紫色', '#9370DB ', '147,112,219'],
        ['MediumSlateBlue', '适中的板岩暗蓝灰色', '#7B68EE ', '123,104,238'],
        ['SlateBlue', '板岩暗蓝灰色', '#6A5ACD ', '106,90,205'],
        ['DarkSlateBlue', '深岩暗蓝灰色', '#483D8B ', '72,61,139'],
        ['Lavender', '熏衣草花的淡紫色', '#E6E6FA ', '230,230,250'],
        ['GhostWhite', '幽灵的白色', '#F8F8FF ', '248,248,255'],
        ['Blue', '纯蓝', '#0000FF ', '0,0,255'],
        ['MediumBlue', '适中的蓝色', '#0000CD ', '0,0,205'],
        ['MidnightBlue', '午夜的蓝色', '#191970 ', '25,25,112'],
        ['DarkBlue', '深蓝色', '#00008B ', '0,0,139'],
        ['Navy', '海军蓝', '#000080 ', '0,0,128'],
        ['RoyalBlue', '皇军蓝', '#4169E1 ', '65,105,225'],
        ['CornflowerBlue', '矢车菊的蓝色', '#6495ED ', '100,149,237'],
        ['LightSteelBlue', '淡钢蓝', '#B0C4DE ', '176,196,222'],
        ['LightSlateGray', '浅石板灰', '#778899 ', '119,136,153'],
        ['SlateGray', '石板灰', '#708090 ', '112,128,144'],
        ['DoderBlue', '道奇蓝', '#1E90FF ', '30,144,255'],
        ['AliceBlue', '爱丽丝蓝', '#F0F8FF ', '240,248,255'],
        ['SteelBlue', '钢蓝', '#4682B4 ', '70,130,180'],
        ['LightSkyBlue', '淡蓝色', '#87CEFA ', '135,206,250'],
        ['SkyBlue', '天蓝色', '#87CEEB ', '135,206,235'],
        ['DeepSkyBlue', '深天蓝', '#00BFFF ', '0,191,255'],
        ['LightBLue', '淡蓝', '#ADD8E6 ', '173,216,230'],
        ['PowDerBlue', '火药蓝', '#B0E0E6 ', '176,224,230'],
        ['CadetBlue', '军校蓝', '#5F9EA0 ', '95,158,160'],
        ['Azure', '蔚蓝色', '#F0FFFF ', '240,255,255'],
        ['LightCyan', '淡青色', '#E1FFFF ', '225,255,255'],
        ['PaleTurquoise', '苍白的绿宝石', '#AFEEEE ', '175,238,238'],
        ['Cyan', '青色', '#00FFFF ', '0,255,255'],
        ['Aqua', '水绿色', '#00FFFF ', '0,255,255'],
        ['DarkTurquoise', '深绿宝石', '#00CED1 ', '0,206,209'],
        ['DarkSlateGray', '深石板灰', '#2F4F4F ', '47,79,79'],
        ['DarkCyan', '深青色', '#008B8B ', '0,139,139'],
        ['Teal', '水鸭色', '#008080 ', '0,128,128'],
        ['MediumTurquoise', '适中的绿宝石', '#48D1CC ', '72,209,204'],
        ['LightSeaGreen', '浅海洋绿', '#20B2AA ', '32,178,170'],
        ['Turquoise', '绿宝石', '#40E0D0 ', '64,224,208'],
        ['Auqamarin', '绿玉\碧绿色', '#7FFFAA ', '127,255,170'],
        ['MediumAquamarine', '适中的碧绿色', '#00FA9A ', '0,250,154'],
        ['MediumSpringGreen', '适中的春天的绿色', '#F5FFFA ', '245,255,250'],
        ['MintCream', '薄荷奶油', '#00FF7F ', '0,255,127'],
        ['SpringGreen', '春天的绿色', '#3CB371 ', '60,179,113'],
        ['SeaGreen', '海洋绿', '#2E8B57 ', '46,139,87'],
        ['Honeydew', '蜂蜜', '#F0FFF0 ', '240,255,240'],
        ['LightGreen', '淡绿色', '#90EE90 ', '144,238,144'],
        ['PaleGreen', '苍白的绿色', '#98FB98 ', '152,251,152'],
        ['DarkSeaGreen', '深海洋绿', '#8FBC8F ', '143,188,143'],
        ['LimeGreen', '酸橙绿', '#32CD32 ', '50,205,50'],
        ['Lime', '酸橙色', '#00FF00 ', '0,255,0'],
        ['ForestGreen', '森林绿', '#228B22 ', '34,139,34'],
        ['Green', '纯绿', '#008000 ', '0,128,0'],
        ['DarkGreen', '深绿色', '#006400 ', '0,100,0'],
        ['Chartreuse', '查特酒绿', '#7FFF00 ', '127,255,0'],
        ['LawnGreen', '草坪绿', '#7CFC00 ', '124,252,0'],
        ['GreenYellow', '绿黄色', '#ADFF2F ', '173,255,47'],
        ['OliveDrab', '橄榄土褐色', '#556B2F ', '85,107,47'],
        ['Beige', '米色(浅褐色)', '#6B8E23 ', '107,142,35'],
        ['LightGoldenrodYellow', '浅秋麒麟黄', '#FAFAD2 ', '250,250,210'],
        ['Ivory', '象牙', '#FFFFF0 ', '255,255,240'],
        ['LightYellow', '浅黄色', '#FFFFE0 ', '255,255,224'],
        ['Yellow', '纯黄', '#FFFF00 ', '255,255,0'],
        ['Olive', '橄榄', '#808000 ', '128,128,0'],
        ['DarkKhaki', '深卡其布', '#BDB76B ', '189,183,107'],
        ['LemonChiffon', '柠檬薄纱', '#FFFACD ', '255,250,205'],
        ['PaleGodenrod', '灰秋麒麟', '#EEE8AA ', '238,232,170'],
        ['Khaki', '卡其布', '#F0E68C ', '240,230,140'],
        ['Gold', '金', '#FFD700 ', '255,215,0'],
        ['Cornislk', '玉米色', '#FFF8DC ', '255,248,220'],
        ['GoldEnrod', '秋麒麟', '#DAA520 ', '218,165,32'],
        ['FloralWhite', '花的白色', '#FFFAF0 ', '255,250,240'],
        ['OldLace', '老饰带', '#FDF5E6 ', '253,245,230'],
        ['Wheat', '小麦色', '#F5DEB3 ', '245,222,179'],
        ['Moccasin', '鹿皮鞋', '#FFE4B5 ', '255,228,181'],
        ['Orange', '橙色', '#FFA500 ', '255,165,0'],
        ['PapayaWhip', '番木瓜', '#FFEFD5 ', '255,239,213'],
        ['BlanchedAlmond', '漂白的杏仁', '#FFEBCD ', '255,235,205'],
        ['NavajoWhite', 'Navajo白', '#FFDEAD ', '255,222,173'],
        ['AntiqueWhite', '古代的白色', '#FAEBD7 ', '250,235,215'],
        ['Tan', '晒黑', '#D2B48C ', '210,180,140'],
        ['BrulyWood', '结实的树', '#DEB887 ', '222,184,135'],
        ['Bisque', '(浓汤)乳脂,番茄等', '#FFE4C4 ', '255,228,196'],
        ['DarkOrange', '深橙色', '#FF8C00 ', '255,140,0'],
        ['Linen', '亚麻布', '#FAF0E6 ', '250,240,230'],
        ['Peru', '秘鲁', '#CD853F ', '205,133,63'],
        ['PeachPuff', '桃色', '#FFDAB9 ', '255,218,185'],
        ['SandyBrown', '沙棕色', '#F4A460 ', '244,164,96'],
        ['Chocolate', '巧克力', '#D2691E ', '210,105,30'],
        ['SaddleBrown', '马鞍棕色', '#8B4513 ', '139,69,19'],
        ['SeaShell', '海贝壳', '#FFF5EE ', '255,245,238'],
        ['Sienna', '黄土赭色', '#A0522D ', '160,82,45'],
        ['LightSalmon', '浅鲜肉(鲑鱼)色', '#FFA07A ', '255,160,122'],
        ['Coral', '珊瑚', '#FF7F50 ', '255,127,80'],
        ['OrangeRed', '橙红色', '#FF4500 ', '255,69,0'],
        ['DarkSalmon', '深鲜肉(鲑鱼)色', '#E9967A ', '233,150,122'],
        ['Tomato', '番茄', '#FF6347 ', '255,99,71'],
        ['MistyRose', '薄雾玫瑰', '#FFE4E1 ', '255,228,225'],
        ['Salmon', '鲜肉(鲑鱼)色', '#FA8072 ', '250,128,114'],
        ['Snow', '雪', '#FFFAFA ', '255,250,250'],
        ['LightCoral', '淡珊瑚色', '#F08080 ', '240,128,128'],
        ['RosyBrown', '玫瑰棕色', '#BC8F8F ', '188,143,143'],
        ['IndianRed', '印度红', '#CD5C5C ', '205,92,92'],
        ['Red', '纯红', '#FF0000 ', '255,0,0'],
        ['Brown', '棕色', '#A52A2A ', '165,42,42'],
        ['FireBrick', '耐火砖', '#B22222 ', '178,34,34'],
        ['DarkRed', '深红色', '#8B0000 ', '139,0,0'],
        ['Maroon', '栗色', '#800000 ', '128,0,0'],
        ['White', '纯白', '#FFFFFF ', '255,255,255'],
        ['WhiteSmoke', '白烟', '#F5F5F5 ', '245,245,245'],
        ['Gainsboro', '淡灰色', '#DCDCDC ', '220,220,220'],
        ['LightGrey', '浅灰色', '#D3D3D3 ', '211,211,211'],
        ['Silver', '银白色', '#C0C0C0 ', '192,192,192'],
        ['DarkGray', '深灰色', '#A9A9A9 ', '169,169,169'],
        ['Gray', '灰色', '#808080 ', '128,128,128'],
        ['DimGray', '暗淡的灰色', '#696969 ', '105,105,105'],
        ['Black', '纯黑', '#000000 ', '0,0,0',]
];

var tbCode = `<table class='tbcl'><tr>
                <th style='width:40px;'>序号</th>
                <th style='width:120px;'>颜色</th>
                <th>英文名称</th>
                <th>中文名称</th>
                <th>HEX格式</th>
                <th>RGB格式</th>
        </tr>`;
for(i=0; i<clAr.length; i++) {
        tbCode += `<tr>
                <td style='text-align: center'>${i+1}</td>
                <td style='background: ${clAr}'></td>
                <td>${clAr}</td>
                <td>${clAr}</td>
                <td>${clAr}</td>
                <td>${clAr}</td>
        </tr>`;
}
tbCode += "</table>";
document.write(tbCode);

</script>

加林森 发表于 2022-3-29 13:57

看得很清晰,很工整的单元表格。{:4_199:}

红影 发表于 2022-3-29 16:02

这个真好,本来要不停地写td tr的,用循环语句,就可以只写内容了。而且“字符串可以和变量、算式放在一起”,若碰到需要运算的,这个更能发挥出强大作用{:4_199:}

红影 发表于 2022-3-29 16:05

反单引号可以换行的这个更好,能看得更清楚,否则像黑黑这个颜色代码一长串地写下去,自己都要看蒙了呢{:4_173:}

红影 发表于 2022-3-29 16:06

马黑黑 发表于 2022-3-29 13:15
我又不记得在论坛里,字母 i 放在中括号里有特殊意义(斜体)。现在改为 j 了。

黑黑辛苦了,感谢带来的美妙的知识{:4_187:}

马黑黑 发表于 2022-3-29 18:14

红影 发表于 2022-3-29 16:06
黑黑辛苦了,感谢带来的美妙的知识

共享共享

马黑黑 发表于 2022-3-29 18:14

红影 发表于 2022-3-29 16:05
反单引号可以换行的这个更好,能看得更清楚,否则像黑黑这个颜色代码一长串地写下去,自己都要看蒙了呢{:4_ ...

可不是吗

红影 发表于 2022-3-29 20:13

马黑黑 发表于 2022-3-29 18:14
共享共享

又去看了看那个颜色表,真挺不容易的,不仅要把符号内容展示出来,要要在第二列把底色调用出来。

红影 发表于 2022-3-29 20:14

马黑黑 发表于 2022-3-29 18:14
可不是吗

这个做表格真好{:4_187:}

马黑黑 发表于 2022-3-29 20:46

红影 发表于 2022-3-29 20:14
这个做表格真好

但我一直纳闷哈,论坛的表格怎么都不好控制

马黑黑 发表于 2022-3-29 20:47

红影 发表于 2022-3-29 20:13
又去看了看那个颜色表,真挺不容易的,不仅要把符号内容展示出来,要要在第二列把底色调用出来。

{:4_203:}

红影 发表于 2022-3-29 23:01

马黑黑 发表于 2022-3-29 20:46
但我一直纳闷哈,论坛的表格怎么都不好控制

就是你说的i用括号有其他含义的问题吧。

红影 发表于 2022-3-29 23:01

马黑黑 发表于 2022-3-29 20:47


{:4_187:}

马黑黑 发表于 2022-3-29 23:02

红影 发表于 2022-3-29 23:01
就是你说的i用括号有其他含义的问题吧。

不是。那个可以换其他的,是论坛自己用了大量的table标签,它对table做了很多预定义

红影 发表于 2022-3-30 09:34

马黑黑 发表于 2022-3-29 23:02
不是。那个可以换其他的,是论坛自己用了大量的table标签,它对table做了很多预定义

哦哦,如同埋了很多雷,编写代码的过程中还得小心避雷{:4_173:}

马黑黑 发表于 2022-3-30 12:12

红影 发表于 2022-3-30 09:34
哦哦,如同埋了很多雷,编写代码的过程中还得小心避雷

踩雷是常态

红影 发表于 2022-3-30 16:40

马黑黑 发表于 2022-3-30 12:12
踩雷是常态

踩得多了,就炸迷糊了{:4_189:}

马黑黑 发表于 2022-3-30 18:21

红影 发表于 2022-3-30 16:40
踩得多了,就炸迷糊了

{:5_147:}{:4_198:}
页: [1] 2 3
查看完整版本: 反单引号:让JS字符拼接更优雅