Конкатенация строк для неопределенной переменной с пробелом в JavaScript - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь отобразить имя, и мне трудно объединить неопределенные строки.

Я хочу отобразить displayName, если оно присутствует или объединить firstName и lastName, и отобразить его илиперейдите к defaultName, если его нет.

Если мои переменные присутствуют

let displayName = "John Doe";
let firstName = "Super";
let lastName = "Man";
let defaultName = "NIL";

console.log(displayName || firstName + " " + lastName || defaultName);

Output: John Doe 

Если переменные undefined

    let displayName = undefined;
    let firstName = undefined;
    let lastName = undefined;
    let defaultName = "NIL";
    
    console.log(displayName || firstName + " " + lastName || defaultName);
Output: undefined undefined

Работает при отсутствии whitespace, так как обрабатывает его как arithmetic operator, но на выходе будет SuperMan из-за отсутствия whitespace.

Как мне это решить?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Приколы в очереди про 'foo' + + 'foo'.

A ||B в javascript действительно означает «Если A правдиво, передайте A. В противном случае передайте B».И типы вне окна, Javascript будет пытаться объединить ошибки.Последний ключ в системе - странный порядок действий.

displayName || firstName   +  " "  + lastName  || defaultName
(displayName || firstName) + ((" " + lastName) || defaultName)
(        undefined       ) + (" undefined"     || defaultName)
         undefined         + " undefined"
"undefined undefined"

Если вы хотите сделать это правильно, у вас есть куча хороших альтернативных вариантов.Я бы сказал что-то вроде

function forceGoodString(input) {
    if (typeof input === "string" && input.length) {
        return input;
    }   else    {
        return "";
    }
}

... Я не совсем уверен, что вы ожидаете с тремя неопределенными переменными, «NIL» или просто «NIL»?В любом случае вам нужно еще несколько строк.Ничего плохого в удобочитаемости, не все должно быть причудливым ${garbage} и тройным вкладышем.

if (displayName) {
    console.log(displayName);
}   else if (firstName && lastName) {
    console.log(firstName + " " + lastName);
}   else    {
    console.log(defaultName);
}

И если вам когда-нибудь надоест свободные типы в JS, вы всегда можете научиться идти!

0 голосов
/ 04 декабря 2018

... соблюдайте приоритет оператора и используйте приведение типа , а также истинные и ложные значения ...

let displayName;
let firstName;
let lastName;
let defaultName = 'NIL';

console.log(
     displayName
  || ((firstName || '') + ' ' + (lastName || '')).trim()
  || defaultName
);

displayName = '';
firstName = 'John';

console.log(
     displayName
  || ((firstName || '') + ' ' + (lastName || '')).trim()
  || defaultName
);

displayName = '';
firstName = '';
lastName = 'Doe';

console.log(
     displayName
  || ((firstName || '') + ' ' + (lastName || '')).trim()
  || defaultName
);

displayName = '';
firstName = 'John';

console.log(
     displayName
  || ((firstName || '') + ' ' + (lastName || '')).trim()
  || defaultName
);

displayName = '';
firstName = '';
lastName = '';

console.log(
     displayName
  || ((firstName || '') + ' ' + (lastName || '')).trim()
  || defaultName
);
.as-console-wrapper { max-height: 100%!important; top: 0; }
0 голосов
/ 04 декабря 2018

Это предполагает, что только если firstName и lastName оба имеют значения, вы хотите, чтобы второй вариант отображался, в противном случае отображается defaultName

let displayName = undefined;
let firstName = undefined;
let lastName = undefined;
let defaultName = "NIL";
console.log(displayName ? displayName : firstName && lastName ? `${firstName} ${lastName}` : defaultName);

Ваш кодированный firstName + " " + lastName всегда будет возвращать значение, которое в JavaScript будет иметь значение true, что является причиной того, что вы видите в данный момент.

...