2016-04-21 3 views
3

Я новичок в отладке js. Это моя первая неделя, играя с js, и я изучаю ее через D3.js. У меня есть многолетний рекреационный опыт работы с python.Есть ли правильный способ определения нефатальных ошибок в 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 не ответил ни одной ошибки. Круги отображались с правильными значениями cx и cy и r, но с fill="#NaNNaNNaN". Однако инструмент хром отладки дал мне:

> 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

Добро пожаловать в 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] } 

, какие "работает", потому что Числа имеют ToString метод, унаследованный от Number.prototype.

+0

Спасибо @RobG, это очень полезно. – meh

Смежные вопросы