JavaScript — очень отказоустойчивый язык программирования, и многие выражения, которые недопустимы в других языках программирования, будут нормально работать в JavaScript.
Это приводит к появлению большого количества странного кода. Вы хотите бросить ему вызов?
В этом задании вам будут предложены 20 дурацких выражений и предложено угадать их результат.
1.
правда + ложь
2.
**1.**
3.
[1, 2, 3] + [4, 5, 6]
4.
0,2 + 0,1 === 0,3
5.
10,2
6.
!!""
7.
+!![]
8.
true == "true"
9.
010 - 03
10.
"" - - ""
11.
null + 0
12.
0/0
13.
1/0 === 10 ** 1000
14.
true++
15.
"" - 1
16.
(ноль - 1) - "1"
17.
38 * 4343 * 2342+ («истина» — 0)
18.
5 + !5 + !!5
19.
[] + [1] + 2
20.
1 + 2 + «3»
true + false
При попытке использовать оператор сложения (+) между двумя логическими значениями они преобразуются в числа.
И мы все знаем true
следует преобразовать в 1
, а false
— в 0
. Таким образом, true+false
возвращает 1
.
[,,,].length
[,,,]
выводит массив с тремя пустыми слотами. Последняя запятая — это завершающая запятая.
Вы можете думать об этом так.
[,] ==> [пусто,] [,,] ==> [пусто, пусто,] [,,,] ==> [пусто, пусто, пусто,]
поэтому [,,,].length
возвращает 3.
[1, 2, 3] + [4, 5, 6]
Когда вы пытаетесь использовать оператор сложения (+) между массивами, они преобразуются в строки.
При преобразовании массива в строку вызывается метод массива toString()
. Метод toString()
используется внутри JavaScript. Когда массив необходимо отобразить в виде текста, он соединяет его элементы запятыми.
[1, 2, 3].toString() ==> '1, 2, 3' [4, 5, 6].toString() ==> '4, 5, 6'
, поэтому
[1, 2, 3] + [4, 5, 6] ==> '1, 2, 3' + '4 , 5, 6' ==> "1,2,34,5,6"
0,2 + 0,1 === 0,3
Поскольку числа с плавающей запятой трудно точно представить на компьютерах, математические 0.1
и 0.2
можно лишь аппроксимировать на компьютерах. представительство.
Результат 0.1+0.2
не совсем равен 0.3
. Не только JavaScript, другие языки программирования имеют ту же проблему.
10, 2
Запятая ( ,
) также является допустимым оператором в JavaScript: она оценивает каждый операнд (слева направо) и возвращает значение последнего операнда.
Следовательно, 10,2 возвращает 2
!!""
""
— пустая строка, которая является фиктивным значением.
Примечание. 0, пустая строка «», null и undef — все виртуальные значения.
!
— логический оператор «нет», превращающий истину в ложь и наоборот.
Если мы используем !
дважды, то есть !!
, оно преобразует обычное значение в логическое значение. Итак !""
возвращает false
.
+!![]
являются истинными значениями, даже пустые массивы. Итак, !![]
вернет true
.
!![]; // -> true
и знак +
преобразует истинное значение в его числовое представление: 1
, поэтому +!![]
возвращает 1
.
true == "true"
Оператор равенства (==) проверяет, равны ли два его операнда, и возвращает логический результат.
Согласно правилам абстрактного сравнения на равенство, оба значения при сравнении преобразуются в числа.
true == "true" ==> Number(true) == Number("true") ==> 1 == NaN
Итак, ture =="true"
возвращает false.
010 - 03
Вот небольшая хитрость: если число начинается с 0
, в JavaScript оно рассматривается как восьмеричное. Итак:
010 - 03 ==> 8 - 3 ==> 5
Также:
""--""
Кажется, это плохой синтаксис, но он работает нормально.
Пустую строку можно преобразовать в логическое значение false или числовое значение 0. Итак -""
равен 0
null + 0
Как мы уже говорили, null
— это виртуальное значение. Он будет преобразован в логическое значение false
или числовое значение 0
. Таким образом, результат возвращает 0
.
0/0
Это незаконное математическое выражение. Уравнение 0/0 не имеет какого-либо значимого числового ответа, на выходе будет просто NaN
.
1/0 === 10 1000**
Хотя 1/0
как и раньше, является недопустимым математическим выражением. Но когда делитель не равен 0
, JavaScript считает, что результатом этого выражения является Infinity
.
А 10**1000
— это большое число, и JS не может правильно представить это число. (Наивысшее целое значение в JavaScript — 2^53-1
). Так что 10 * 1000
тоже считается бесконечностью.
Бесконечность всегда равна другой бесконечности, поэтому 1/0 === 10 ** 1000
возвращает true.
true++
В этом нет ничего особенного, это просто синтаксическая ошибка.
""- 1Хотя
оператор сложения (+) работает как с числами, так и со строками, оператор вычитания (-) бесполезен со строками, поэтому JavaScript интерпретирует его как операцию между числами. Пустая строка будет приведена к 0.
"" - 1 ==> Число("") - 1 ==> 0 - 1 ==> -1,
поэтому "" — 1
возвращает -1
(ноль - 1) - "1",
как указано выше.
ноль ==> 0 (ноль - 1) ==> -1 «1» ==> 1
so (null — 1) — “1”
возвращает -2
38 4343 2342+ («true» — 0).
Вы можете заподозрить, что JS настолько сумасшедший, что преобразует строку «true». Является ли числовое значение представление логического значения true. Однако это не такое уж безумие. На самом деле происходит то, что он пытается преобразовать строку в число, но безуспешно.
Number("true"); // -> NaN
В числовых операциях JavaScript, если одно значение равно NaN, конечный результат операции должен быть NaN. 38 * 4343 * 2342
это просто дымовая завеса.
5 + !5 + !!5,
как указано выше.
Итак:
!5 ==> 0 !!5 ==> 1
[] + [1] + 2
При попытке использовать оператор сложения (+) между массивами они преобразуются в строки.
[] ==> '' [1] ==> '1' [] + [1] ==> '1' '1' + 2 ==> '12',
поэтому результат будет '12'.
1 + 2 + «3»
JavaScript выполняет эти операции слева направо. Когда к строке 3 добавляется число 3, конкатенация строк будет иметь приоритет.
1 + 2 // -> 3; 3 + «3»; // -> «33»
Честно говоря, эти задачи не приносят никакой пользы нашим навыкам кодирования, поэтому такой код не следует писать в реальных проектах
. Однако считайте эти навыки друзьями. разве это не очень интересно — притвориться 13-летним с коллегами?
Автор: Марина Мости
Источник: средний
Исходный текст: https://medium.com/frontend-canteen/20-useless-but-funny-challange-for-javascript-develor-9eea39bb8efb
[Рекомендации по соответствующему видеоуроку: веб-интерфейс]
Выше приведены 20 странных JS-выражений. , угадайте выходной результат! Для получения более подробной информации, пожалуйста, обратите внимание на другие статьи по теме на китайском сайте php!