Короткие полезные уроки JavaScript - сделайте это легко.

Часть 2

В JavaScript много странностей. Во второй части Магического поведения JavScript я делюсь списком моих любимых. Если вы хотите большего, у вас есть больше примеров в Магическом поведении JavaScript I.
Чтобы сделать эту статью более доступной, я сосредоточусь на случаях, которые кажутся наиболее простыми для понимания.

Случаи

  • банан
  • Правда, но неправда
  • Добавление массивов
  • Неопределенный и Число
  • Неопределенный может быть определен
  • Неопределенный всегда не определен
  • Лексикографическая сортировка
  • null - это объект, но undefined не определено

Банан

'b' + 'a' + + 'a' + 'a'; 
//'BaNaNa'
('b' + 'a' + + 'a' + 'a').toLowerCase()
//banana

Объяснение:

Выражение оценивается как ‘ba’ + (+ ’a’), что преобразует + ’a’ не в число. Затем выражение NaN + ’a’ оценивается как NaN a, а конечный результат - baNaNa.

Правда, но неправда

Обратите внимание !! Оператор преобразует объект в логическое значение.

Null - это ложное значение, но оно не равно false.

!!null; 
//false
null == false; 
//false

Объяснение:

Вы не можете преобразовать null (и undefined) в любое другое значение до сравнения равенства, поэтому null == false равно false.

Массив и пустой массив всегда являются истинным значением, но не равны true.

!![]       
//true
[] == true 
//false

Объяснение:

True преобразуется в 1, а [] преобразуется в 0, поэтому [] == true (0 == 1) равно false.

Добавление массивов

[9, 8, 7] + [6, 5, 4] 
//"9,8,76,5,4"

Этот результат возникает из-за того, что при суммировании двух коллекций в каждом массиве вызывается «toString», поэтому [9,8,7] преобразуется в «9,8,7», а [6,5,4] преобразуется в « 6,5,4 », а затем происходит конкатенация.

Неопределенный и Число

Если вы не передадите никаких аргументов конструктору Number, вы получите 0. Если аргумента нет, вы получите undefined, а с нулевым значением вы получите 0. Но с undefined вместо этого вы получите NaN.

Number(true)
//1
Number(false)
//0
Number(null)
//0
Number()
//0
Number(undefined)
//NaN

Экспликация:

Если при вызове функции аргументы не были переданы, вы получите 0.
В противном случае вы получите ToNumber (значение). В случае undefined ToNumber (undefined) возвращает NaN.

Неопределенный всегда не определен

В следующем примере ничего странного не происходит:

let team;
console.log(team == undefined); 
//true

Но что здесь происходит?

undefined = "A Team";
let team;
console.log(team == undefined); 
//true
console.log(undefined);
//undefined

Объяснение:

Неопределенное - зарезервированное слово в JavaScript, и вы не можете присвоить ему значение.

Лексикографическая сортировка

Вы можете отсортировать элементы массива с помощью метода сортировки.

[’z’, 'a’, 'b’].sort()
//[ "a", "b", "z" ]

Что здесь происходит?

[1,2,11].sort()
//[ 1, 11, 2 ]

Объяснение:

В JavaScript числовые значения по умолчанию отсортированы лексикографически, и это может привести к странным результатам.

Вы можете изменить это поведение, используя функцию сравнения:

[1,2,11].sort( (a, b) => a - b )
//[ 1, 2, 11]

null - это объект, но undefined не определено

В JavaScript есть как null, так и undefined, и хотя они выглядят одинаково, они очень разные.

typeof(undefined)
"undefined"
typeof(null)
"object"

Объяснение

Такое поведение является побочным эффектом первой реализации JavaScript. Значения были представлены как тег типа плюс значение. Тем не менее, null был обработан с указателем NULL. Тег типа для объектов был 0. В результате null также интерпретируется как объект.

Вывод

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

Надеюсь, вам понравилась эта статья. У вас есть другие примеры в Магическое поведение JavaScript I.

использованная литература

Большинство этих примеров навеяно докладом Брайана Леру в 2012 году.

Фотография fotografierende.