我可能会在这里犯一些javascript错误。
我使用以下(示例)代码将选项添加到下拉列表中:
sel = document.getElementById("emp-list");
<for loop> (
opt = document.createElement('option');
//add value to option also add a 'assiganble' data
var assign = true;
opt.setAttribute("data-assignable", assign);
sel.appendChild(opt);
)
现在,当用户选择一个选项时,我有一个首先检查“可分配”功能的功能。条件。
if ($("#emp-list option:selected").data('assignable')) {
} else {
}
在一台机器上按预期工作...它正确评估条件是否为布尔值true / false并继续执行其余代码。
然而,在第二台机器中,它总是执行“假”&#39;块!! 到目前为止,只有在第二台机器上工作的方法是使用以下if条件:
if ($("#emp-list option:selected").attr('data-assignable') === "true") {
} else {
}
(如果我不使用===&#34; true&#34;,真正的块总是被执行;偶数 - 虽然我期待.attr(&#39;数据可分配&#39;)如布尔值)
你能解释一下这种行为的原因吗?
答案 0 :(得分:0)
JavaScript中有一个名为Type coercion的概念。 类型强制意味着当运算符的操作数是不同的类型时,其中一个将被转换为&#34;等价的&#34;另一个操作数类型的值。
例如 整数==双 左边的整数值将被转换为double,然后比较两个值。
但是,如果使用===,则不会发生此类转换。当操作数具有不同类型时,此运算符返回false,并仅比较它们相同类型时的值。 查看更多 - http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html
答案 1 :(得分:0)
我可以从您的代码中看到默认情况下data-assignable
设置为true。因此,if或else块的执行取决于此数据属性的值
if($("#emp-list option:selected").data('assignable')){
} else {
}
您确定稍后在代码中正确更改了数据属性吗?我想知道当你试图在第二台机器上运行相同的代码时是否有任何控制台错误?
这是一个简单的jsfiddle,尝试在第8行var assign=true
运行代码,另一次运行var assign=false