HTML5 data- *属性types转换string和数字
为什么data-value="2.0"
的值被强制转换为String,而data-value="2.5"
强制转换为Number? 我可以在我的function内处理这个罚款。 我只是想更多地了解Javascript如何处理数字和string。 这种情况让我措手不及。
<a data-value="2.0">2.0</a> <a data-value="2.5">2.5</a>
$("a").click(function() { alert(typeof $(this).data( "value")); });
[小提琴]
这些值是简单的string香草的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>
通过jQuery的源代码,我已经确定了原因。
它会将其parsing为一个数字,并且只有这样做才能改变string。 资料来源: https : //github.com/jquery/jquery/blob/master/src/data.js#L36
(+"2.0") + "" === "2" // !== the original string (+"2.1") + "" === "2.1" // == the original string
默认情况下,从一个属性parsing的任何东西都是一个string,如果你需要把它作为一个数字,你将需要把它转换成一个数字。 我已经能够处理这个最好的方法是用数字函数(native javascript)包装它,
var number = Number($(this).data("value"));
parseInt将返回一个整数(整数),所以如果你想保留你的小数值,你将需要使用数字。 用parseInt注意,如果你想parsing一个int,parseInt($(this).data(“value”),10);
正如tymeJV提到的,这看起来像jquery如何处理自动转换问题。 如果你使用“2”,它也给出了一个数字,所以我猜测它只是一个奇怪的边缘情况下如何处理的事情。 我鼓励使用.attr('xxx')并将数据parsing为已知types。
它似乎正在治疗的数字像一个string“.0”的扩展。
如果所有的数据值都将以这种格式进入,只需在这些吸盘上parseFloat()
:
$("a").click(function() { alert(typeof parseFloat($(this).data( "value"))); });
这样,如果他们是string或数字,都不会有问题,他们将始终被视为数字(完整的小数)。
我认为这更多的是关于jQuery如何识别数字的问题。 如果你使用alert(typeof(this.getAttribute("data-value")));
,它吐出它是一个string两次(这是预期的)。 据我所知,html属性中的所有内容都被认为是一个string,只是不同的库可能有默认的行为来解释它们。
此外,一个简短的方法来获得一个数字将是沿线的东西…
var someNumber = +$(someElt).data("value");
如果返回的值是一个string,那么+会引起types强制,如果它已经是一个数字,则会使它独立。