Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> недостатки JavaScript, предлагаю собрать коллекцию :) 
:(
    Опции темы
Alx
Дата 12.2.2006, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: 10
Всего: 78



ну конечно, если создать объект числа, то число будет объектом...


--------------------
PM MAIL WWW ICQ   Вверх
Sardar
Дата 12.2.2006, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Destruction, и что пример должен показать? Обернул ты строку в Number обьект, во второй строке опросил конструктор у конструктора, т.е. у функции (Function обьект). В JS есть оьекты и примитивы, строки, числа, это всё примитивы. Xотя new String, new Number и т.д. это обьекты. Особенно сбивает с толку такой приём smile
Код
var a=new Boolean(false);
alert(a);
if(a) alert("Не должно появиться!"); //но появиться =)



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Innuendo
Дата 12.2.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 24.12.2005
Где: Молдова

Репутация: 2
Всего: 6



Sardar,
а вот получается что условия типа if (a) проверяют на наличие переменной, а не на то что, она равна false, true или 0,1 ?


--------------------
=)
PM MAIL ICQ Jabber   Вверх
Alx
Дата 12.2.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: 10
Всего: 78



Innuendo,
нет, тут всё сложнее. на наличие не перемнных, а объектов.
кода
Код

<script>
var a = false;
alert(a);
if(a) alert("Не должно появиться!"); // и не появится
</script>

работат "правильно".

а также

Код

<script>
var a = new Boolean(false);
alert(a);
if(a == true) alert("Не должно появиться!"); // тоже не появится
</script>


Это сообщение отредактировал(а) Alx - 12.2.2006, 22:24


--------------------
PM MAIL WWW ICQ   Вверх
Zeroglif
Дата 12.2.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(Innuendo @ 12.2.2006, 22:12 Найти цитируемый пост)
а вот получается что условия типа if (a) проверяют на наличие переменной, а не на то что, она равна false, true или 0,1 ?


Наличие переменной не при чём. Всё работает по строгой логике для if (см. Ecma-262, 12.5), выражение в скобках вычисляется и приводится к типу Boolean (см. Ecma-262, 9.2). Соответственно, приведение к этому типу объекта new Boolean(false) даст true.
PM MAIL WWW   Вверх
Sardar
Дата 12.2.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Innuendo @ 12.2.2006, 21:12 Найти цитируемый пост)
if (a) проверяют на наличие переменной, а не на то что, она равна false, true или 0,1

Существование обьекта это true, null это false, не важно состояние обьекта (в примере содержи false).


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
regis
Дата 13.2.2006, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: нет
Всего: 7



@ Sardar & Alx:

в том и проблема, что даже самые обычные числа являются объектами (класса Number). Скажем, они имеют уйму методов (вроде toString). Все это есть в документации. Попробуйте у себя в браузере выполнить

Код

alert ((2*2).toString());


например...

--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
Destruction
Дата 13.2.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.2.2006

Репутация: нет
Всего: нет



Примерно это я хотел показать указывая наличие контруктора, но использовал неудачный пример.

Код

<script>
alert((123).constructor);
</script>


Это сообщение отредактировал(а) Destruction - 13.2.2006, 11:48
PM MAIL   Вверх
Sardar
Дата 13.2.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



regis & Destruction, Нет, это называеться autoboxing, проиходит динамически когда ты обращаешся с примитивом как с обьектом, но значение всё равно не оборачиваеться в обьект.

Код
var a=(3+1);
alert(a.constructor);
a.test = 90;
alert(a.test);

b = new Number(3+1);
alert(b.constructor);
b.test = 90;
alert(b.test);

Number.prototype.bla = 80;
alert(a.bla);


Обьекты почти всегда в скриптах выполнены на как хештаблицы, реже деревья. Т.е. обьект это набор пар ключь=>значение + сылка на прототип (опять же обьект). Держать хештаблицу для каждого значения весьма накладно (интересно как порешали в Ruby, где действительно всё это обьекты?), потому и существуют примитивы, что "имеют" ссылку только на прототип Number. Числа обычно храняться прямо в структуре "универсального значения", обычно в union. Фактически никаких ссылок нет, все числа при обращении с ними как с обьектами обращаються к прототипу Number.

Когда мы пишем:
Код
alert((3+4).constructor.toString());

Происходит следующее, по шагам:
  • сложить, результат на стек
  • найти поле constructor, это примитив число, значит обращаемся к нативному обьекту Number
  • найти у обьекта Number (помним что это функция, т.е. обьект) поле toString, если поле это обьект-функция, то вызываем, иначе кидаем исключение
