Я новичок в отладке 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 или хрома?
- Вызывает ли ошибка такого рода сообщение об ошибке?
Добро пожаловать в JavaScript! Ошибка довольно типична. Функции JavaScript, независимо от их объявления, могут вызываться с любым количеством параметров. – Pointy
@Pointy Не говоря уже о любом типе. Хотя JS обычно покорно пытается принудить переданный аргумент к нужному типу. (в зависимости от того, что происходит в функции) –
Кроме того, поскольку параметры не имеют типа (хотя значения имеют значение), вы не можете указать, что * d * должен быть массивом, поэтому отладчик не может сказать, что массив ожидаемый поэтому не может бросить, когда никто не прошел. Но ** вы ** можете проверить, хотите ли вы (например, с помощью [* Array.isArray *] (http://www.ecma-international.org/ecma-262/6.0/#sec-array.isarray)). Но проверка типов является утомительной, поэтому большинство программ вокруг нее (например, передают отдельные примитивные значения, а не массив значений). – RobG