2016-04-21 39 views
3

我是新来调试js。这是我第一周和js一起玩,我正在通过D3.js学习它。我有几年的蟒蛇娱乐体验。有没有正确的方法来发现js中的非致命错误?

我在这里通过了一项价值d来不久又功能。想象一下,例如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没有返回任何错误。圆圈,用正确的cxcyr值,但fill="#NaNNaNNaN"呈现。然而,铬调试工具递给我:

> colorScale(500) 
< "#7d0082" 

当我这样做是蟒蛇,我得到:

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

欢迎使用JavaScript!这个错误很典型。不管声明如何,JavaScript函数都可以用任意数量的参数调用。 – Pointy

+0

@Pointy更不用说任何类型。尽管JS通常会尽职地试图强制将所通过的论点强制为必要的类型。 (取决于函数中发生了什么) –

+0

另外,因为参数没有类型(虽然值是这样),所以你不能指定* d *必须是数组,所以调试器不能指出数组是预计在不通过时不会抛出。但**你**可以检查是否需要(例如使用[* Array.isArray *](http://www.ecma-international.org/ecma-262/6.0/#sec-array.isarray))。但是类型检查是令人疲惫的,所以大多数程序都是围绕它进行编程的(例如传递单独的原始值,而不是数组值)。 – RobG

回答

2

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

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

请问这种错误的任何地方产生错误消息?

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

// @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

但是如果你只是尝试访问命名的属性,没有。由于ECMAScript的有益胁迫值的类型适合于操作,则在:

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

原始值被强制到物体上,可以看到其长度属性。因为它没有一个,未定义返回。尝试:

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

其 “作品”,因为数字具有Number.prototype继承了的toString方法

+0

感谢@RobG这是非常有帮助的。 – meh

相关问题