Опустил детали конкретного движка, вычисления могут быть традиционно на стеке (Java, C#), а могут быть в "регистрах" (Parrot (Perl6)). В целом видим что примитивы это всё таки очень лёгкие "существа" в отличии от полноценных обьектов. Все примитивы не мутируемы, чем и отличаються от ссылочных значений. Только строки исключение, они не мутируемы, но ссылочные, что бы не копировать их по чём зря в памяти smile

Надеюсь обьяснил, кончаем офтоп, по вопроссам внутренней работы JS создаём новую тему smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Destruction
Дата 13.2.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.2.2006

Репутация: нет
Всего: нет



бл... пойду умные книжки читать.. - половину ваще не понял.

Это сообщение отредактировал(а) Destruction - 13.2.2006, 15:21
PM MAIL   Вверх
Zeroglif
Дата 13.2.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(Sardar @ 13.2.2006, 12:17 Найти цитируемый пост)
Надеюсь обьяснил, кончаем офтоп, по вопроссам внутренней работы JS создаём новую тему


Перевёл разговор про примитивы сюда - http://forum.vingrad.ru/index.php?showtopic=83710
PM MAIL WWW   Вверх
Lixil
Дата 14.2.2006, 18:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот недостатки, которые сразу пришли в голову:
1. Нет статических переменных.
2. Нет ООП (фичи с prototype, this и т.д. не считаются)
3. Нет инклуда других скриптов.
4. Нет аргументов по умолчанию у функций (пляски с .arguments не веселят)

Это так, недостатки самого языка. Недостатки всей платформы (если можно так выразиться) упираются в кроссбраузерность.

ИМХО ^
  Вверх
Alx
Дата 14.2.2006, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: 10
Всего: 78



что ты подразумеваешь под статичными переменными и ООП?
JavaScript даже слишком ОО...
инклуд есть, чуть-чуть изворотливый, но в общем совсем не сложный
а вот 4 дейчаствительно большой недостаток, кстати, как пример, именно вот такие недостатки я и хотел собрать, то есть не пространные, а конкретные и обидные.


--------------------
PM MAIL WWW ICQ   Вверх
Sardar
Дата 15.2.2006, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Lixil @ 14.2.2006, 17:53 Найти цитируемый пост)
4. Нет аргументов по умолчанию у функций (пляски с .arguments не веселят)

Как представлю такой синтаксис в JS
Код
function test() {
  var ret="";
  
  return function() {
    (arguments[0:3] + [90, "test", somevar]).map(
      function(key, value) {
        ret += "%s => %s\n" % (key, value); //ну это совсем Python =)
      }
     );
     return ret;
  };
}

var a=test("arg 1", 100, ["arg N", "bla", 343], "must be ignored");
alert(a());
// 0 => arg 1
// 1 => 100
// 2 => [ arg N, bla, 343 ]

Ещё бы вызов с именованными аргументами:
Код
function test(arg1, arg2, arg3="def val") {
  var ret="";
  arguments[:].map(function(k, v){ret+="%s => %s\n" % (k, v);});
  alert(ret);
}

test("val 1", arg3="my val", arg2=90);
//arg1 => val 1
//arg2 => 90
//arg3 => my val

Да... красиво было бы smile
Добавлено @ 01:45
А вообще долго тащился smile
Код
#это Ruby, жаль подсветки нет

3.times {
  puts "Cool!"
}

# Cool!
# Cool!
# Cool!
# => 3



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Sardar
Дата 17.2.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Кто пользовал XMLHttpRequest знает что его onreadystatechange исполняеться в отдельном треде. JS не многопоточная среда, все setTimeout, события и прочее исполняеться друг за дргугом, модальное окно alert останавливает исполнение. Раз нет многопоточности, значит нет проблем с синхронизацией, концепция проста и удобна.

В результате "второго треда" от XMLHttpRequest гармония нарушаеться, т.к. средств синхронизации нет приходиться надеяться что "основной тред" и тот что от XMLHttpRequest не возьмуться работать с одной нодой. Хотя шанс на это мал, но всё таки не приятна такая не ясность.

Настоящая трабла возникает в поведении JS обьектов, судя по всему они копируються в новый тред. Попробуйте создать обьект (назововём А), очертить closure которой будет "виден" обьект, отдать полученный closure на onreadystatechange обьекта XMLHttpRequest. В closure измените какое нибудь свойство обьекта А, сразу же убедитесь что свойство изменилось. Напишите кнопку что будет опрашивать изменяемое свойство А. Запускаем, видим что поле обьекта А изменяеться, затем жмём кнопку, удивляемся почему поле того же обьекта А не изменилось.

Обьяснение фокусу пока одно - JS обьект передаваемый в "новый тред" копируеться, обработчик события работает с копией в "новом треде", из него видим что поле изменяеться. События кнопки работают в "основном треде", замечаем что "оригинальная копия" обьекта не изменяеться.

Вечером отправлю полезный код, где сей эффект проявляеться. Хорошо если я не прав и кто нибудь найдёт ошибку, а то не приятна эта магия...


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.