Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Дэвид Флэнаган (https://javascript.ru/forum/offtopic/7281-dehvid-flehnagan.html)

Niar 24.01.2010 15:35

Дэвид Флэнаган
 
Книга конечно очень хорошая и качественная. Но иногда встречаются просто глупые опечатки. Тестируешь код а потом ломаешь голову почему это не работает.
Например
switch(n) {
case 1: // Выполняется, если n == 1
// Исполняем блок кода 1.
break; // Здесь останавливаемся
case 2: // Выполняется, если n == 2
// Исполняем блок кода 2.
break; // Здесь останавливаемся
case 3: // Выполняется, если n == 3
// Исполняем блок кода 3.
break; // Здесь останавливаемся
default: // Если все остальное не подходит...
// Исполняем блок кода 4.
break; // Здесь останавливаемся
}

Вот пример работы switch из книги. Однако!
Блоки кода выполняются не если n==1(2,3 нужное подчеркнуть) а если n===1(2,3);
Или вот еще
break: имя_метки;

Так описан синтаксис break с именем метки. Однако двоеточия там быть не должно.

Почитал соседние топики. Абсолютно глупая фраза. Толи это ошибка перевода и он имел ввиду что-то другое то ли я ни чего не понимаю
Цитата:

Прежде всего следует заметить, что попытка преобразования непустых объектов в логическое значение дает в результате значение true. Это справедливо для любых объектов (включая массивы и функции), даже для объектов оберток, которые представляют элементарные типы, при другом способе преобразования дающие значение false.
Или например почему он постоянно говорить объекты и массивы. Как будто массивы это не объекты. Нужно говорить в том числе массивы.

Niar 28.01.2010 15:41

Кстати я пообещал себе купить бумажный вариант книги как только сделаю первый сайт на заказ:D

x-yuri 29.01.2010 10:04

Цитата:

Сообщение от Niar
Или вот еще
break: имя_метки;

у меня такого нету, это может быть ошибка какого-нибудь FineReader'а или чем оно там сделано

Цитата:

Сообщение от Niar
Прежде всего следует заметить, что попытка преобразования непустых объектов в логическое значение дает в результате значение true. Это справедливо для любых объектов (включая массивы и функции), даже для объектов оберток, которые представляют элементарные типы, при другом способе преобразования дающие значение false.

и что тут глупого?

Цитата:

Сообщение от Niar
Или например почему он постоянно говорить объекты и массивы. Как будто массивы это не объекты. Нужно говорить в том числе массивы.

ну тогда давай цитату

Gozar 29.01.2010 20:17

Цитата:

Сообщение от Niar (Сообщение 41796)
Вот пример работы switch из книги. Однако!
Блоки кода выполняются не если n==1(2,3 нужное подчеркнуть) а если n===1(2,3);

на следующей странице через 2 абзаца поясняется что, цитирую дословно: Факт совпадения определяется в соответствии с оператором идентичности ===, а не оператором равенства==, поэтому выражения должны совпадать без какого-либо преобразования типов.

Цитата:

Сообщение от Niar (Сообщение 41796)
Почитал соседние топики. Абсолютно глупая фраза. Толи это ошибка перевода и он имел ввиду что-то другое то ли я ни чего не понимаю

Здесь все нормально, нужно просто понимать о чем речь, это так сказать "фича" js. например в конструкции if сравниваешь объект строку, думаешь щаз она вернет false и условие не выполнится, а она бламс и true и вперед долгие часы дебага :)

Цитата:

Сообщение от Niar (Сообщение 41796)
Или например почему он постоянно говорить объекты и массивы. Как будто массивы это не объекты. Нужно говорить в том числе массивы.

Здесь делается акцент на различия в конструкциях, под объектом подразумевается конструкция вида
{ key: value }
, а под массивом
[val1,val2,val3] или var[int index] = val

