Тернарный оператор всегда оценивает истинную часть - PullRequest
2 голосов
/ 30 сентября 2011

У меня есть утверждение:

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 ]

2 голосов
/ 30 сентября 2011

Поскольку вы не переносите строку 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
            }
       }
2 голосов
/ 30 сентября 2011

Проблема связана с приоритетом оператора.

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 : "")); 
0 голосов
/ 30 сентября 2011

Приоритет оператора.Поставьте выражение перед ? в скобках:

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