三元运算符总是评估真实部分

时间:2011-09-30 10:21:34

标签: javascript ternary-operator

我有一个声明:

var sep = '  |  ';
var r = '';
for (var i = 0; i < menuItems.length; i++) {
    r += function(menuObject) {
    console.log(menuObject);
    console.log(
        '<a class="" href="' + 
        menuObject.url + '">' + menuObject.name + '</a>' + 
        (i < menuItems.length - 1) ? sep : ""); //logs the contents of sep
    ) //console.log expanded for readability
    }
}

为什么不记录完整字符串,而只评估sep

3 个答案:

答案 0 :(得分:2)

因为你没有在括号中包装你的if行,而是在它之前处理所有字符串作为条件。

试试这个......

var sep = '&nbsp;&nbsp;|&nbsp;&nbsp;';
        var r = '';
        for (var i=0;i<menuItems.length; i++) {
            r += function (menuObject) {
            console.log(menuObject);
            console.log(
                '<a class="" href="' + 
                menuObject.url + '">' + menuObject.name + '</a>'+ 
                ((i <menuItems.length-1 ) ? sep : "")); //logs the contents of sep
            }
       }

答案 1 :(得分:2)

问题是运营商优先。

console.log(
            ('<a class="" href="' + 
            menuObject.url + '">' + menuObject.name + '</a>'+ 
            (i <menuItems.length-1 )) ? sep : ""); 
正在执行

(请注意我添加的额外括号)。当使用三元运算符(它与if子句很少有关)时,你应该总是使用这里的括号:

console.log(
            '<a class="" href="' + 
            menuObject.url + '">' + menuObject.name + '</a>'+ 
            ((i <menuItems.length-1 ) ? sep : "")); 

答案 2 :(得分:0)

运营商优先权。将表达式放在括号中的?之前:

console.log(
        ('<a class="" href="' + 
        menuObject.url + '">' + menuObject.name + '</a>'+ 
        (i <menuItems.length-1 )) ? sep : "");
)