А так, как в js объектами являются еще и Date, RegExp, Function, то автор пытается не запутать читателя, который возможно пришел из языка в котором объекты это объекты а массивы это массивы, а ассоциативные массивы это ассоциативные массивы, а не объекты.

micscr 30.01.2010 09:38

Цитата:

Сообщение от Niar (Сообщение 42508)
Кстати я пообещал себе купить бумажный вариант книги как только сделаю первый сайт на заказ:D

Вот на этом форуме конкурс намечается. Если знаешь PHP можешь участвовать. Приз там обычно - любая книга.

mycoding 30.01.2010 15:06

Наверное ты уже разобрался, но все же напишу, не надо делать ===
просто можно в кавычки значения поставить.
switch(n) {
case '1': // Выполняется, если n == 1
// Исполняем блок кода 1.
break; // Здесь останавливаемся
case '2': // Выполняется, если n == 2
// Исполняем блок кода 2.
break; // Здесь останавливаемся
case '3': // Выполняется, если n == 3
// Исполняем блок кода 3.
break; // Здесь останавливаемся
default: // Если все остальное не подходит...
// Исполняем блок кода 4.
break; // Здесь останавливаемся
}

А вообще мне Давид Флэнаган нравится, но нужно такое усилие, чтобы это читать, примеры не очень я бы сказал, впечатление такое, что он просто спешил, и не успевал, нормальное придумывать. Хотя если учесть какие другие книги, то это просто супер.

Мараторий 31.01.2010 03:36

mycoding,
Что-то я не понял вашу мысль.
var n = 1;
switch(n) {
  case '1': alert(1); break;
  case '2': alert(2); break;
  default: alert("def");
}

И что же выдаст скрипт?
А вы говорите "Выполняется, если n == 1"

Niar 31.01.2010 07:58

Цитата:

Здесь все нормально, нужно просто понимать о чем речь, это так сказать "фича" js. например в конструкции if сравниваешь объект строку, думаешь щаз она вернет false и условие не выполнится, а она бламс и true и вперед долгие часы дебага
Пример можно?
Цитата:

на следующей странице через 2 абзаца поясняется что, цитирую дословно: Факт совпадения определяется в соответствии с оператором идентичности ===, а не оператором равенства==, поэтому выражения должны совпадать без какого-либо преобразования типов.
Я видел но ошибка то всё равно есть

mycoding 31.01.2010 09:25

Цитата:

Сообщение от Мараторий (Сообщение 42900)
mycoding,
Что-то я не понял вашу мысль.
var n = 1;
switch(n) {
  case '1': alert(1); break;
  case '2': alert(2); break;
  default: alert("def");
}

И что же выдаст скрипт?
А вы говорите "Выполняется, если n == 1"

Да я ошибся извините )))

Gozar 31.01.2010 10:08

Цитата:

Сообщение от Niar (Сообщение 42904)
Пример можно?

Я видел но ошибка то всё равно есть

var obj = new String('');
	false===obj ? alert('false') : alert('true'); // true

	str = '';
	false===str ? alert('false') : alert('true'); // true


По поводу ошибка не ошибка. 2 это цифра и тип у неё number, n==2 правильно.

x-yuri 31.01.2010 11:05

тогда уж
if( '' ) 
    alert('пустая строка');
if( new String('') ) 
    alert('обьект-обертка');

правда непонятно, почему там упоминаются непустые объекты
UPD: null похоже имеется в виду

micscr 31.01.2010 12:07

Цитата:

Сообщение от x-yuri (Сообщение 42919)
UPD: null похоже имеется в виду

Да походу про null хотя null не является объектным типом (несмотря на typeof(null))
В книге дальше имеется таблица 3.3. Там все и описывается окончательно.

Мне больше нравится творчество перевода в примере 15.5 и демонстрации картинки к нему. (стр 340)

Niar 31.01.2010 12:40

Спасибо вам как всегда :D

Niar 31.01.2010 12:47

Гозар не понял вашего примера я и так знал что new String("") !== false;

