Вы можете попробовать этот код. Я нашел его раньше, когда у меня возникла проблема, похожая на вашу.
if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
$Q1mrks = $_GET['q1mrks'];
$marks = $_GET['marks'];
$qt1 = $_GET['qt1'];
$qtype_qry = mysql_query("
SELECT *
FROM s_questiontypes
WHERE quetype_id = '$qt1'
");
$row = mysql_fetch_assoc($qtype_qry);
$qcode = $row['quetype_code'];
$sq_qry = "
SELECT *
FROM s_question
WHERE quetype_code = '$qcode'
ORDER BY RAND() LIMIT $Q1mrks
";
$sq_qry = mysql_query("
SELECT *
FROM s_question
WHERE quetype_code = '$qcode'
LIMIT $Q1mrks
");
while ($qrow = mysql_fetch_array($sq_qry)) {
$qm = $qrow['marks'] . "<br />";
$total += $qm . "<br />";
}
echo $total . "/" . $marks;
}
В принципе, логический оператор И (&&
) вернет значение второго операнда, если первый - правy , и он вернет значение первого операнда, если оно сам falsy , например:
true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything"; // 0
Обратите внимание, что значения falsy - это те, которые принуждают к false
при использовании в булевом контексте, они null
, undefined
, 0
, NaN
, пустая строка и, конечно, false
, что-то еще прилегает к true
.
Согласно Аннотированный раздел 11.11 ECMAScript 5.1 :
В случае логического оператора OR (||),
expr1 || expr2 Возвращает expr1, если он может быть преобразован в true; в противном случае возвращает expr2. Таким образом, при использовании с булевыми значениями || возвращает true, если оба операнда истинны; если оба значения false, возвращает false.
blockquote>В данном примере
var oneOrTheOther = someOtherVar || «Это не дроиды, которые вы ищете ... двигаться вперед»;
Результатом будет значение someOtherVar, если логическое значение (someOtherVar) истинно. (См. Truthiness of выражение ). Если это неверно, результатом будет «это не дроиды, которые вы ищете ... двигаться вперед»;
И в случае логического оператора AND (& amp;),
Возвращает expr1, если его можно преобразовать в false; в противном случае возвращает expr2. Таким образом, при использовании с булевыми значениями & amp; & amp; возвращает true, если оба операнда истинны; в противном случае возвращает false.
blockquote>В данном примере,
case 1: когда Boolean (someOtherVar) является false: он возвращает значение someOtherVar.
case 2: когда Boolean (someOtherVar) истинно: он возвращает «это не дроиды, которые вы ищете ... двигаться вперед».
Цитирование Douglas Crockford 1:
Оператор
blockquote>&&
создает значение своего первого операнда, если первый операнд является ложным. В противном случае он выдает значение второго операнда.
1 Дуглас Крокфорд: JavaScript: Хорошие детали - Страница 16
Я видел & amp; & amp; чрезмерное использование здесь при работе для операторов присваивания. Конкуренция двоякая: 1) Проверка индикатора иногда является функцией с накладными расходами, которые разработчики не учитывают. 2) Разработчики просто видят в нем проверку безопасности и не считают, что они присваивают ложные значения их var. Мне нравится, что у них есть тип безопасного типа, поэтому я их изменяю:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();
:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;
, поэтому они получают целое число, как ожидалось.
Если вы пытаетесь получить доступ к «user.name», но тогда это происходит:
Uncaught TypeError: Cannot read property 'name' of undefined
Не бойтесь. Вы можете решить это, используя & amp; & amp; оператор в задании или часто называемый сторожевым оператором, так как он «защищает» от неопределенной ошибки.
Вот несколько примеров, которые вы можете найти нечетными, но продолжайте читать, как объясняется позже.
var user = undefined;
var username = user && user.username;
// no error, "username" assigned value of "user" which is undefined
user = { username: 'Johnny' };
username = user && user.username;
// no error, "username" assigned 'Johnny'
user = { };
username = user && user.username;
// no error, "username" assigned value of "username" which is undefined
Объяснение: В режиме охраны каждый термин оценивается слева направо по одному. Если оцениваемое значение является ложным, оценка останавливается и это значение затем назначается. Если последний элемент достигнут, тогда ему присваивается, является ли он ложным.
ложь означает, что это любое из этих значений undefined, false, 0, null, NaN, ''
, а правда просто означает НЕ ложь.
Легкая кнопка для метода Guard
Используйте прекрасный защитный оператор lodash для доступа к вложенным данным следующим образом:
// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');
, поскольку он обрабатывает & amp; & amp; & amp; & amp; материал под капотом, будучи приятным в использовании удобным способом. Исходный код Lodash _.get
Другим полезным странным назначением, которое в практическом использовании, является оператор OR, который обычно используется для таких плагинов:
this.myWidget = this.myWidget || (function() {
// define widget
})();
, который будет назначать только часть кода, если «this.myWidget» является ложным. Это удобно, потому что вы можете объявлять код в любом месте и несколько раз, не заботясь о том, был ли он назначен или нет ранее, зная, что он будет назначен только один раз, поскольку люди, использующие плагин, могут несколько раз объявлять ваш скриптовый тег src несколько раз.
Объяснение: Каждое значение оценивается слева направо, по одному за раз. Если значение является правдивым, оно прекращает оценку и присваивает это значение, в противном случае продолжает движение, если последний элемент достигнут, он присваивается независимо от того, является ли он ложным или нет.
Теперь у вас есть максимальная сила и вы можете делать очень странные вещи, такие как этот очень странный пример использования его в палиндроме.
function palindrome(s,i) {
return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i);
}
Подробное объяснение здесь: Проверка палиндрома в Javascript
Счастливое кодирование.
&&
иногда называют оператором guard .
variable = indicator && value
его можно использовать, чтобы установить значение, только если индикатор правдоподобен.