Функция JavaScript утверждать


Мне нужно сравнить несколько значений объект JavaScript. Если они не могут быть идентичными, я хочу довольно напечатать в консоли.журнал несоответствия.

В исходный код я написал , что я нахожу уродец после украсить на JS выглядит так:

function assert(a, b, message) {
if (a != b) {
    console.log("Failed to match " + message + " " + a + " != " + b);
    return false;
}
return true;
}


    if (!assert(parsedInput.protocol, cu.protocol, "protocol")) {
        continue;
    }
    if (!assert(parsedInput.port, cu.port, "port")) {
        continue;
    }
    if (!assert(parsedInput.hostname, cu.hostname, "hostname")) {
        continue;
    }
    if (!assert(parsedInput.hash, cu.hash, "hash")) {
        continue;
    }

Скажите, пожалуйста, я пропустил сюжет, и я мог бы много написать лучше. Не стесняйтесь критиковать остальной код. Спасибо!



8464
2
задан 26 октября 2011 в 10:10 Источник Поделиться
Комментарии
2 ответа

Я (и многие другие люди) ожидают определенного поведения от функции под названием "утверждать"...а именно, что он выдает исключение, или в противном случае выполнение привалы если заявленные условия не соответствует действительности. Если ваша функция утверждать, разве, что, вы не должны проверить возвращаемое значение.

function assertEqual(a, b, message)
{
if (a != b) throw new Error(message + " mismatch: " + a + " != " + b);
}

assertEqual(parsedInput.protocol, cu.protocol, "protocol");
assertEqual(parsedInput.port, cu.port, "port");
assertEqual(parsedInput.hostname, cu.hostname, "hostname");
assertEqual(parsedInput.hash, cu.hash, "hash");

Если это не то, что вы хотите, то вы должны серьезно рассмотреть вопрос о переименовании свои функции. Может проверить или что-то, я не знаю. Утверждения умереть, когда они ложны.


Теперь, что касается ваших тестов равенства, вы могли бы сделать что-то подобное

function propsEqual(obj1, obj2, propNames) {
var result = true;
for (var i = 0; i < propNames.length; ++i) {
var prop = propNames[i];
if (obj1[prop] != obj2[prop]) {
console.log("Failed to match " + prop +": " + obj1[prop] + " != " + obj2[prop]);
result = false;
}
}
return result;
}

if (!propsEqual(parsedInput, cu, ["protocol", "port", "hostname", "hash"])) {
console.log("Skipping.");
continue;
}

Преимущества этого подхода, вы получаете возможность увидеть все, что не совпадает, а не останавливаться на первой вещи.

7
ответ дан 27 октября 2011 в 01:10 Источник Поделиться

Вы могли бы написать это как:

function safeLog(s) {
if (window.console && window.console.log) {
console.log(s);
}
}

function assert(a, b, message) {
if (a != b) {
safeLog("Failed to match " + message + " " + a + " != " + b);
return false;
}
return true;
}

if (!assert(parsedInput.protocol, cu.protocol, "protocol") ||
!assert(parsedInput.port, cu.port, "port") ||
!assert(parsedInput.hostname, cu.hostname, "hostname") ||
!assert(parsedInput.hash, cu.hash, "hash")) {
continue;
}

Это будет конденсироваться сравнения в логическом выражении и защитит от дел в IE, где консоли.журнала не существует.

1
ответ дан 27 октября 2011 в 12:10 Источник Поделиться