micscr 31.01.2010 12:58

Цитата:

Сообщение от Niar (Сообщение 42929)
Гозар не понял вашего примера я и так знал что new String !== false

впрочем true оно тоже эквивалентно никак не равно. Т.к. одно это объект, а другое - значение логического типа.
Но зато с приведением - равно:
if (new String('')==false) alert('равно')

if (new String('1')==true) alert('равно')

Niar 31.01.2010 13:02

Запутался почему тогда
if( new String('') ) true

Мараторий 31.01.2010 13:12

Цитата:

Сообщение от micscr (Сообщение 42925)
Мне больше нравится творчество перевода в примере 15.5 и демонстрации картинки к нему. (стр 340)

А что там с переводом не так?
Картинки просто местами перепутаны. Могу предположить, что не переводчиком, а издателем.

Мараторий 31.01.2010 13:16

Цитата:

Сообщение от Niar (Сообщение 42931)
Запутался почему тогда
if( new String('') ) true

Потому, что new String('') - это объект. Все объекты при преобразовании к логическому типу превращяются в true.
http://javascript.ru/ecma/part9#a-9.2


А вообще, насколько я понял, почитав http://javascript.ru/ecma/part11#a-11.9.3, начиная с 16 пункта сравнения все превращается в числа. И потом сравниваются числа. Если ошибаюсь, поправьте меня.

Niar 31.01.2010 13:23

if (new String('')==false) alert('равно')
Ну а тут false то почему

Мараторий 31.01.2010 13:30

Цитата:

Сообщение от Niar (Сообщение 42935)
if (new String('')==false) alert('равно')
Ну а тут false то почему

Черт. Точно. Вы правы.
При сравнении объекта и логического выражения.
Логическое false "превращается" в 0
Объект сначала "превращается" в ToPrimitive(object)
Потом этот результат переходит в число ToNumber(ToPrimitive(object))

Видимо ToPrimitive(new String('')) -> ""
ToNumber(ToPrimitive(new String(''))) = ToNumber("") -> 0
ToNumber(false) -> 0

0 === 0

Вот так я это вижу.

Niar 31.01.2010 13:37

Логично

micscr 31.01.2010 14:52

Цитата:

Сообщение от Niar (Сообщение 42935)
if (new String('')==false) alert('равно')
Ну а тут false то почему

if (new String('')) - здесь объект сразу приводится к логическому, и по правилам это true
if (new String('')==false) - а тут работает оператор == и правила его работы - особенные (стр 85 все подробно описано)

Niar 31.01.2010 16:00

Да я их даже в тетрадку переписал дня 3 назад. Просто сразу не вкупил

Мараторий 31.01.2010 16:11

Цитата:

Сообщение от micscr (Сообщение 42948)
if (new String('')) - здесь объект сразу приводится к логическому, и по правилам это true
if (new String('')==false) - а тут работает оператор == и правила его работы - особенные (стр 85 все подробно описано)

Я вот чего не очень понимаю. Зачем при сравнении чего-либо с логическим выражением надо это логическое выражение приводить к числу, а не сравниваемый объект приводить к логическому выражению?
Тогда эти две операции были бы эквивалентны:
if(expr) ...
// и
if(expr == true) ...
А в действительности получается, что они не эквивалентны.

Niar 31.01.2010 16:12

А зачем две эквивалентных операции?

Мараторий 31.01.2010 16:23

Цитата:

Сообщение от Niar (Сообщение 42953)
А зачем две эквивалентных операции?

Ну как зачем? По логике вещей эти две операции должны делать одно и то же. Вам так не кажется?
В первый раз я говорю: если выражение правда, то сделать то-то.
Во второй раз я говорю: если выражение равно правде, то сделать то-то.
По мне так это одно и то же.

Niar 31.01.2010 16:24

Нет не кажется

micscr 31.01.2010 16:31

Цитата:

