|
В Javascript есть все необходимые для жизни операторы, хотя нет их перегрузки.
Некоторые операторы(+,побитовые,логические,===) имеют специфические особенности.
В Javascript есть даже операторы >>> и <<<.
В отличие от некоторых других языков, оператор "+" делает конкатенацию, если хотя бы один операнд - строка, причем, не обязательно первый.
Проверим:
Унарный оператор "+" также используется для преобразования строки к числу:
alert(+"123"+1) // 124
Все побитовые операции работают с 4-байтовым signed int.
Операция >>> сдвигает побитово вправо, а слева нулями дополняет. В результате эффект - тот же, что и при простом сдвиге >> для положительных чисел.
Для отрицательных - все по-другому. Например, -9 в битовом виде выглядит как: 11111111111111111111111111110111.
Операция >>> даст эффект: -9 >>> 2 будет в битовом виде 00111111111111111111111111111101, т.е 1073741821.
Логическое И. Возвращает последний операнд, если все операнды верны. Если хоть один из операндов неверен, то возвратит первый неверный операнд.
Например, 1 && 2 = 2:
1 && 0 && false === 0:
Оператор И обычно используется, чтобы избежать ошибок при получении вложенных свойств объекта.
Например, нужно свойство petShop.animals.rabbit или ложное значение, если такого свойства нет.
Безопасный способ:
var rabbit = petShop && petShop.animals && petShop.animals.rabbit
Этот код корректно выполнится, даже если petShop = false, в то время как
var rabbit = petShop.animals.rabbit
выдаст ошибку(бросит исключение) об отсутствующем свойстве.
Оператор логического ИЛИ возвращает первое верное значение. А если верных значений вообще нет, то последнее неверное.
Это удобно использовать так:
var e = event || window.event // если event не событие, то берем window.event
Логическое НЕ, также удобно для преобразования в Boolean.
var str = "something"
// эквивалентные записи
var test = Boolean(str)
var test = !!str
Операторы больше-меньше также работают со строками, сравнивая их лексикографически, т.е посимвольно.
"B">"a"
"bc" < "bd"
Сравнение == делается с приведением типов, а === без приведения типов, например:
0 == false // верно
// но
0 !== false //типы разные
Проверка равенства осуществляется особым образом, если один из операндов - undefined, null, NaN. Более подробно об алгоритме в этом случае можно прочитать в секции 11.9.3 стандарта ECMA-262.
Тернарный оператор. В старых парсерах javascript с ним были проблемы, надо было заключать сравнение в скобки, но в новых - вполне нормальный оператор
var test = (1==2) ? "one" : "two"
// эквивалентно
var test = 1==2 ? "one" : "two"
|
Автор: vasa_c, дата: 21 июня, 2008 - 19:50
#permalinkВозвращает последний операнд, если все они верны.
Автор: Atlan†is, дата: 9 августа, 2008 - 23:41
#permalinkВерно, эффект имеет только использование ||, с && же подобным образом обращение не срабатывает
Автор: Илья Кантор, дата: 10 августа, 2008 - 03:05
#permalinkСпасибо, развернул эту часть статьи чуть пошире.
Автор: sphere (не зарегистрирован), дата: 4 декабря, 2008 - 12:31
#permalink"+" делает конкатенацию, если хотя бы один операнд - строка, причем, не обязательно первый.
А как же такой красивый способ преобразования к числу?
var s = '7';
var n = +s;
alert(n.constructor); // Number
Автор: Гость (не зарегистрирован), дата: 9 апреля, 2009 - 16:29
#permalink"...Сравнение == делается с приведением типов, а === без приведения типов...". Наверное, наоборот:Сравнение == делается БЕЗ приведения типов, а === С приведения типов
Автор: Jozzer (не зарегистрирован), дата: 9 октября, 2009 - 20:40
#permalinkМне кто нибудь может подсказать как исчисляется
>>> (Сдвиг вправо с заполнением нулями)
>>>= (Сдвиг вправо с заполнением нулями и присваиванием)
Пытаюсь понять, но никак не получается.
x=13>>>1
x=6
Как они его вычислили, что получилась такая сумма?
Про разряды я то знаю, мне интересно сам ход выполнения операции.
Автор: Beast Winterwolf, дата: 15 октября, 2010 - 01:29
у меня есть строка, скажем "2+2*3". как получить результат вычисления (8) из строки, не разбирая её (длина строки не известна, операторы также)?
Автор: ioncreature (не зарегистрирован), дата: 7 ноября, 2010 - 00:22
#permalinkСпасибо, очень полезная статья
Автор: shkur, дата: 25 ноября, 2010 - 13:11
#permalinkvar y = 0 if (y == (1 || 21 || 31 || 41 || 51 || 61 || 71)) {"тру"} else {"фэил"}//"фэил" if (y == 1 || 21 || 31 || 41 || 51 || 61 || 71) {"тру"} else {"фэил"}//"тру"почему второй if выдает "тру" ?
и вообще может это как-то по другому делается?
как написать условие:
if (numRows != 1 и заканчивается на 1) {var p = "заявок заархивированно"} например numRows = 11 или 21 или 31Автор: Zefick (не зарегистрирован), дата: 29 ноября, 2010 - 17:09
#permalinkВначале упомянули про оператор <<<, но подробно про него не рассказано.
И результат вырежения "B" > "a" - false, так как прописная 'B' имеет на самом деле меньший код, чем строчная 'a' .
Автор: cedage, дата: 4 декабря, 2010 - 22:53
#permalinkпо моему точно что то напутали с типами, как вы обьясните такой пример?
if(1 === String(1)){
alert("одинаковые типы");
}else{
alert("разные типы");
}
отработает else
Автор: Гость (не зарегистрирован), дата: 25 мая, 2011 - 19:40
#permalinkВот это правильный вариант произведения сложения двух значений.
function calculate() {
var chislo1 = document.primer.chislo1.value; /присваиваем переменой значение которое было введено
var chislo2 = document.primer.chislo2.value;
var x = +chislo1;
var y = +chislo2;
var z = x + y;
if (isFinite(z)) {
resultat.innerHTML = z.toFixed(2);
}
else {
res1.innerHTML = "ошибка";
}
}
Автор: Abibok, дата: 20 января, 2012 - 15:26
#permalinkпо поводу сравнения строк: стоит добавить, что "лексикографически" подразумевает под собой сравнение по номеру в таблице юникод, т.е.
а кирилличные символы вообще далеко в таблице, поэтому
а какой-нибудь u\263a вообще больше почти всего
здесь в учебнике это подробно описано
Автор: Гость (не зарегистрирован), дата: 24 мая, 2012 - 22:42
#permalinkможно подробнее описать дейсвие ?
Автор: Гость (не зарегистрирован), дата: 24 мая, 2012 - 22:43
#permalinkдействие-?-этого знака
Автор: Verber (не зарегистрирован), дата: 8 октября, 2012 - 22:52
#permalinkВ Javascript есть все необходимые для жизни операторы, хотя нет их перегрузки.
Я бы не сказал.
function Point (x,y) {
this.x = x;
this.y = y;
this.toString = function() {
return "Point( " + this.x + ", " + this.y + " )";
}
return this;
}
var foo = new Point(2, 3);
alert( "Foo is " + foo ); // Выдаст "Foo is Point( 2, 3 ) "
Здесь в alert() вызывается foo.toString() при складывании foo и "Foo is". Это почти перегрузка оператора приведения типов, как в С++:
#include
#include
#include
using namespace std;
struct Point {
int x, y;
operator const char* () {
stringstream s;
s << "Point( " << x << ", " << y << " )";
return s.str().c_str();
}
};
int main() {
Point p = {2,3};
cout << "Hello Point: " << p;
}
Приведение типов можно перегрузить! Я не очень понимаю почему это происходит, но это работает.
Автор: Фёдор Геращенко (не зарегистрирован), дата: 27 марта, 2013 - 08:28
#permalinkЕсли быть совсем точным, то "И" возвращает первый операнд, если он неверен, иначе - второй.
А "ИЛИ" возвращает первый операнд, если он верен, иначе - второй.
Автор: lexvol (не зарегистрирован), дата: 8 апреля, 2013 - 23:14
#permalinkЧто означает код:
for(var y = 0; y <= 33; y++) {
y == 0 && SomeClass.Foo();
}
Цикл мне понятен. Не понятно значение && в этом контексте, т.е. если y == 0 и тогда выполняется некоторая функция класса SomeClass.Foo() ?
А если y != 0 тогда функция не будет выполняться?
Автор: Гость (не зарегистрирован), дата: 7 июля, 2014 - 22:21
#permalinkВнезапно в Опере: "Текст" + chislo&256 даёт 0. Пришлось выкручиваться: "Текст" + String(chislo&256)
Автор: AllaIreland (не зарегистрирован), дата: 25 сентября, 2014 - 17:17
#permalinkПодскажите мне, почему в данном коде не возвращает false, как это указано в статье? Вот, берем объект БЕЗ свойства rabbit и получаем прогнозируемый undefined (но никак не false, как указано в статье):
var petShop = {animals:5,pet:5};
var rabbit = petShop && petShop.animals && petShop.animals.rabbit;
alert (rabbit);//=>undefined (а не false, как говорится в статье)
var rabbit = petShop.animals.rabbit;
alert (rabbit);//=>undefined (какой смысл тогда применять прием по поиску свойства в объекте с использованием &&? )
Автор: AllaIreland (не зарегистрирован), дата: 25 сентября, 2014 - 17:31
#permalinkвот еще код к вопросу... просто не могу понять, зачем прием с && при проверке
petShop.animals.rabbit, ведь результат не меняется:
var petShop = {animals:5, pet:5};
if (petShop && petShop.animals && petShop.animals.rabbit) {
alert('тут true');
} else { alert('попадаем в false');}//ушли в false
if (petShop.animals.rabbit) {alert('тут true');
} else { alert('ушли в false снова');}//ушли в false
var petShop = {animals:{rabbit:9}, pet:5}; if (petShop && petShop.animals && petShop.animals.rabbit) {alert('тут true');// тут true
} else { alert('попадаем в false');}//
if (petShop.animals.rabbit) {alert('тут true');// тут true
} else { alert('ушли в false снова');}
//в чем тогда разница-то? Зачем if (petShop && petShop.animals && petShop.animals.rabbit), а не просто if (petShop.animals.rabbit)
Автор: Гость (не зарегистрирован), дата: 17 ноября, 2014 - 10:37
#permalinkПросьба пояснить, что значит данная конструкция?
var toggle = oldop == 'upload';
Автор: Анон (не зарегистрирован), дата: 25 января, 2016 - 15:14
#permalinkКто нибудь объясните плиз логику работы ' % '.
Написано что возвращает остаток от деления. Но :
function myFunction() {
for ( var i=1; i<140; ++i){
var x =100 % i;
console.log(", " +x);
}
:Вывод> , 0, 0, 1, 0, 0, 4, 2, 4, 1, 0, 1, 4, 9, 2, 10, 4, 15, 10, 5, 0, 16, 12, 8, 4, 0, 22, 19, 16, 13, 10, 7, 4, 1, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100
Это вообще что ?
Автор: Гость (не зарегистрирован), дата: 16 января, 2018 - 13:42
#permalinkwindow.alert("вот вот")