|
Вопросы и замечание про JS
|
|
| NecroProger | Отредактировал NecroProger - Понедельник, 13 Июля 2009, 12:42 Дата: 11 Июля 2009, 18:30 | Сообщение # 1 |  ● ● ● ● ● 1024 сообщения Статус: Offline | Итак, хотелось бы задать несколько вопросов и замечаний по поводу JS. 1. Вопрос задавался, а ответа не было. Допустим, объявляем метод: Code Number.prototype.myMethod=function(){ this=this*2; } Пример: Code var m=new Number(5); m.myMethod(); И нифига - thisу нельзя присваивать значение. И чем это объясняется? 2. Как многим известно, вот такая функция random Code random=function(a,b){return Math.floor(Math.random()*(b-a))+a;} вовзращает псевдослучайное целое число от a до (b-1) включительно (кстати, как мне показалось, равномерность выпада одного из чисел плохая - числа выпадают неравномерно даже при большом количестве вызовов). А теперь посмотрим - вдруг функция Math.random() вернёт 1? В этом и вопрос: возможно ли такое или вероятность мала? Я сделал миллион Math.random(), 1 не разу не попалась. Но это не значит, что никогда не попадётся. 3. Интересная особенность JS. Скалярные типы - не объекты. Оказывается, JS не полностью строится на объектах. Определим такую функицю, которая коряво, но всё же - определяет, объект ли параметр: Code function isObj(a){ a.prop=5; return a.prop==5; } Так вот - результаты: function a(){}, a=new Function(), a=function(){} - всё это объекты; 'abc', 123, 123.123 - нет, но new String('abc'), new Number(123), new Number(123.123) - объекты. Интересна именно вторая группа результатов... | | |
|
| Бармалей | Дата: 11 Июля 2009, 20:10 | Сообщение # 2 | ● ● ● ● ● Тиран 7772 сообщения Статус: Offline | Quote (NecroProger) 'abc', 123, 123.123 - нет, но new String('abc'), new Number(123), new Number(123.123) - объекты. Читаем справку по JS. String('abc') создает строку 'abc' new String('abc') создает объект типа string 'abc'. Ну а функции это основа классов. Code typeof(String('111')) → 'string' typeof(new String('111')) → 'object'
 | | |
|
| NecroProger | Дата: 11 Июля 2009, 20:30 | Сообщение # 3 |  ● ● ● ● ● 1024 сообщения Статус: Offline | Quote (Бармалей) Читаем справку по JS. Ссылку, где такое написано. Читал не одну, и не две книги, а такого не видел. Я Вам верю, но интересно, где...  | | |
|
| Бармалей | Дата: 11 Июля 2009, 20:32 | Сообщение # 4 | ● ● ● ● ● Тиран 7772 сообщения Статус: Offline | Quote (NecroProger) Ссылку, где такое написано. Читал не одну, и не две книги, а такого не видел. Сам не помню, но где-то читал... Или на хабре, или на javascript.ru, или где-то еще...
 | | |
|
| cucYa | Дата: 11 Июля 2009, 20:42 | Сообщение # 5 |  ● ● ● ● ● Совращенный мальчик.7317 сообщений Статус: Offline | Бармалей, на oboobs?  | | |
|
| Бармалей | Дата: 11 Июля 2009, 20:55 | Сообщение # 6 | ● ● ● ● ● Тиран 7772 сообщения Статус: Offline | Quote (cucYa) Бармалей, на oboobs?  Нет, я там ничего не читал, только картинки смотрел 
 | | |
|
| NecroProger | Дата: 11 Июля 2009, 21:06 | Сообщение # 7 |  ● ● ● ● ● 1024 сообщения Статус: Offline | Кхм... Не отвлекаемся: остались ДВА вопроса. Стартовая цена - $0. | | |
|
| Бармалей | Дата: 11 Июля 2009, 21:14 | Сообщение # 8 | ● ● ● ● ● Тиран 7772 сообщения Статус: Offline | Quote (NecroProger) И чем это объясняется? this - объект. Возможно у него есть специальное свойство вроде value.
 | | |
|
| NecroProger | Дата: 11 Июля 2009, 23:06 | Сообщение # 9 |  ● ● ● ● ● 1024 сообщения Статус: Offline | Бармалей, вроде перебрал - нету. Только метод, который равен вызванному методу То есть в данном случае myMethod=function(){/*...*/} | | |
|
| Бармалей | Дата: 12 Июля 2009, 07:17 | Сообщение # 10 | ● ● ● ● ● Тиран 7772 сообщения Статус: Offline | Quote (NecroProger) Бармалей, вроде перебрал - нету. Только метод, который равен вызванному методу Я тоже перебирал. Но не все свойства и методы нам видны. Например попробовав пройтись по всем свойствам и методам пустого объекта {} мы увидим пустоту. А между тем у этого объекта есть нативный метод .toString()
 | | |