Сообщение от Мараторий (Сообщение 42952)
Я вот чего не очень понимаю. Зачем при сравнении чего-либо с логическим выражением надо это логическое выражение приводить к числу, а не сравниваемый объект приводить к логическому выражению?

Может потому что оператор == изначально нацелен именно на определение равенства разнотипных элементов. И если приводить сложные типы данных сразу к логическому значению теряется много вариантов.
Ведь тут new String('')==false получается: сначала false в 0 потом объект в пустую строку и пустая строка в 0.
Не забываем что своим объектам можно переопределять метод valueOf и кто знает тогда как он будет сравниваться например со строкой или числом.

Мараторий 31.01.2010 16:38

Цитата:

Сообщение от micscr (Сообщение 42956)
Может потому что оператор == изначально нацелен именно на определение равенства разнотипных элементов. И если приводить сложные типы данных сразу к логическому значению теряется много вариантов.
Ведь тут new String('')==false получается: сначала false в 0 потом объект в пустую строку и пустая строка в 0.
Не забываем что своим объектам можно переопределять метод valueOf и кто знает тогда как он будет сравниваться например со строкой или числом.

Убедили. Все встало на свои места.

Цитата:

Сообщение от Niar (Сообщение 42958)
Написали же=) Оператор == нацелен на сравнение различных типов данных.

Предыдущий пост я удалил. Я его писал до того, как это прочел.

Niar 31.01.2010 17:42

Почему в литерале объекта
{L:function(){}}
и
{"L":5}

syntax error, а
var bla={L:function(){}}

и
var bla={"L":5}

нету ошибки?

PeaceCoder 31.01.2010 17:55

[] и {} - создание массива и обьекта и это создание должно кудато сохранится....

Niar 31.01.2010 17:57

Ты не понял {l:"l"} нету ошибки
Ошибка когда значение свойства-функция или когда имя свойства-строка
Цитата:

[] и {} - создание массива и обьекта
Да ты что

Kolyaj 31.01.2010 18:21

Цитата:

Сообщение от Niar
{"L":5}

Потому что это не expression, а block statement. Чтобы сделать expression, нужно взять в скобки
({"L": 5})

Niar 31.01.2010 18:23

А поподробней?=)

Kolyaj 31.01.2010 18:25

Поточнее я могу только послать в стандарт ECMAScript читать грамматику. Или обратиться, например, к Дмитрию Сошникову, которые лучше меня объясняет подобные вещи.

B@rmaley.e><e 31.01.2010 18:32

Цитата:

Сообщение от PeaceCoder
это создание должно кудато сохранится....

Кто сказал?

P.S. Вспоминаем анонимные function expression, которые никуда не сохраняются.

Niar 31.01.2010 18:42

Ну тогда просто запомню что нужно либо в скобки брать либо присваивать переменной
Потом почитаю его статьи. Я так мельком глянул очень интересные, хотя конечно не мой уровень

Gozar 31.01.2010 19:12

Цитата:

Сообщение от Niar (Сообщение 42978)
А поподробней?=)

Я так понимаю, что
{"x":5}
, это инструкция(наподобие if{}).

А инструкция выполняется в зависимости от условия, а условие в данном случае отсутствует, поэтому происходит нарушение синтаксиса и выводится ошибка. Если же взять в круглые скобки, то это уже выражение, а оно вычисляется сразу и условие ему не нужно.

B@rmaley.e><e 31.01.2010 19:21

Цитата:

Сообщение от Niar
либо в скобки брать либо присваивать переменной

Там, где явно подразумевается выражение, {} будет трактоваться как литеральное объявление объекта. В остальных случаях - как block statement. Аналогично function expression и function statement.
{
  alert('Я выполняюсь'); alert('И я');
  var i = 0;
  i++;
  alert('i=' + i)
}

Kolyaj 31.01.2010 19:22

Цитата:

Сообщение от Gozar
, это инструкция(наподобие if{}).

Ну почти. {} -- это block statement
{alert(1);}


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