使用“=”测试相等性时“if”语句的意外行为[关闭]

Posted

技术标签:

【中文标题】使用“=”测试相等性时“if”语句的意外行为[关闭]【英文标题】:Unexpected Behavior of "if" statement when using "=" to test for equality [closed] 【发布时间】:2015-02-18 19:11:58 【问题描述】:

我有以下 javascript 代码,用于将页面的 <div> 中包含的代码替换为另一个页面的一部分:

    function ReplaceContentInContainer(etiqueta) 
        var container = document.getElementById('contenedor');
        if (etiqueta="esTransportista") 
            container.innerhtml = document.getElementById('transportista').innerHTML;
         else if (etiqueta="esCargador") 
            container.innerHTML = document.getElementById('cargador').innerHTML;
        

    

然后我使用以下代码从页面调用它:

<input type='radio' name='esTransportista' id='esTransportista' value='1' onclick="javascript:ReplaceContentInContainer(esTransportista);">Es transportista <br />
<input type='radio' name='esTransportista' id='esCargador' value='0' onclick="javascript:ReplaceContentInContainer(esCargador);" checked>Es cargador <br />

最后,我的页面中有三个&lt;div&gt;'s,一个用于显示信息&lt; div id='contenedor'&gt;&lt; /div&gt;,另外两个包含要在我提到的id='contenedor' 中显示的代码(它们是&lt;div id='transportista'&gt;bla bla bla&lt; /div&gt; 和@ 987654328@)。

我面临的问题是 JavaScript 代码似乎只运行一次。它会在我第一次选中其中一个单选按钮时更改“竞争者”的内容,但如果我选中另一个单选按钮,JavaScript 将不再工作。

有什么方法可以让 JavaScript 代码在我每次点击任何单选按钮时都能正常工作?

我一直在谷歌上搜索,我浏览的大部分结果都是关于 jQuery 和绑定到消失的元素,但据我所知,这不是我的情况......

【问题讨论】:

【参考方案1】:

只是快速扫描您的代码,发现您的 if (etiqueta="esTransportista") 语句不正确。 比较两个对象时,您需要 ==

试试

  function ReplaceContentInContainer(etiqueta) 
        var container = document.getElementById('contenedor');
        if (etiqueta=="esTransportista") 
            container.innerHTML = document.getElementById('transportista').innerHTML;
         else if (etiqueta=="esCargador") 
            container.innerHTML = document.getElementById('cargador').innerHTML;
        

    

【讨论】:

=== 优于 == @JLRishe – 这真的取决于上下文。对于那些想知道的人,=== 调用是依赖于类型的 exact 匹配,而 == 是非依赖于类型的 soft 匹配。 'true' == true 返回 true'true' === true 返回 false。 @JoshBurgess 不,这并不取决于上下文。 == 的行为怪异且难以预测,普遍的智慧是永远不要使用它 (***.com/a/359509/1945651)。仅供参考,'true' == true 评估为false。明白我所说的难以预测是什么意思了吗? 有点旁注,但这个答案不完整。【参考方案2】:

您的 javascript 有一个小错误:

function ReplaceContentInContainer(etiqueta) 
        var container = document.getElementById('contenedor');
        if (etiqueta == "esTransportista") 
            container.innerHTML = document.getElementById('transportista').innerHTML;
         else if (etiqueta == "esCargador") 
            container.innerHTML = document.getElementById('cargador').innerHTML;
        
    

请注意 if 语句中的 etiqueta = "esTransportista"。这将使其将“esTransportista”保存到 etiqueta,并将进入 if 语句的那部分。

通过将= 更改为==,您可以比较它是否为真。

编辑

您还应该更改 onclick="..." 部分以将名称放在单引号中:

onclick="javascript:ReplaceContentInContainer('esTransportista');"
onclick="javascript:ReplaceContentInContainer('esCargador');" 

这可确保 javascript 不会查找具有这些名称的变量并且知道您正在传递字符串。

【讨论】:

这个答案不完整。【参考方案3】:

有两件事会阻止您的代码正常工作:

您将未定义的变量而不是字符串传递给函数 您正在使用=,而您应该使用===

您在点击处理程序中使用的 JavaScript 表达式是这样的:

ReplaceContentInContainer(esTransportista);

这里,esTransportista 是一个变量引用,但是由于您没有具有该名称的变量,所以值 undefined 将传递给您的函数。

在你的函数内部,etiqueta 的值是 undefined,但是当这个 if 语句执行时

if (etiqueta = "esTransportista") 
    container.innerHTML = document.getElementById('transportista').innerHTML;

赋值运算符= 将值"esTransportista" 分配给etiqueta,然后将该值传递给if 语句。 "esTransportista" 是“真实的”,因此 if 块的主体将始终运行。


为了让您的代码按预期工作,
    将字符串值传递给您的函数,而不是未定义的变量:
ReplaceContentInContainer("esTransportista")  // note the quotes here    
ReplaceContentInContainer("esCargador")  // note the quotes here    
    使用=== 运算符将变量与值进行比较:
if (etiqueta === "esTransportista") 
    container.innerHTML = document.getElementById('transportista').innerHTML;
 else if (etiqueta === "esCargador") 
    container.innerHTML = document.getElementById('cargador').innerHTML;

jsfiddle


作为一项额外的(尽管是可选的)改进。我建议在你的代码中设置你的点击处理程序,而不是把它们放在你的 HTML 中。这样做的一种方法(不要太花哨)如下所示:
window.onload = function () 
    document.getElementById("esTransportista").onclick = function () 
        ReplaceContentInContainer("esTransportista");
    ;

    document.getElementById("esCargador").onclick = function () 
        ReplaceContentInContainer("esCargador"); 
    ;
;

如果您将其放入代码中,您可以删除单选按钮上的 onclick 属性并将它们保留为:

<input type='radio' name='esTransportista' id='esTransportista' value='1'>Es transportista
<br />
<input type='radio' name='esTransportista' id='esCargador' value='0' checked>Es cargador
<br />

jsfiddle

【讨论】:

以上是关于使用“=”测试相等性时“if”语句的意外行为[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何创建在检​​查相等性时忽略某些键的自定义无序映射比较器?

if语句

第五章-if语句

python随笔4(if语句)

意外的分叉行为

阿波罗链接重试400错误的意外行为[关闭]