Я наблюдал this talk, и на 16:34 есть Java-тест принуждения:Как понять javascript принуждение?
5 - "4" // 1
5 + "4" // 54
+!{}[true] // 1
+[1] // 1
+[1, 2] // NaN
7 - "a" // NaN
7/0 // Infinity
Какова точная логика этих расчетов?
Я наблюдал this talk, и на 16:34 есть Java-тест принуждения:Как понять javascript принуждение?
5 - "4" // 1
5 + "4" // 54
+!{}[true] // 1
+[1] // 1
+[1, 2] // NaN
7 - "a" // NaN
7/0 // Infinity
Какова точная логика этих расчетов?
5 - "4" // 1
Оператор -
принуждают операнды к номерам. См. the subtraction operator и тезисы ToNumber, которые он использует.
5 + "4" // 54
Когда один из операндов является строкой, то +
является конкатенация, а не сложение, а другой операнд приводится к строке, если это необходимо. См. the addition operator и тезисы ToPrimitive и ToString.
+!{}[true] // 1
Объясняя это бессмысленно. Не делайте этого в своем коде.
О, хорошо:
{}[true]
оценивается первым. true
принуждается к "true"
(через ToString, указанную выше), поскольку он используется в аксессуре свойств и не является символом. {}
- пустой объект, поэтому {}[true]
- undefined
, оставив нас с +!undefined
.!undefined
является true
, потому что принуждают undefined
в булево с помощью абстрактной ToBoolean операции, а затем negates that получить true
.+true
1, из-за ToNumber, связанного выше.+[1] // 1
[1]
представляет собой массив с 1
в нем. Применяя +
, он проходит через ToPrimitive
, конечная цель которого составляет [1].join(",")
, что дает нам ... "1"
. +"1"
- 1 благодаря ToNumber.
+[1, 2] // NaN
Почти так же, как и выше, но поскольку строки "1,2"
не может быть полностью разобран как число, мы получаем NaN
.
7 - "a" // NaN
Почти так же, как наш первый пример. ToNumber("a")
- NaN
, и любые расчеты, связанные с NaN
(такие как вычитание), приводят к NaN
.
7/0 // бесконечность
В JavaScript, деление на 0 определяется как бесконечность; см. Applying the/Operator.
Как вы можете видеть, все это понятно, с усилием, ссылаясь на спецификацию. Некоторые из них сложны, но на самом деле сложными являются вещи, с которыми вы почти никогда не сталкивались в реальном мире.
понять логику между symbold, которые имеют функции:
1.) 5 (целое число типа) минус 4 (строкового типа) приводит к 1, 4 реализован как INT
2.) 5 (целое тип) плюс 4 (тип строки) приводит к 54, 5 реализован в виде строки
3.) + плюс! не {} скобки приводит к истинным
4.) плюс массив один + [1], приводит к 1
5.) плюс массиву один и два (несколько набор данных), результаты Nan, не выполнимо
6.) 7 (INT) минус строка ("а"), приводит к Нэн, так как его не представляется возможным
7.) 7 деления на 0, приводит к бесконечности, как математические функции, если число делится на 0 всегда бесконечен
Wiki: принуждение/koʊɜːrʃən/практика вынуждает другую сторону действовать в непроизвольной форме с помощью запугивания или угроз или какой-либо другой формы давления или силы.
как номер 1, ИНТ на строку, которая не подходит и сильно написано
Это просто, чтобы помочь вам понять логику за language.Hope это помогает :)
Что ваш ресурс выбора для понимания типа принуждения в javascript?
spec.
Некоторые примеры:
, чтобы понять, почему 5 - "4" === 1
, я хотел бы посмотреть на binary - operator in the spec и посмотреть, что ToNumber
называется на каждый аргумент.
, чтобы понять, почему +!{}[true] === 1
, я бы сначала понять, что {}[true]
использует bracket notation property accessor, который использует ToPropertyKey на значение, которое будет использовать ToString на true
так true
не символ, так же, как и {}["true"]
, и с тех пор этот объект не имеет свойства, называемого «true», результат не определено, а затем, чтобы понять, почему +!undefined === 1
Я бы посмотрел на spec для unary logical ! operator и увидел, что он использует ToBoolean
(перед отрицанием результата) и ToBoolean преобразует в false
. Чтобы понять, почему +true === 1
, я бы посмотрел на spec для unary + operator и увидел, что он вызывает ToNumber в своем операнде, а ToNumber оценивает true
по 1
.
Правила на самом деле довольно просты и интуитивно понятны, как только вы привыкли к ним, что происходит довольно быстро. Если вы узнаете их из спецификации, сюрпризов нет.
Чтобы понять принуждение, вам просто нужно понять, что происходит. Во-первых, JavaScript - это динамически типизированный язык. В отличие от некоторых других языков программирования, JavaScript не требует определения типа переменной.
Пример:
var a = 1
//you are not telling JavaScript that
// 1 is an integer, you are just defining it as is
Так до попытки срыва примеры вы перечислили, вы должны понимать, что рядом применить method
к объекту, оба метода должны быть одинаковыми type
.
Пример:
5 + "hello" = ?
// in math, you can't possibly add a number to a word right?
// and JavaScript realises that.
// But instead of throwing an error, it "coerces" the
// integer 5, into a string "5",
// giving you the answer "5hello"
В заключение я хотел бы использовать первые 2 примера в качестве контраста для принуждения.
Первый содержит 5 - "4" = 1
, а второй - 5 + "4" = "54"
. Основная причина разницы в результате в значительной степени связана с вовлеченным символом. Хотя мы можем «добавить» строки вместе (просто присоединяясь к ним), но как именно мы должны «зачеркивать» строки?
Хотя это может быть очень краткое объяснение принуждения в JavaScript, но, надеюсь, оно дает вам более четкую картину.
«Какова точная логика этих расчетов?» принуждение! – undefined
https://github.com/getify/You-Dont-Know-JS/blob/master/types%20%26%20grammar/ch4.md –
* «Каков ваш ресурс выбора для понимания типа принуждения в javascript? * * Вне темы для SO. Лично я предпочитаю спецификацию. –