JavaScript.Сразу странной и в то же красивой, это, конечно, язык программирования, который Пабло Пикассо бы придумать.Null видимо объекта, пустой массив, видимо равна false
, и функции толков вокруг, как будто они были теннисные balls.
Эта статья направлена на промежуточных разработчиков, кто интересуется более продвинутый JavaScript.Он представляет собой набор странностей JavaScript и ухоженный тайны.Некоторые разделы как мы надеемся, даст вам понимание того, как эти раритеты могут быть полезны для вашего кода, в то время как другие разделы чистых материалов WTF.Итак, давайте started.
Типы данных и Definitions
1.Null является Object
Давайте начнем с любимым странность наличие всех, так известна, как она есть.Null видимому объекту, который, насколько противоречия идти, прямо там с лучшим из них.NULL?Объект?”Конечно, определение нулевого является полное отсутствие значимого value” вы говорите.Вы были бы правы.Но это так оно и есть.Вот доказательство:
alert(typeof null); //alerts 'object'
Несмотря на это, нулевой не считается экземпляр of объект.(В случае, если Вы не знаете, значения в JavaScript являются экземплярами базы объектов Таким образом, каждый номер экземпляра Number
. Объектов, каждый объект является экземпляром Object
объекта, и так далее.) Этовозвращает нас к здравомыслию, потому что, если нулевых является отсутствие значение, то оно, очевидно, не может быть экземпляром ничего.Таким образом, следующие оценивается в false
:
alert(null instanceof Object); //evaluates false
2.NaN является Number
Вы думали, что нулевые быть объектом было смешно?Попробуйте дело с идеей NaN
— “не число” — быть рядом!Кроме того, NaN
не считать равным себе!Имеет ли ваша голова болела еще
alert(typeof NaN); //alerts 'Number' alert(NaN === NaN); //evaluates false
На самом деле NaN
__ будет 9 | не равно anything.Единственный способ, чтобы подтвердить, что что-то NaN
осуществляется с помощью функции isNaN()
.
3.Массив без ключей == False (О Truthy и Falsy)
Вот еще одна любимая наличие странность:
alert(new Array() == false); //evaluates true
Чтобы понять, что здесь происходит, необходимо разобраться в понятиях truthy и falsy.Они являются своего рода истина / ложь-Lite, который будет гнев вас несколько, если вы специализировался в области логики или philosophy.
Я читал много объяснений о том, что truthy и falsy есть, и я чувствую, что самый простой для понимания заключается в следующем: в JavaScript, каждого не-логическое значение имеет встроенный логический flag, что называется, когдаЗначение попросили вести себя как логический, как, например, когда вы сравните его с boolean.
Потому что яблоки не может быть по сравнению с грушами, когда наличие просят сравнить значения различных типов данных, это первое “ coerces” их в общий тип данных.False
zero
null
undefined
, пустых строк и NaN
все в конечном итоге становится false
— Не постоянно, только дляданное выражение.Например на помощь:
var someVar = 0; alert(someVar == false); //evaluates true
Здесь мы пытаемся сравнить количество 0
для логического false
.Поскольку эти типы данных несовместимы, JavaScript тайно принуждает нашу переменную в своем truthy или falsy equivalent, что в случае 0
(как я уже сказал выше) falsy.
Вы, возможно, заметили, что я не включать пустые массивы в списке бюстгальтер с прокладкой выше.Пустые массивы любопытные вещи: они на самом деле оценить в truthy but, по сравнению с логическим, ведут себя как falsy.Запутались?С благое дело.Другим примером может быть
var someVar = []; //empty array alert(someVar == false); //evaluates true if (someVar) alert('hello'); //alert runs, so someVar evaluates to true
Чтобы избежать принуждения, вы можете использовать значение и тип сравнения operator, ===
, (в отличие от ==
, который сравнивает только по значению).Итак:
var someVar = 0; alert(someVar == false); //evaluates true – zero is a falsy alert(someVar === false); //evaluates false – zero is a number, not a boolean
Уф.Как вы, наверное, собрались, это обширная тема, и я рекомендую прочитать больше на него — в частности, на данных принуждения, которые, хотя и не однозначно концепции JavaScript, тем не менее видное место в JavaScript.
Я обсудить концепцию truthy и falsy и данные принуждения более более here.И если вы действительно хотите, чтобы погрузить Ваши зубы в то, что происходит внутри, когда наличие предлагается сравнить два значения, а затем проверить раздел 11.9.3 в ECMA-262 документ specification.
Обычная Expressions
4.заменить () может принимать звонок Function
Это один из самых больших секретов JavaScript и прибыл в v1.3.Большинство обычаев replace()
выглядеть примерно так:
alert('10 13 21 48 52'.replace(/d+/g, '*')); //replace all numbers with *
Это простой замены: строка, звездочка.Но что, если мы хотели больше контроля над тем, как и когда наша замена происходит?Что если мы хотим, чтобы заменить только цифры до 30?Это не может быть достигнуто с помощью регулярных выражений в одиночку (они все строки, в конце концов, не математику).Мы должны прыжок в функцию обратного вызова для оценки каждого match.
alert('10 13 21 48 52'.replace(/d+/g, function(match) { return parseInt(match) < 30 ? '*' : match; }));
Для каждого матча сделал, JavaScript вызывает нашу функцию, передавая матча в нашем матче аргумент.Затем мы возвращаемся либо звездочки (если количество соответствующих находится под 30) или матч себе (т.е. ни в какое сравнение должно происходить)
5.Регулярные выражения: Больше, чем просто матч и Replace
Многие промежуточные JavaScript разработчикам получить, только на match
и replace
с регулярными выражениями.Но наличие определяет несколько методов, чем эти two.
Особый интерес представляет test()
, который работает как match
исключением того, что он не возвращает матчей: он просто подтверждает ли картина matches.В этом смысле, это вычислительно lighter.
alert(/w{3,}/.test('Hello')); //alerts 'true'
Выше выглядит по шаблону из трех или более алфавитно-цифровых символов, и потому строки Hello
отвечает этому требованию, мы получаем true
.Мы не получаем фактический матч, просто result.
Также следует отметить, RegExp
объект, с помощью которогоВы можете создавать динамические регулярные выражения, в отличие от статических.Большинство регулярных выражений объявляются с помощью короткой форме (т.е. заключен в косую черту, как мы делали выше).Таким образом, хотя, Вы не можете ссылаться на переменные, таким образом делая динамической модели является impossible.С RegExp()
, хотя, вы can.
function findWord(word, string) { var instancesOfWord = string.match(new RegExp('\b'+word+'\b', 'ig')); alert(instancesOfWord); } findWord('car', 'Carl went to buy a car but had forgotten his credit card.');
Вот, мы делаем динамическую модель основана на значении аргумента word
.Функция возвращает количество раз, что word
появляется в строке как слово само по себе (т.е. не как часть другого слова).Таким образом, наш пример возвращает car
один раз, не обращая внимания на car
жетоны в словах Carl
и card
.Это заставляет этом, проверяя границы слова (b
) по обе стороны от слова, которое мы ищем for.
Из-за RegExp
задаются как строки, а не через прямой слэш синтаксис, мы можем использовать переменные в создании картины.Это также означает, однако, что мы должны дважды бежать специальные символы, как мы сделали с нашей границей слова character.
Функции и Scope
6.Вы можете поддельные Scope
Область, в которой что-то выполняет определяет, какие переменные являются доступными.Отдельно стоящие JavaScript (т.е. наличие, которая не работает внутри функции) действует в рамках глобального масштаба window
Объект, к которому все имеет доступ, в то время как локальные переменные, объявленные внутри функции доступны только внутри этой функции, не outside.
var animal = 'dog'; function getAnimal(adjective) { alert(adjective+' '+this.animal); } getAnimal('lovely'); //alerts 'lovely dog';
З …
Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров