代码之家  ›  专栏  ›  技术社区  ›  Jay Jeong

这个加号有什么用?

  •  3
  • Jay Jeong  · 技术社区  · 6 年前

    我有一个简单的javascript语法问题。 我有下面的链接,它有一个代码片段,使用d3.js来呈现条形图。

    https://plnkr.co/edit/HQz1BL9SECFIsQ5bG8qb?p=preview
    

    我不明白的是…

    在script.js文件中,有一个语句,

     data.forEach(function(d) {
        d.date = parseDate(d.date);
        d.value = +d.value;
    });
    

    如果你像这样去掉d.value前面的加号,

      data.forEach(function(d) {
        d.date = parseDate(d.date);
        d.value = d.value;
    });
    

    如您所见,Y轴上的刻度值会发生变化。但据我所知,在一个值之前加上+意味着将任何值转换为数字类型。

    如果你看bar-data.csv文件中的数据,所有的值都是数字,所以我认为无论是否删除这个+都不应该改变…是吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Gerardo Furtado    6 年前

    “…如果您查看bar-data.csv文件中的数据,则所有值都有数字” …不,实际上它们不是加载/解析文件后的数字:它们是 是的。

    发生了什么事 d3.csv ,它使用 dsv.parse ,将所有字段加载为字符串。你可以在 API 以下内容:

    如果未指定行转换函数,则字段值为 是的。为了安全起见,不会自动转换为数字、日期或其他类型。(强调我的)

    我们可以很容易地展示出来。假设我们有这个csv,数字作为值:

    foo,bar
    17,34
    42,12
    

    由于堆栈片段不允许我们保存csv文件,我将使用 d3.csvParse 在这里而不是 d3.csv号 ,但结果是一样的。看看控制台:

    var csv = `foo,bar
    17,34
    42,12`;
    
    var data = d3.csvParse(csv);
    
    data.forEach(function(d) {
      for (key in d) {
        console.log(d[key] + ": " + typeof d[key])
      }
    })
    <script src="https://d3js.org/d3.v5.min.js"></script>

    现在让我们使用一元加号只转换 foo 列:

    var csv = `foo,bar
    17,34
    42,12`;
    
    var data = d3.csvParse(csv, row);
    
    data.forEach(function(d) {
      for (key in d) {
        console.log(d[key] + ": " + typeof d[key])
      }
    })
    
    function row(d) {
      d.foo = +d.foo;
      return d;
    }
    <script src=“https://d3 js.org/d3.v5.min.js”></脚本>

    PS:仅仅是为了解释你的Plurk中的行为,如果你移除了一元加:CSV中的更高的数字是478,它用于轴的域。但是,除去一元加,更高的值变为“53”,作为字符串,它比“478”高:

    console.log("53" > "478")