Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   b && (<инстр>,<инстр>) (https://javascript.ru/forum/misc/24918-b-instr-instr.html)

pupena_san 18.01.2012 21:15

b && (<инстр>,<инстр>)
 
Извините за ламерский вопрос.
Есть такой кусок кода:

window.XMLHttpRequest ? b=new XMLHttpRequest:window.rb && (b=new ActiveXObject("MSXML2.XMLHTTP"));
b && (b.open("GET",a,!1),b.send(""));

1) в первой строчке я так понимаю возвращается объект XMLHttpRequest с типом в зависимости от браузера
2) b.open("GET",a,!1) и b.send("") мне тоже понятен
Я мало переспал ночей с JavaScript и как то в голове не укладывается что значит запятые в скобках (что в конце концов в скобках мы получим) и как с эти результатом слаживают XMLHttpRequest по И, и куда это все пишется?
В теории оператор &&
"Возвращает последний операнд, если все операнды верны. Если хоть один из операндов неверен, то возвратит первый неверный операнд."
Я так понимаю что если бы был только один из методов GET или send, то при удачном результате вернулся бы он, или как? а что в этом случае будет?
Спасибо.

Octane 18.01.2012 21:22

Ваш код аналогичен следующему:
if (window.XMLHttpRequest) {
	b = new XMLHttpRequest;
} else if (window.rb) {
	b = new ActiveXObject("MSXML2.XMLHTTP");
} else {
	b = window.rb;
}
if (b) {
	b.open("GET", a, !1);
	b.send("");
}


Кстати, если IE6 не нужен, можно сразу XMLHttpRequest использовать.

pupena_san 18.01.2012 21:33

Цитата:

Сообщение от Octane (Сообщение 151299)
Ваш код аналогичен следующему:
if (b) {
	b.open("GET", a, !1);
	b.send("");
}


Этот код мне понятен. Но почему так получается?

Octane 18.01.2012 21:40

Просто выражения через запятую выполняются
alert(1), alert(2), alert(3);

pupena_san 18.01.2012 21:45

А точка с запятой?
Сейчас я понимаю, что я и первую часть кода не понял. О "?" прочитал в учебнике, но там конструкция отличается. Видно кроме "," не понял еще и работу "&&".

B@rmaley.e><e 18.01.2012 21:52

Точка с запятой — разделитель инструкция, запятая — оператор. Запятая может быть в выражении, точка с запятой — нет. Особенности оператора "запятая" таковы, что она возвращает свой второй операнд.
&&, как и ||, по аналогии со многими другими языками реализуют т.н. Short-circuit evaluation. Т.е. если значение первого операнда оператора && приводится к false, то вычислять (выполнять) второй уже не нужно, т.к. результат уже известен.

pupena_san 18.01.2012 22:33

Как будет работать
a&&a.call(this)

так?
if (a) a.call(this)

pupena_san 18.01.2012 22:53

А вот этот код
a && b.fn1() && b.fn2() && b.fn3()

Вот так?
if (a) {
    if (b.fn1()){
       if (b.fn2()) {b.fn3()}
    }
}

B@rmaley.e><e 18.01.2012 23:10

Цитата:

Сообщение от pupena_san
так?

Да.
Цитата:

Сообщение от pupena_san
Вот так?

Да.

pupena_san 18.01.2012 23:31

Спасибо большое.
Разбираю сейчас код, максимально упакованный. Сам в этом деле новичёк, ПРИХОДИТСЯ дополнять (в большей степени менять) не существующий (не удовлетворяющий) функционал библиотеки.
Есть еще вопросики. В связи с тотальной упаковкой кода все написано без переносов строк. Но во многих случаях там отстутствуют ";" . Какие правила существуют для обязательных разделителей между инструкциями?
Например, после окончания блока "}" может сразу начинаться следующий блок без переноса на следующую строку?
Вот например сейчас мне не понятна такая конструкция:
window.fn=new function(b){<code>}(document.getElementById("a"))

Последние скобки относятся к функции, или это просто такое разделение кода?
часто пишут аля такое:
var w=/.*\//.exec(window.location+""),j,v=$("<input>").attr({type:"button",id:"sb",value:"L"}).click(function(){j?a():c()});

тут запятые стоят, чтоб var 3 раза не повторять? Если так, то можно после них (запятых) перенос строки делать?


Часовой пояс GMT +3, время: 02:09.