2016-04-21 32 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

相關問題