Десять странностей и тайн о JavaScript

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 объект, с помощью которогоВы можете создавать динамические регулярные выражения, в отличие от статических.Большинство регулярных выражений объявляются с помощью короткой форме (т.е. заключен в косую черту, как мы делали выше).Таким образом, хотя, Вы не можете ссылаться на переменные, таким образом делая динамической модели является impossibleRegExp(), хотя, вы 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';

З …

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.