HTML5 data- * тип и тип атрибутов

Почему значение data-value="2.0" передается в String и значение data-value="2.5", переданное в число? Я могу справиться с этим в своей функции. Я просто пытаюсь понять немного больше о том, как Javascript обрабатывает номера и строки. Этот вид заставил меня остерегаться.

<a data-value="2.0">2.0</a>
<a data-value="2.5">2.5</a>
$("a").click(function() {
    alert(typeof $(this).data( "value"));   
});

[Fiddle With It]

Ответ 1

Эти значения - это просто строки для ванильного javascript; он не пытается самостоятельно конвертировать.

[...document.querySelectorAll("a")].forEach(a =>
    console.log("type: %s, value: %o", 
                typeof a.dataset.value, 
                a.dataset.value)
);
<a data-value="2.0">2.0</a>
<a data-value="2.5">2.5</a>

Ответ 2

Просматривая исходный код jQuery, я определил причину.

Он будет анализировать его как число, если и только если, то это не изменит строку. Источник: https://github.com/jquery/jquery/blob/master/src/data.js#L36

(+"2.0") + "" === "2" // !== the original string
(+"2.1") + "" === "2.1" // == the original string

Ответ 3

По умолчанию все, что анализируется из атрибута, будет строкой, вам нужно будет преобразовать его в число, если вам нужно использовать его как число. Лучший способ, которым я смог справиться с этим, - это обернуть его функцией Number (собственный javascript)

var number = Number($(this).data("value"));
parseInt вернет целое число (целое число), поэтому, если вы хотите сохранить десятичные значения, вам нужно будет использовать Number. Слово предостережения с parseInt, всегда лучше указать базу, если вы хотите разобрать int,   parseInt ($ (this).data( "value" ), 10); Дел >

Ответ 4

Кажется, что обрабатывает расширение ".0" числа как строку.

Если все ваши значения данных будут поступать в этом формате, просто взломайте parseFloat() на этих присосках следующим образом:

$("a").click(function() {
    alert(typeof parseFloat($(this).data( "value")));   
});

Таким образом, не имеет значения, являются ли они строками или числами, они всегда будут обрабатываться как числа (целые десятичные числа).

Ответ 5

Как упоминалось в tymeJV, это выглядит как проблема с тем, как jquery обрабатывает автоконверсию. Если вы используете "2", он также дает номер, поэтому я предполагаю, что он просто странный крайний случай в том, как они обрабатывают вещи. Я бы посоветовал просто использовать .attr('xxx') и разобрать ваши данные по известному типу.

Ответ 6

Я думаю, что это больше вопрос о том, как jquery идентифицирует числа. Если вы используете alert(typeof(this.getAttribute("data-value")));, он выскальзывает, что это строка как раз (что ожидается). Насколько я знаю, все в атрибуте html считается строкой, только разные библиотеки могут иметь поведение по умолчанию, которое интерпретирует их по-разному.

Кроме того, сокращенный способ получить число будет чем-то вроде строк...

var someNumber = +$(someElt).data("value");

+ приведет к принуждению типа, если возвращаемое значение является строкой или оставить его в покое, если оно уже является числом.