Лучший способ использования простого объявления функции или выражения - объявление функции стрелки не работает - PullRequest
0 голосов
/ 20 декабря 2018

Я создал простую функцию, которая проверяет, можно ли переставить 2 строки, чтобы они были идентичными - например:

// tests
canRearrange('teset','testy'); // false
canRearrange('teste','teset'); // true
canRearrange('tes','set'); // true

Для краткости я пытаюсь определить лучший, самый аккуратный и самый лаконичный способнаписания функции в разделе else.Я пробовал следующее:

// 1. requires var sameChars being defined first
var sameChars = ((c) => str1.includes(c) && str2.includes(c));
return str1.every(sameChars) && str2.every(sameChars);

// 2. works but is untidy
return str1.every(((c) => str1.includes(c) && str2.includes(c))) && str2.every(((c) => str1.includes(c) && str2.includes(c)));

// 3. fails presumably due to syntax error
return str1.every(sameChars) && str2.every(sameChars);
function sameChars((c) => str1.includes(c) && str2.includes(c));

Так что, по сути, я пытаюсь заставить № 3 (выше) работать, или посмотреть, есть ли лучший способ написать это.Предположительно, это все еще будет работать, если функция «sameChars» написана ниже основного кода - мой основной код (он работает) выглядит следующим образом:

function canRearrange(str1,str2) {

    str1 = str1.split(''), str2 = str2.split('');

    if (str1.length != str2.length) {
        throw "Bad Input";
    } else {
        return str1.every(sameChars) && str2.every(sameChars);
        function sameChars(c){
            return str1.includes(c) && str2.includes(c);
        }
    }
}

Есть ли у кого-нибудь какие-либо идеи о том, как это можно улучшить?Спасибо за любую помощь здесь.

1 Ответ

0 голосов
/ 04 января 2019
// 3. fails presumably due to syntax error
return str1.every(sameChars) && str2.every(sameChars);
function sameChars((c) => str1.includes(c) && str2.includes(c));

Строка, помеченная //3. fails presumably due to syntax error, фактически содержит синтаксическую ошибку, как показано в исполняемом фрагменте ниже.Как было отмечено в комментариях, вы смешиваете формат объявления функции и функции стрелки .Функция Arrow - это сокращенный синтаксис для выражения функции .Объявления функций поднимаются 1 , а выражения функций - нет, поэтому «основной код» работает с объявлением функции.

function canRearrange(str1,str2) {

    str1 = str1.split(''), str2 = str2.split('');

    if (str1.length != str2.length) {
        throw "Bad Input";
    } else {
        return str1.every(sameChars) && str2.every(sameChars);
        function sameChars((c) => str1.includes(c) && str2.includes(c));
    }
}
console.log(canRearrange('teset','testy')); // false
console.log(canRearrange('teste','teset')); // true
console.log(canRearrange('tes','set')); // true

Действительно ли важно иметь функцию, определенную над оператором return?Там не будет зависеть от подъема таким образом ...

function canRearrange(str1,str2) {
    str1 = str1.split(''), str2 = str2.split('');

    if (str1.length != str2.length) {
        throw "Bad Input";
    }
    const sameChars = c => str1.includes(c) && str2.includes(c); 
    return str1.every(sameChars) && str2.every(sameChars);
}
console.log(canRearrange('teset','testy')); // false
console.log(canRearrange('teste','teset')); // true
console.log(canRearrange('tes','set')); // true

Если вы не можете жить с первым вариантом, вы можете использовать формат объявления функции, но все в одной строке.Кто-то может поспорить, что таким образом он менее читабелен.

function canRearrange(str1,str2) {
    str1 = str1.split(''), str2 = str2.split('');

    if (str1.length != str2.length) {
        throw "Bad Input";
    }
    return str1.every(sameChars) && str2.every(sameChars);
    function sameChars(c) { return str1.includes(c) && str2.includes(c)}; 
}
console.log(canRearrange('teset','testy')); // false
console.log(canRearrange('teste','teset')); // true
console.log(canRearrange('tes','set')); // true

1 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function#Function_declaration_hoisting

...