Как вы думаете, какие «скрытые возможности» JavaScript должен знать каждый программист?
Увидев превосходное качество ответов на следующие вопросы, я подумал, что пришло время спросить его о JavaScript.
- Скрытые возможности HTML
- Скрытые возможности CSS
- Скрытые возможности PHP
- Скрытые возможности ASP.NET
- Скрытые возможности C #
- Скрытые возможности Java
- Скрытые возможности Python
Хотя JavaScript является, пожалуй, самым важным языком на стороне клиента (просто спросите Google), удивительно, как мало большинство веб-разработчиков понимают, насколько он действительно мощный.
javascript
hidden-features
Binoj Antony
источник
источник
Ответы:
Вам не нужно определять какие-либо параметры для функции. Вы можете просто использовать
arguments
массив-подобный объект функции.источник
arguments
объект делает вызов функции намного медленнее, например. аргументы if (false); будет больно перф.arguments.callee
это устарело.Я мог бы процитировать большую часть превосходной книги Дугласа Крокфорда « JavaScript: хорошие части» .
Но я возьму только один для вас, всегда используйте
===
и!==
вместо==
и!=
==
не является переходным. Если вы используете===
его, вы получите ложь для всех этих утверждений, как и ожидалось.источник
==
это'\n\t\r ' == 0
=>true
...: DФункции являются гражданами первого класса в JavaScript:
Методы функционального программирования могут быть использованы для написания элегантного JavaScript .
В частности, функции могут передаваться как параметры, например, Array.filter () принимает обратный вызов:
Вы также можете объявить «частную» функцию, которая существует только в пределах определенной функции:
источник
new Function()
как зло , какeval
. Не используй.Вы можете использовать оператор in, чтобы проверить, существует ли ключ в объекте:
Если вы находите литералы объекта слишком уродливыми, вы можете объединить их с функцией без параметров tip:
источник
Присвоение значений по умолчанию переменным
Вы можете использовать логический или оператор
||
в выражении присваивания, чтобы предоставить значение по умолчанию:a
Переменная получит значениеc
только тогда , когдаb
это falsy (если естьnull
,false
,undefined
,0
,empty string
, илиNaN
), в противном случаеa
получите значениеb
.Это часто полезно в функциях, когда вы хотите задать значение по умолчанию для аргумента, если он не указан:
Пример отката IE в обработчиках событий:
Следующие языковые функции были с нами в течение долгого времени, все реализации JavaScript поддерживают их, но они не были частью спецификации до выпуска ECMAScript 5th Edition :
debugger
заявлениеОписано в: § 12.15 Оператор отладчика
Это утверждение позволяет вам устанавливать программные точки останова в вашем коде просто:
Если отладчик присутствует или активен, он сразу же прекратит работу прямо в этой строке.
В противном случае, если отладчик отсутствует или активен, этот оператор не имеет видимого эффекта.
Многострочные строковые литералы
Описано в: § 7.8.4 Строковые литералы
Вы должны быть осторожны, потому что символ рядом с
\
должен быть символом конца строки, если после пробела,\
например, код будет выглядеть точно так же, но он вызовет aSyntaxError
.источник
У JavaScript нет блочной области видимости (но у него есть замыкание, поэтому давайте назовем его даже?).
источник
Вы можете получить доступ к свойствам объекта с помощью
[]
вместо.
Это позволяет вам искать свойство, соответствующее переменной.
Вы также можете использовать это, чтобы получить / установить свойства объекта, имя которого не является допустимым идентификатором.
Некоторые люди не знают этого и заканчивают тем, что используют eval () как это, что является действительно плохой идеей :
Это сложнее для чтения, труднее найти ошибки (нельзя использовать jslint), медленнее выполнять и может привести к эксплойтам XSS.
источник
foo.bar
в соответствии со спецификацией в любом случае ведет себя так же, какfoo["bar"]
. Также обратите внимание, что все является строковым свойством. даже когда выarray[4]
обращаетесь к массиву, 4 преобразуется в строку (опять же, по крайней мере, в соответствии со спецификацией ECMAScript v3)Если вы ищете Google справочник JavaScript по данной теме, включите ключевое слово «mdc» в свой запрос, и ваши первые результаты будут получены из Центра разработчиков Mozilla. Я не ношу с собой никаких офлайновых ссылок или книг. Я всегда использую трюк с ключевым словом "mdc", чтобы напрямую получить то, что я ищу. Например:
Google: javascript array sort mdc
(в большинстве случаев вы можете опустить «javascript»)
Обновление: Центр разработчиков Mozilla переименован в Сеть разработчиков Mozilla . Трюк с ключевым словом "mdc" все еще работает, но довольно скоро нам, возможно, придется начать использовать вместо него "mdn" .
источник
Может быть, немного очевидным для некоторых ...
Установите Firebug и используйте console.log ("привет"). Намного лучше, чем использование random alert (); я помню, что это делал много лет назад.
источник
Частные Методы
Объект может иметь приватные методы.
источник
Также упоминается в «Javascript: Хорошие части» Крокфорда:
parseInt()
опасный. Если вы передадите ей строку, не сообщив ей о надлежащей базе, она может вернуть неожиданные числа. Например,parseInt('010')
возвращает 8, а не 10. Передача базы в parseInt заставляет его работать правильно:источник
Math.floor
илиNumber
?10 === Math.floor("010"); 10 === Number("010");
плавает:42 === Math.floor("42.69"); 42.69 === Number("42.69");
parseInt
функцию можно легко заставить сделать что-то не столь безобидное.__parseInt = parseInt; parseInt = function (str, base) { if (!base) throw new Error(69, "All your base belong to us"); return __parseInt(str, base); }
Функции являются объектами и поэтому могут иметь свойства.
источник
Я должен был бы сказать, что выполняющиеся функции.
Поскольку Javascript не имеет области видимости блока , вы можете использовать самовыполняющуюся функцию, если хотите определить локальные переменные:
Здесь
myvar
is не вмешивается и не загрязняет глобальную область и исчезает, когда функция завершается.источник
.js
файлы в анонимную самовыполняющуюся функцию и прикрепляю кwindow
объекту все, что захочу в глобальном масштабе . Предотвращает глобальное загрязнение пространства имен.Знайте, сколько параметров ожидается функцией
Знайте, сколько параметров получено функцией
источник
function.length
.Вот несколько интересных вещей:
NaN
с чем - либо (дажеNaN
) всегда ложно, что включает в себя==
,<
и>
.NaN
Обозначает не число, но если вы спросите тип, он на самом деле возвращает число.Array.sort
может принимать функцию сравнения и вызывается драйвером, подобным быстрой сортировке (зависит от реализации).$0
,$1
,$2
члены на регулярное выражение.null
отличается от всего остального. Это ни объект, ни логическое значение, ни число, ни строкаundefined
. Это немного похоже на «альтернативу»undefined
. (Примечание:typeof null == "object"
)this
внешнем контексте выдает иначе неименуемый объект [Global].var
, а не просто автоматического определения переменной дает среде выполнения реальный шанс оптимизировать доступ к этой переменнойwith
Конструкция будет уничтожать такой optimzationsbreak
. Петли могут быть помечены и использованы в качестве целиcontinue
.undefined
. (зависит от реализации)if (new Boolean(false)) {...}
выполнит{...}
блок[немного обновлено в ответ на хорошие комментарии; пожалуйста, смотрите комментарии]
источник
typeof null
возвращает «объект».undefined
, но это просто значение по умолчанию, которое вы получаете при поиске несуществующего индекса. Если вы проверили [2000], это тоже будетundefined
, но это не значит, что вы уже выделили для него память. В IE8 некоторые массивы плотные, а некоторые - разреженные, в зависимости от того, что чувствовал движок JScript в то время. Подробнее читайте здесь: blogs.msdn.com/jscript/archive/2008/04/08/…Я знаю, что опаздываю на вечеринку, но я просто не могу поверить, что
+
полезность оператора не была упомянута, кроме как «преобразовать что-либо в число». Может быть, как хорошо это скрыто?Конечно, вы можете сделать все это, используя
Number()
вместо этого, но+
оператор намного красивее!Вы также можете определить числовое возвращаемое значение для объекта, переопределив метод прототипа
valueOf()
. Любое преобразование чисел, выполненное для этого объекта, не приведетNaN
к возвращению значенияvalueOf()
метода:источник
0xFF
и т. Д., Не нужно+"0xFF"
.0xFF
, почти так же, как вы можете написать1
вместо+true
. Я предлагаю, чтобы вы могли использовать+("0x"+somevar)
в качестве альтернативыparseInt(somevar, 16)
, если хотите.« Методы расширения в JavaScript » через свойство prototype.
Это добавит
contains
метод ко всемArray
объектам. Вы можете вызвать этот метод, используя этот синтаксисисточник
Чтобы правильно удалить свойство из объекта, вы должны удалить свойство вместо того, чтобы просто установить его как неопределенное :
Свойство prop2 по- прежнему будет частью итерации. Если вы хотите полностью избавиться от prop2 , вы должны вместо этого сделать:
Свойство prop2 больше не будет появляться , когда вы перебираете свойства.
источник
with
,Он редко используется и, честно говоря, редко полезен ... Но, в ограниченных обстоятельствах, он имеет свое применение.
Например: литералы объекта очень удобны для быстрой настройки свойств нового объекта. Но что, если вам нужно изменить половину свойств существующего объекта?
Алан Сторм отмечает, что это может быть несколько опасно: если объект, используемый в качестве контекста, не имеет одного из назначаемых свойств, он будет разрешен во внешней области, возможно создавая или перезаписывая глобальную переменную. Это особенно опасно, если вы привыкли писать код для работы с объектами, где свойства со значениями по умолчанию или пустыми значениями остаются неопределенными:
Поэтому, вероятно, будет хорошей идеей избегать использования
with
оператора для такого назначения.См. Также: Существуют ли законные варианты использования оператора «with» в JavaScript?
источник
Методы (или функции) можно вызывать для объектов, которые не относятся к тому типу, с которым они были разработаны для работы. Это здорово - вызывать собственные (быстрые) методы для пользовательских объектов.
Этот код вылетает, потому что
listNodes
это неArray
Этот код работает, потому что
listNodes
определяет достаточно массивоподобных свойств (длина, оператор []) для использованияsort()
.источник
Наследование прототипа (популяризируемое Дугласом Крокфордом) полностью революционизирует ваше представление о множестве вещей в Javascript.
Это убийца! Жаль, что почти никто не использует это.
Это позволяет вам «создавать» новые экземпляры любого объекта, расширять их, сохраняя при этом (живую) прототипную связь наследования с другими их свойствами. Пример:
источник
Некоторые называют это делом вкуса, но:
Оператор трины может быть прикован к цепочке, чтобы действовать как схема (cond ...):
можно записать как ...
Это очень «функционально», так как ветвит ваш код без побочных эффектов. Так что вместо:
Ты можешь написать:
Хорошо работает с рекурсией тоже :)
источник
Числа также являются объектами. Таким образом, вы можете делать такие классные вещи, как:
источник
times
неэффективна:Math.floor
вызывается каждый раз, а не один раз.Как насчет замыканий в JavaScript (аналогично анонимным методам в C # v2.0 +). Вы можете создать функцию, которая создает функцию или «выражение».
Пример замыканий :
источник
Вы также можете расширять (наследовать) классы и переопределять свойства / методы, используя цепочку прототипов spoon16, на которую ссылаются.
В следующем примере мы создаем класс Pet и определяем некоторые свойства. Мы также переопределяем метод .toString (), унаследованный от Object.
После этого мы создаем класс Dog, который расширяет Pet и переопределяет метод .toString (), снова изменяя его поведение (полиморфизм). Кроме того, мы добавляем некоторые другие свойства в дочерний класс.
После этого мы проверяем цепочку наследования, чтобы показать, что Dog по-прежнему имеет тип Dog, тип Pet и тип Object.
Оба ответа на этот вопрос были кодами, модифицированными из великолепной статьи MSDN Рэя Джаджадината.
источник
Вы можете ловить исключения в зависимости от их типа. Цитируется из MDC :
ПРИМЕЧАНИЕ. Условные предложения catch являются расширением Netscape (и, следовательно, Mozilla / Firefox), которое не является частью спецификации ECMAScript и, следовательно, на него нельзя положиться, за исключением отдельных браузеров.
источник
С верхней части моей головы...
функции
arguments.callee ссылается на функцию, которая содержит переменную «arguments», поэтому ее можно использовать для рекурсии анонимных функций:
Это полезно, если вы хотите сделать что-то вроде этого:
Объекты
Интересная вещь о членах объекта: у них может быть любая строка в качестве их имен:
Струны
String.split может принимать регулярные выражения в качестве параметров:
String.replace может принимать регулярное выражение в качестве параметра поиска и функцию в качестве параметра замены:
источник
arguments.callee
устарела иВы можете использовать объекты вместо переключателей большую часть времени.
Обновление: если вы обеспокоены тем, что дела, оцениваемые заранее, являются неэффективными (почему вы беспокоитесь об эффективности на раннем этапе разработки программы ??), тогда вы можете сделать что-то вроде этого:
Это более обременительно для типа (или чтения), чем для переключателя или объекта, но оно сохраняет преимущества использования объекта вместо переключателя, как подробно описано в разделе комментариев ниже. Этот стиль также делает более простым превращение этого в надлежащий «класс», как только он вырастет достаточно.
update2: с предлагаемыми расширениями синтаксиса для ES.next, это становится
источник
var arr = []; typeof arr; // object
Обязательно используйте метод hasOwnProperty при переборе свойств объекта:
Это сделано для того, чтобы вы имели доступ только к прямым свойствам anObject и не использовали свойства, которые находятся в цепочке прототипов.
источник
Закрытые переменные с открытым интерфейсом
Он использует аккуратный трюк с определением функции, вызывающей себя. Все, что находится внутри возвращаемого объекта, доступно в общедоступном интерфейсе, а все остальное является приватным.
источник