有没有正确的方法来发现js中的非致命错误?

时间:2016-04-21 02:39:41

标签: javascript debugging d3.js chromium

我是调试js的新手。这是我和js一起玩的第一周,我通过D3.js学习它。我有几年'蟒蛇的娱乐体验。

我在这里将值d传递给了anon函数。想象一下d == [55, 601]

circles.attr({
    cx: function(d) { return xScale(d[0]) },
    cy: function(d) { return yScale(d[1]) },
    r: function(d) { return rScale( d[1] ) },
    fill: function(d) { return colorScale(d) }  <<<< Attention here.
    });

Javascript没有返回任何错误。圆圈使用正确的cxcy以及r值进行渲染,但使用fill="#NaNNaNNaN"。然而,chrome调试工具给了我:

> colorScale(500)
< "#7d0082"

当我在python中执行此操作时,我得到:

TypeError: input expected at most 1 arguments, got 2

回到js,经过1.5小时的调试后,我发现将parseInt(d)传递给该函数是有效的。但那不是答案。这就是答案:

    fill: function(d) { return colorScale(d[0]) }  <<<< Fixed.

我的问题:

  • 代码运行并没有给我一个错误。这种行为是来自javascript,D3还是铬网络工具?
  • 这种错误会在任何地方引发错误消息吗?

1 个答案:

答案 0 :(得分:2)

  

代码运行并没有给我一个错误。这种行为是来自javascript,D3还是铬网络工具?

它是javascript(实际上是ECMAScript,它是底层编程语言)。

  

这种错误会在任何地方引发错误消息吗?

这取决于。例如,如果函数需要一个数组但是得到一个原语并尝试使用数组方法,那么你就会得到一个错误,例如。

&#13;
&#13;
// @param {Array} arr
// @returns arr
function foo(arr) {
  arr.push('bar');
  return arr;
}

// Call with an array
document.write(foo([]))  // bar 

// Call with a primitive instead
document.write('<br>' + foo(6))  // In console: Uncaught TypeError: arr.push is not a function
&#13;
&#13;
&#13;

但是如果你只是试图访问一个命名属性,没有。由于ECMAScript有助于将值强制转换为适合该操作的类型,因此在:

var x = 3;
alert(x.length); // undefined

原始值会立即强制转换为对象以获取其 length 属性。由于它没有,因此返回 undefined 。尝试:

alert(x.toString); // function() { [native code] }

&#34;工作&#34;因为Numbers具有从 Number.prototype 继承的 toString 方法。