Javascript set/getAttribute比较仅适用于字符串?

Javascript set/getAttribute比较仅适用于字符串?,javascript,html,boolean,setattribute,getattribute,Javascript,Html,Boolean,Setattribute,Getattribute,我想根据是否访问了span节点的visted属性,将其设置为true或false test(); function test () { var el = document.createElement("span"); el.setAttribute("visited", false); el.setAttribute("visited", true); alert(el.getAttribute("visited") === true); //False

我想根据是否访问了
span
节点的
visted
属性,将其设置为
true
false

test();

function test () {

    var el = document.createElement("span");
    el.setAttribute("visited", false);

    el.setAttribute("visited", true);

    alert(el.getAttribute("visited") === true); //False
    alert(el.getAttribute("visited") === "true"); //True

}
我最初将属性“visted”设置为布尔值false,然后将布尔值设置为true。我注意到,当我检查属性是否为
true
时,它返回false,但如果我检查字符串
true
,它返回true

唯一需要讨论的是attributeName必须是字符串,而不是值。那么,为什么与布尔比较不起作用呢


这是因为
getAttribute
返回类型是string而不是bool

返回值:表示指定属性值的字符串

注意:如果属性不存在,则返回值为null或 空字符串(“”)


=
运算符同时检查值和类型(没有隐式强制类型)

由于
getAttribute
返回一个字符串值,因此当与字符串“true”进行比较时,该比较仅为
true
,而当与
true
的布尔值进行比较时,该比较不为空

换句话说,当使用
==
操作符时

true === 'true' // false
'true' === 'true' // true
true === true // true

以下是HTML标准定义的属性定义:

除非另有规定,否则上的属性可能具有 任何字符串值,包括空字符串。除非另有明确规定 如上所述,对此类文件中可以指定的文本没有任何限制 属性


因此,重复已经说过的,HTML属性总是字符串。

是的,
属性
总是字符串,但是
属性
可以是几种不同的类型。MSDN不是相关标准的规范性参考,W3C是:,.“may have”与“shall have”不同——您对“are alwasys strings”的解释不正确。另外,正如你所引用的,也有一些例外。我解释它的方式是,“may have”与“any”相关,而不是与类型相关,如第二句中进一步解释的那样。@FelixKling是的,但ochi的意思是“may have any string value”并不意味着“仅具有string value”。上面的文本说它可以有任何字符串值,但没有说属性必须是字符串。@Spencer:当然,但如果这不是隐含的,为什么要显式地调用“字符串值”?为什么没有提到数值或列表值等?@FelixKling有布尔属性之类的东西。说可以有任何字符串并不意味着只能有字符串。相反,这意味着在其他可能的值(如布尔值)中允许使用字符串值