Операторы больше-меньше также работают со строками, сравнивая их лексикографически, т.е посимвольно.
"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"
Не-не-не, выражения 'a+b' и '+b' -- это две большие разницы, даже если а = 0.
В пером случае это будет конкатенаци (или сложение для чисел) - бинарная операция. Во-втором - операция унарная, аналогичная '-b' -- смена знака. Хотя в случае с '+' это менее очевидно, но выполняется приведение типа к числу.
"...Сравнение == делается с приведением типов, а === без приведения типов...". Наверное, наоборот:Сравнение == делается БЕЗ приведения типов, а === С приведения типов
лучше вообще избавиться от привидений, и написать русским языком:
Сравнение == производится без учёта типов данных,
При использовании === сравниваются не только значения переменных/операндов но ещё и их типы.
Например:
'555' == 555 //вернёт true
'555' === 555 //вернёт false , так как типы данных разные(строка и число)
Наоборот. Указание, что происходит приведение типов, многое объясняет в работе оператора.
Понимание, что это приведение типов с последующим сравнением, - здорово облегчает жизнь.
Мне кто нибудь может подсказать как исчисляется
>>> (Сдвиг вправо с заполнением нулями)
>>>= (Сдвиг вправо с заполнением нулями и присваиванием)
Пытаюсь понять, но никак не получается.
x=13>>>1
x=6
Как они его вычислили, что получилась такая сумма?
Про разряды я то знаю, мне интересно сам ход выполнения операции.
да, все это понятно, но формула вычисления должна быть?
y=-8>>>2
y=1073741822
Такое по таблице не посчитаешь.
Допустим
x=10%2;
x=0
Вычисление происходит следующим путем
10 : 2 = 5; 5 * 2 = 10; 10 - 10 = 0;
Называется это остаток от деления, а как исчисляется я искал в многих книгах и веб-сайтах, но так и не нашел. Получается, число плюс возможен остаток.
Меня интересует формула вычисления, не подскажешь?
Не парь себе мозги.
Побитовый сдвиг - это одна из базовых операций процессора. Никаких таблиц и никакой математики. Только алгоритм перназначения значений битов.
-8 хранится в обратном коде:
11111111111111111111111111111000 = 4294967288
сдвиг на 2 вправо с доопределением 0 = делению на 4:
00111111111111111111111111111110 = 1073741822
Сдвиг влево аналогичен умножению на 2 в степени сдвига.
Сдвиг вправо аналогичен делению без остатка на 2 в степени сдвига.
1<<5 = 1*2^5 = 32
32>>5 = 32 / 2^5 = 1
В первом сравнении у тебя происходит вычисление того, что в скобках, а только потом это сравнивается с переменной "y".
Во втором случае у тебя сначала сравнивается "y" с единицей, а только потом происходят дальнейшие вычисления. А так как даже 21 - это ИСТИНА, вот тебе и результат.
Ну а насчет второго, то вот пример:
function myFunction() {
var maxSize = 1000;
var rowSize = maxSize / 10;
var countRow = 1;
var myStr = "";
for ( var i = 0; i < maxSize; i++) {
if ((i % 10 == 1) && (i != 1)) { // here your verification
myStr += i + " ";
if (Math.floor(i / rowSize) == countRow) {
countRow++;
myStr += "\n";
}
}
}
alert(myStr);
}
Просто не забываем про приоритеты операндов. Скобки () вам в помощь. Если что, то я только начал изучать JS. Для формата кода юзаю Eclipse.
всё просто, сравнение числа со строкой, без приведения их к одному типу..
false - т.к. переменные считаются неравными, если прежде всего у них разные типы, и только потом уже разные значения.
Вот это правильный вариант произведения сложения двух значений.
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 = "ошибка";
}
Если быть совсем точным, то "И" возвращает первый операнд, если он неверен, иначе - второй.
А "ИЛИ" возвращает первый операнд, если он верен, иначе - второй.
Что означает код:
for(var y = 0; y <= 33; y++) {
y == 0 && SomeClass.Foo();
}
Цикл мне понятен. Не понятно значение && в этом контексте, т.е. если y == 0 и тогда выполняется некоторая функция класса SomeClass.Foo() ?
А если y != 0 тогда функция не будет выполняться?
Смотри предыдущий пост. Там как раз уточнение на эту тему.
SomeClass.Foo() будет выполняться только только после того, как y станет неравен нулю, а до этого момента (то есть в первую итерацию) до функции дело просто не дойдёт...
Подскажите мне, почему в данном коде не возвращает 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 (какой смысл тогда применять прием по поиску свойства в объекте с использованием &&? )
это инициализация переменной toggle, которая примет булевское значение в зависимости от результата сравнения oldop == 'upload' (сравнение будет проведено с приведением типом)
Кто нибудь объясните плиз логику работы ' % '.
Написано что возвращает остаток от деления. Но :
function myFunction() {
for ( var i=1; i<140; ++i){
var x =100 % i;
console.log(", " +x);
}
Возвращает последний операнд, если все они верны.
Верно, эффект имеет только использование ||, с && же подобным образом обращение не срабатывает
Спасибо, развернул эту часть статьи чуть пошире.
"+" делает конкатенацию, если хотя бы один операнд - строка, причем, не обязательно первый.
А как же такой красивый способ преобразования к числу?
var s = '7';
var n = +s;
alert(n.constructor); // Number
Да, интересно себя ведёт оператор
alert("1"+1) // 11
alert(+"1"+1) // 2
alert(0+"1"+1) // 011
Не-не-не, выражения 'a+b' и '+b' -- это две большие разницы, даже если а = 0.
В пером случае это будет конкатенаци (или сложение для чисел) - бинарная операция. Во-втором - операция унарная, аналогичная '-b' -- смена знака. Хотя в случае с '+' это менее очевидно, но выполняется приведение типа к числу.
все верно он себя ведет. Ты же не указываешь что данную строку нужно воспринимать как число.
Попробуй так:
и будет тебе щастье
Спасибо!! Очень помог!!!
"...Сравнение == делается с приведением типов, а === без приведения типов...". Наверное, наоборот:Сравнение == делается БЕЗ приведения типов, а === С приведения типов
Нет, как раз == с приведением, === без
лучше вообще избавиться от привидений, и написать русским языком:
Сравнение == производится без учёта типов данных,
При использовании === сравниваются не только значения переменных/операндов но ещё и их типы.
Например:
'555' == 555 //вернёт true
'555' === 555 //вернёт false , так как типы данных разные(строка и число)
Наоборот. Указание, что происходит приведение типов, многое объясняет в работе оператора.
Понимание, что это приведение типов с последующим сравнением, - здорово облегчает жизнь.
Мне кто нибудь может подсказать как исчисляется
>>> (Сдвиг вправо с заполнением нулями)
>>>= (Сдвиг вправо с заполнением нулями и присваиванием)
Пытаюсь понять, но никак не получается.
x=13>>>1
x=6
Как они его вычислили, что получилась такая сумма?
Про разряды я то знаю, мне интересно сам ход выполнения операции.
Если я не ошибаюсь и правильно понял:
да, все это понятно, но формула вычисления должна быть?
y=-8>>>2
y=1073741822
Такое по таблице не посчитаешь.
Допустим
x=10%2;
x=0
Вычисление происходит следующим путем
10 : 2 = 5; 5 * 2 = 10; 10 - 10 = 0;
Называется это остаток от деления, а как исчисляется я искал в многих книгах и веб-сайтах, но так и не нашел. Получается, число плюс возможен остаток.
Меня интересует формула вычисления, не подскажешь?
Не парь себе мозги.
Побитовый сдвиг - это одна из базовых операций процессора. Никаких таблиц и никакой математики. Только алгоритм перназначения значений битов.
-8 хранится в обратном коде:
11111111111111111111111111111000 = 4294967288
сдвиг на 2 вправо с доопределением 0 = делению на 4:
00111111111111111111111111111110 = 1073741822
Сдвиг влево аналогичен умножению на 2 в степени сдвига.
Сдвиг вправо аналогичен делению без остатка на 2 в степени сдвига.
1<<5 = 1*2^5 = 32
32>>5 = 32 / 2^5 = 1
Это я знаю, как исчисляется. Причем двойка(2) в этой формуле обязательна!
у меня есть строка, скажем "2+2*3". как получить результат вычисления (8) из строки, не разбирая её (длина строки не известна, операторы также)?
eval. Правда это опасно, и лучше все-таки производить разбор.
Спасибо, очень полезная статья
почему второй if выдает "тру" ?
и вообще может это как-то по другому делается?
как написать условие:
В первом сравнении у тебя происходит вычисление того, что в скобках, а только потом это сравнивается с переменной "y".
Во втором случае у тебя сначала сравнивается "y" с единицей, а только потом происходят дальнейшие вычисления. А так как даже 21 - это ИСТИНА, вот тебе и результат.
Ну а насчет второго, то вот пример:
Просто не забываем про приоритеты операндов. Скобки () вам в помощь. Если что, то я только начал изучать JS. Для формата кода юзаю Eclipse.
Вначале упомянули про оператор <<<, но подробно про него не рассказано.
И результат вырежения "B" > "a" - false, так как прописная 'B' имеет на самом деле меньший код, чем строчная 'a' .
но в данном случае мы указываем тип данных, как это без приведения?
Кому какая разница, что указываем мы? Говорится про приведение типов интерпретатором.
Здесь первый операнд типа Number, второй - String. По стандарту:
Таким образом, строка String(1) будет преобразована к типу Number, т.е. числу 1. 1 == 1 → true
В случае
первый же шаг
по моему точно что то напутали с типами, как вы обьясните такой пример?
if(1 === String(1)){
alert("одинаковые типы");
}else{
alert("разные типы");
}
отработает else
всё просто, сравнение числа со строкой, без приведения их к одному типу..
false - т.к. переменные считаются неравными, если прежде всего у них разные типы, и только потом уже разные значения.
Вот это правильный вариант произведения сложения двух значений.
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 = "ошибка";
}
}
по поводу сравнения строк: стоит добавить, что "лексикографически" подразумевает под собой сравнение по номеру в таблице юникод, т.е.
а кирилличные символы вообще далеко в таблице, поэтому
а какой-нибудь u\263a вообще больше почти всего
здесь в учебнике это подробно описано
можно подробнее описать дейсвие ?
(A) ? B : C;
Если условие A верно, выполнить действие B, иначе - С. Пример - функция, возвращающая модуль числа:
function abs(a) {
return (a > 0) ? a : -a;
}
действие-?-этого знака
В 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;
}
Приведение типов можно перегрузить! Я не очень понимаю почему это происходит, но это работает.
Если быть совсем точным, то "И" возвращает первый операнд, если он неверен, иначе - второй.
А "ИЛИ" возвращает первый операнд, если он верен, иначе - второй.
Что означает код:
for(var y = 0; y <= 33; y++) {
y == 0 && SomeClass.Foo();
}
Цикл мне понятен. Не понятно значение && в этом контексте, т.е. если y == 0 и тогда выполняется некоторая функция класса SomeClass.Foo() ?
А если y != 0 тогда функция не будет выполняться?
Смотри предыдущий пост. Там как раз уточнение на эту тему.
SomeClass.Foo() будет выполняться только только после того, как y станет неравен нулю, а до этого момента (то есть в первую итерацию) до функции дело просто не дойдёт...
Внезапно в Опере: "Текст" + chislo&256 даёт 0. Пришлось выкручиваться: "Текст" + String(chislo&256)
Подскажите мне, почему в данном коде не возвращает 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 (какой смысл тогда применять прием по поиску свойства в объекте с использованием &&? )
вот еще код к вопросу... просто не могу понять, зачем прием с && при проверке
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)
Просьба пояснить, что значит данная конструкция?
var toggle = oldop == 'upload';
это инициализация переменной toggle, которая примет булевское значение в зависимости от результата сравнения oldop == 'upload' (сравнение будет проведено с приведением типом)
Кто нибудь объясните плиз логику работы ' % '.
Написано что возвращает остаток от деления. Но :
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
Это вообще что ?
Если чуточку изменить Ваш код, то станет понятней. Я сделал так:
Проверял в консоли браузера. Все очень логично.
Эх .... Всё равно не понятно ((
for ( var i=1; i<140; ++i){
var x =100 % i;
var d = 100 / i;
console.log('остаток 100 / '+ i + " = " +x + " > "+ d);
}
Вывод:
.....
остаток 100 / 33 = 1 > 3.0303030303030303
остаток 100 / 34 = 32 > 2.9411764705882355
остаток 100 / 35 = 30 > 2.857142857142857
остаток 100 / 36 = 28 > 2.7777777777777777
остаток 100 / 37 = 26 > 2.7027027027027026
остаток 100 / 38 = 24 > 2.6315789473684212
остаток 100 / 39 = 22 > 2.5641025641025643
остаток 100 / 40 = 20 > 2.5
.....
что значит например 1 (один чего ?) при 100 % 33 ?
или 24 при 100 % 38 ??
Каким образом они получаются ?
Спасибо.
window.alert("вот вот")