|
| NecroProger | Дата: 12 Июля 2009, 18:51 | Сообщение # 11 |  ● ● ● ● ● 1024 сообщения Статус: Offline | Quote (Бармалей) Но не все свойства и методы нам видны. Точно, точно, Вы правы. Кстати, пункт 3 можно заменить одним предложением: "Склярные типы - не объекты."Добавлено (12 Июль 2009, 18:51) --------------------------------------------- Бармалей, ещё вопрос. Я посмотрел, какие символы экранирует функция preg_quote в PHP - все нужно экранировать и в JS, кроме "<" и ">". Нужно ли и их экранировать? | | |
|
| Бармалей | Дата: 12 Июля 2009, 19:09 | Сообщение # 12 | ● ● ● ● ● Тиран 7772 сообщения Статус: Offline | Нужно экранировать только те, что есть в регэкспах JS. Ошибочно, например, экранировать - (минус) вне [прямоугольных скобок]. Экранировать нужно эти смволы:Может что-то забыл. Внутри квадратных скобок [] вообще ничего экранировать не нужно, кроме^ это касается только в том случае, если этот символ идет на первом месте внутри скобок. Тут есть интересная особенность: точка (.) внутри таких скобок будет именно точкой, а не любым символом кроме переноса строки. Зато \w будет именно \w т.е. любым сиволом из диапазона /[A-Za-z0-9_]/. Поэтому регулярное выражение для абсолютно любого символа будет выглядеть как \[\s\S]\, а не \[.\n]\. Я с регэкспами пхп не слишком хорошо знаком, но знаю, что они отличиются от регэкспов js (Например, модификаторами).
 | | |
|
| NecroProger | Отредактировал NecroProger - Воскресенье, 12 Июля 2009, 19:14 Дата: 12 Июля 2009, 19:13 | Сообщение # 13 |  ● ● ● ● ● 1024 сообщения Статус: Offline | А разве нельзя так тупо заменить: Code str.replace(/([\/\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\|\:])/g, "\\$1"); Например, в Пхп, как я понял, заменяются все подряд спец-символы... Вообще, нужно, наверное, проверять на практике... Потому что неизвестно, как будет работать \. в []... | | |
|
| Dem0nity | Дата: 12 Июля 2009, 19:17 | Сообщение # 14 | ● ● ● ● ● 62 сообщения Статус: Offline | Quote (NecroProger) 1. Вопрос задавался, а ответа не было. Допустим, объявляем метод: this, к сожелению, "readonly" к счастью есть другой метод: Code Number.prototype.myMethod=function(){ return this * 2; } | | |
|
| NecroProger | Дата: 12 Июля 2009, 19:19 | Сообщение # 15 |  ● ● ● ● ● 1024 сообщения Статус: Offline | Dem0nity, до этого я сам догадался. Мне интересно именно изменение. Ведь свойства у него можно изменять!  | | |
|
| Бармалей | Дата: 12 Июля 2009, 19:22 | Сообщение # 16 | ● ● ● ● ● Тиран 7772 сообщения Статус: Offline | Dem0nity, к сожалению так не пойдет интересно. Хотелось бы модифицировать исходное число. НапримерCode e=5; e.x2(); alert(e)// → 10 Можно объявить свой класс, но в JS есть только метод toString(), а вот toNumber() нету. P.S. e=e.x2(); тоже неинтересно.
 | | |
|
| NecroProger | Дата: 12 Июля 2009, 19:25 | Сообщение # 17 |  ● ● ● ● ● 1024 сообщения Статус: Offline | Quote (Бармалей) Можно объявить свой класс Не понял Вас... | | |
|
| Dem0nity | Дата: 12 Июля 2009, 19:25 | Сообщение # 18 | ● ● ● ● ● 62 сообщения Статус: Offline | Quote (NecroProger) 2. Как многим известно, вот такая функция random попробуй цикл из 10^17 и тогда, уверяю, попадётся и одно целое. Quote (NecroProger) 3. Интересная особенность JS. Оказывается, JS не полностью строится на объектах. Определим такую функицю, которая коряво, но всё же - определяет, объект ли параметр: Quote (NecroProger) a.prop=5; хмм... но a.prop == undefined и 5 != undefined  | | |
|
| NecroProger | Дата: 12 Июля 2009, 19:30 | Сообщение # 19 |  ● ● ● ● ● 1024 сообщения Статус: Offline | Dem0nity, в том то и дело - если параметр - не объект, то свойство не установится, и наоборот в другом случае.Добавлено (12 Июль 2009, 19:30) ---------------------------------------------
Quote (Бармалей) Я с регэкспами пхп не слишком хорошо знаком, но знаю, что они отличиются от регэкспов js У php побольше возможностей, но, зато, регвыры представляются в виде строк, что порождает "зубочистки". | | |
|
| Dem0nity | Дата: 12 Июля 2009, 19:31 | Сообщение # 20 | ● ● ● ● ● 62 сообщения Статус: Offline | Бармалей, а так интересно:  | | |
|