2016-11-30 23 views
0

Я наблюдал 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

Какова точная логика этих расчетов?

+2

«Какова точная логика этих расчетов?» принуждение! – undefined

+1

https://github.com/getify/You-Dont-Know-JS/blob/master/types%20%26%20grammar/ch4.md –

+0

* «Каков ваш ресурс выбора для понимания типа принуждения в javascript? * * Вне темы для SO. Лично я предпочитаю спецификацию. –

ответ

2
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.

Как вы можете видеть, все это понятно, с усилием, ссылаясь на спецификацию. Некоторые из них сложны, но на самом деле сложными являются вещи, с которыми вы почти никогда не сталкивались в реальном мире.

0

понять логику между 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 это помогает :)

1

Что ваш ресурс выбора для понимания типа принуждения в 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.

Правила на самом деле довольно просты и интуитивно понятны, как только вы привыкли к ним, что происходит довольно быстро. Если вы узнаете их из спецификации, сюрпризов нет.

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, но, надеюсь, оно дает вам более четкую картину.

 Смежные вопросы

  • Нет связанных вопросов^_^