Какая арифметическая операция приведет к ошибке js

Современный учебник JavaScript. Contribute to javascript-tutorial/ru.javascript.info development by creating an account on GitHub.
title: Язык JavaScript description: Только сам JavaScript, без браузерных и иных расширений. slug: js-basic questionsToAskCount: 20 weight: 1 questions: — content: | Что получится, если сложить `true + false`? type: single answers: — `»truefalse»``0``1``NaN` correctAnswer: 2content: | После выполнения этого кода — в каких объектах из списка содержится свойство `name`? «`js function User() { } let vasya = new User(); vasya.__proto__.name = «Vasya»; «` type: multi answers: — `vasya.__proto__``vasya.prototype``User.__proto__``User.prototype` correctAnswer: — 03content: | Какие варианты подключения скрипта являются корректными с точки зрения современного стандарта HTML? type: multi answers: — `<script type=»text/javascript» src=»my.js»></script>``<script src=»my.js»></script>``<script src=»my.js»/>``<хачу-javascript отсюда=»my.js»>` correctAnswer: — 01content: | Что такое ECMAScript? type: single answers: — Новый язык программированияПереработанная реализация JavaScriptСпецификация языка JavaScript correctAnswer: 2content: | Правда ли что `a == b`? «`js a = [1, 2, 3]; b = [1, 2, 3]; «` type: single answers: — ПравдаНеправдаКак повезёт correctAnswer: 1content: | Какие конструкции для циклов есть в JavaScript? type: single answers: — Только две: `for` и `while`Только одна: `for`Три: `for`, `while` и `do…while` correctAnswer: 2content: | Какой оператор из этих выполняет не только математические операции? type: single answers: — `*``/``+``-``>>>` correctAnswer: 2content: | Сработает ли вызов функции до объявления в этом коде: «`js sayHi(); function sayHi() { alert(«Hello»); } «` type: single answers: — Да, сработаетНет, вызов должен стоять после объявления correctAnswer: 0content: | Какие из этих вызовов синтаксически верно сгенерируют исключение? type: multi answers: — `throw «Ошибка»``throw new Error(«Ошибка»)``throw { message: «Ошибка» }``throw Error(«Ошибка»)`Ни один correctAnswer: — 0123content: | Сколько параметров можно передать функции? type: single answers: — Ровно столько, сколько указано в определении функцииСколько указано в определении функции или меньшеСколько указано в определении функции или большеЛюбое количество correctAnswer: 3content: | Какие из этих вариантов задают массив из элементов «a», «b»? type: multi answers: — `let a = new Array(«a», «b»)``let a = { «a», «b» }``let a = ( «a», «b» )``let a = [ «a», «b» ]``let a = «a,b».split(«,»)` correctAnswer: — 034content: | Какие варианты правильно объявляют функцию `f`, возвращающую сумму двух аргументов? type: multi answers: — `let f = function(a,b) { return a + b }``let f = new Function(«a, b», «return a + b»)``let f = new Function(«a», «b», «return a + b»)``let f = (a, b) => a + b``let f = (a, b) => { a + b }`Никакие correctAnswer: — 0123content: | Что делает код: «`js break me; «` type: single answers: — Ломает интерпретатор JavaScriptВыходит из текущего блока цикла или switch на метку «me»Выдает ошибку correctAnswer: 1content: | Есть ли разница между выражениями? «`js !!( a && b ) (a && b) «` type: single answers: — ДаНетВ первом выражении ошибка, что ещё за «!!»?? correctAnswer: 0content: | Чему равна длина `arr.length` массива `arr`? «`js let arr = []; arr[1] = 1; arr[3] = 33; «` type: single answers: — 01234Больше correctAnswer: 4content: | Чему равно `i` в конце кода? «`js for (var i = 0; i < 10; i++) { console.log(i); } // i = ? «` type: single answers: — `undefined``9``10`Нет такой переменной после цикла correctAnswer: 2content: | Чему равно `i` в конце кода? «`js for (let i = 0; i < 10; i++) { console.log(i); } // i = ? «` type: single answers: — `undefined``9``10`Нет такой переменной после цикла correctAnswer: 3content: | Что выведет `sayHi` при вызове через `setTimeout`? «`js let name = «Вася»; function sayHi() { alert(name); } setTimeout(function() { let name = «Петя»; sayHi(); }, 1000); «` type: single answers: — ВасяПетя`undefined`Будет ошибка correctAnswer: 0content: | Существует ли такое значение `X`, которое после присваивания `a = X` вызов `alert(a == X)` выдаст `false`? «`js let a = X; alert(a == X); // false «` type: single answers: — Да, `X` — это `undefined`Да, `X` — это `null`Да, другоеНет, не бывает correctAnswer: 2content: | Чему равна переменная `name`? «`js let name = «пупкин».replace(«п», «д») «` type: single answers: — дудкиндупкинпупкинляпкин-тяпкин correctAnswer: 1content: | Каких операторов из этого списка нет в JavaScript? type: multi answers: — `*``^``%``#``&``>>``>>>``!` correctAnswer: — 3content: | Чему равно `a + b + c`? «`js let a = 1; let b = { toString() {return ‘1’} }; let c = 1; «` type: single answers: — `11[object Object]``2[object Object]``111``3` correctAnswer: 2content: | Что делает оператор `===`? type: single answers: — Сравнивает по ссылке, а не по значениюСравнивает без приведения типаНет такого оператора correctAnswer: 1content: | Что делает оператор `**`? type: single answers: — Возводит в степеньУмножает число само на себяНет такого оператора correctAnswer: 0content: | Какое из этих слов не имеет специального использования в JavaScript, никак не упомянуто в стандарте? type: single answers: — `this``instanceof``constructor``parent``new`Все имеют специальное использование correctAnswer: 3content: | Какая арифметическая операция приводит к ошибке в JavaScript? type: single answers: — Деление на нольУмножение числа на строкуКорень из отрицательного числаНикакая из вышеперечисленных correctAnswer: 3content: | Чему равно `0 || «» || 2 || undefined || true || falsе`? type: single answers: — `0``»»``2``undefined``true``false` correctAnswer: 2content: | Чему равно `2 && 1 && null && 0 && undefined`? type: single answers: — `2``1``null``0``undefined``false` correctAnswer: 2content: | Чему равно `0 || 1 && 2 || 3`? type: single answers: — `0``1``2``3``true``false` correctAnswer: 2content: | Что выведет `alert`? «`js let arr = [1, 2, 3]; arr.something = 5; alert(arr.something); // ? «` type: single answers: — `5``undefined`Будет ошибка correctAnswer: 0content: | Что выведет `alert`? «`js let str = «Hello»; str.something = 5; alert(str.something); // ? «` type: single answers: — `5``undefined`Будет ошибка correctAnswer: 2content: | Что выведет `alert`? «`js alert(str); // ? let str = «Hello»; «` type: single answers: — `Hello``undefined`Будет ошибка correctAnswer: 2content: | Что выведет `alert`? «`js alert(str); // ? var str = «Hello»; «` type: single answers: — `Hello``undefined`Будет ошибка correctAnswer: 1content: | Что выведет этот код? «`js for (var i = 0; i < 10; i++) { setTimeout(function() { alert(i); }, 100); } «` type: single answers: — Числа от 0 до 9Числа от 0 до 1010 раз число 010 раз число 10Ошибка: переменная не определена correctAnswer: 3content: | Что выведет этот код? «`js for (let i = 0; i < 10; i++) { setTimeout(function() { alert(i); }, 100); } «` type: single answers: — Числа от 0 до 9Числа от 0 до 1010 раз число 010 раз число 10Ошибка: переменная не определена correctAnswer: 0content: | Что выведет этот код? «`js function User() { } User.prototype = { admin: false }; let user = new User(); alert(user.admin); «` type: single answers: — `false``undefined``true` correctAnswer: 0content: | Что выведет этот код? «`js function User() { } User.prototype = { admin: false }; let user = new User(); User.prototype = { admin: true }; alert(user.admin); «` type: single answers: — `false``undefined``true` correctAnswer: 0content: | Чему равно `arr.length`? «`js function MyArray() { } MyArray.prototype = []; let arr = new MyArray(); arr.push(1, 2, 3); alert(arr.length); «` type: single answers: — `0``undefined``3`В этом коде допущена ошибка correctAnswer: 2content: | Какое будет выведено значение? «`js let x = 5; alert(x++); «` type: single answers: — `5``6`Другое correctAnswer: 0content: | Выберите правильные варианты объявления массива, то есть такие, в результате которых мы получаем массив из двух чисел `1` и `2`. type: multi answers: — `new Array.prototype.constructor(1, 2)``new Array(1, 2)``Array(1, 2)``[1, 2]``1..2`Все варианты правильные correctAnswer: — 0123content: | Чему равно это выражение? «`js [].push(1,2).unshift(3).join() «` type: single answers: — «`3,1`««`1,2,3`««`3,1,2`«В коде ошибка correctAnswer: 3content: | Какие варианты вызова `try..catch` являются синтаксически верными в JavaScript? type: multi answers: — `try { … }` без `catch/finally``try { … } catch { … }``try { … } finally { … }``try { … } catch { … } finally { … }`В JavaScript не поддерживается `try..catch` correctAnswer: — 123content: | Язык JavaScript является подвидом языка Java — верно? type: single answers: — ДаНетНаоборот, Java — подвид JavaScript correctAnswer: 1content: | Что выведет этот код? «`js f.call(f); function f() { alert(this); } «` type: single answers: — `[object Object]`Код функции `f`Ошибка: слишком глубокая рекурсияОшибка: переменная `f` не определенадругое correctAnswer: 1 correctAnswerComment: | Функция `f` определяется при входе в область видимости, так что на первой строке она уже есть. Далее вызов `f.call(f)` вызывает функцию, передавая ей `f` в качестве `this`, так что выводится строковое представление `f`. content: | Что выведет этот код? «`js let f = function g() { return 23; }; alert(typeof g()); «` type: single answers: — `number``undefined``function`Ошибка correctAnswer: 3 correctAnswerComment: | Ошибка, так как это Named Function Expression. content: | Что выведет этот скрипт? «`js «use strict»; a = null + undefined; alert(a); «` type: single answers: — `null``undefined``NaN`В коде ошибка correctAnswer: 3 correctAnswerComment: | Переменная не определена, в строгом режиме все переменные должны быть определены. content: | Что выведет этот код? «`js let y = 1; let x = y = 2; alert(x); «` type: single answers: — `1``2``NaN``undefined`Будет ошибка correctAnswer: 1 correctAnswerComment: | Двойное присваивание выполняется справа налево. То есть сначала `y` станет `2`, а потом `x = y`. content: | Что выведет этот код? «`js f.call(null); function f() { alert(this); } «` type: single answers: — `null``undefined`В коде ошибкаДругое correctAnswer: 0 correctAnswerComment: | В строгом режиме `call` передаёт в качестве `this` именно то, что указано. content: | Чему будет равен `this`? «`js let user = { sayHi: function() { alert(this); } }; (user.sayBye = user.sayHi)(); «` type: single answers: — `null``undefined`Объекту `user`В коде ошибка correctAnswer: 1 correctAnswerComment: | Контекст вызова теряется при операциях с методом объекта. content: | Чему равна сумма `[] + 1 + 2`? type: single answers: — `3``NaN``undefined``»12″``12`Другое correctAnswer: 3 correctAnswerComment: | Первым делом объект `[]` превращается в примитив. У него нет `valueOf` (с примитивным результатом), так что вызывается `toString` и возвращает список элементов через запятую, т.е. пустую строку. Получается сложение `»» + 1 + 2`. Далее, так как один из аргументов — строка, то оператор `»+»` преобразует второй тоже к строке, и в итоге получится строка `»12″`. content: | Верно ли, что `null == undefined`? type: single answers: — ДаНет correctAnswer: 0 correctAnswerComment: | Преобразования типов здесь не происходит. Оператор `==` работает с `null/undefined` без преобразования, все варианты сравнений прописаны в спецификации. content: | Что выведет этот код? «`js if (function f(){}) { alert(typeof f); } «` type: single answers: — `undefined``function``null``object`В коде ошибка correctAnswer: 0 correctAnswerComment: | Функция задана как Named Function Expression, поэтому её имя не видно снаружи. content: | Чему равен результат вызова в этом примере? «`js function f() { let a = 5; return new Function(‘b’, ‘return a + b’); } alert(f()(1)); «` type: single answers: — `1``6``undefined``NaN`Будет ошибка correctAnswer: 4 correctAnswerComment: | Ошибка, так как функция, созданная через `new Function`, не имеет доступа к текущему замыканию. content: | Объявлена функция: «`js function F() {} «` Верно ли, что `F instanceof Function`? type: single answers: — ДаНет correctAnswer: 0content: | Объявлена функция: «`js function F() {} «` Чем является `F.prototype`? type: single answers: — Обычным объектомФункциейРавен `undefined` correctAnswer: 0content: | Что выведет этот код? «`js function F() { return F; } alert(new F() instanceof F); alert(new F() instanceof Function); «` type: single answers: — `false`, `false``false`, `true``true`, `false``true`, `true` correctAnswer: 1 correctAnswerComment: | Если функция, запущенная через `new`, возвращает объект (не примитив!), то именно этот объект служит результатом, вместо `this`. Так что результатом `new F` является сама функция `F`. Поэтому получается, что первый `alert` проверяет: `F instanceof F`. Это неверно, т.к. `a instanceof B` проверяет, был ли объект `a` создан конструктором `B` (с учетом прототипов, но здесь это неважно). Функция `F` не была создана собой же, а является объектом встроенного класса `Function`, поэтому `false`. Следующая строка идентична такой проверке: `F instanceof Function`. Это верно. content: | Чему равен `typeof null` в режиме строгом режиме? type: single answers: — `null``undefined``object``string` correctAnswer: 2 correctAnswerComment: | Это особенность спецификации JavaScript. Значением оператора `typeof null` является строка `»object»`. content: | Что выведет этот код? «`js alert(«1″[0]); «` type: single answers: — `0``1``2``undefined`В коде ошибка correctAnswer: 1 correctAnswerComment: | Первый символ строки `»1″` — это `»1″`. content: | Что выведет этот код? «`js alert(20e-1[‘toString’](2)); «` type: single answers: — `2``10``20``NaN`В коде ошибка correctAnswer: 1 correctAnswerComment: | <ol> <li>Запись числа `20e-1` означает `20`, сдвинутое на 1 знак после запятой, т.е. `2`: «`js //+ run alert(20e-1); // 2 «` </li> <li>У каждого числа есть метод `toString(radix)`, который преобразует число в строку, используя `radix` как основание системы счисления. В этом коде `radix = 2`. Так что возвращается `2` в двоичной системе: `»10″`. </li> </ol> content: | Что выведет этот код? «`js alert(+»Infinity»); «` type: single answers: — `Infinity``NaN``0`Будет ошибка correctAnswer: 0 correctAnswerComment: | `Infinity` — числовое значение (бесконечность). content: | Что выведет этот код? «`js let a = (1,5 — 1) * 2; alert(a); «` type: single answers: — `0.999999999``1``0.5``8``-0.5``4` correctAnswer: 3 correctAnswerComment: | Оператор «запятая», вычисляемый в скобках, возвращает последнее вычисленное значение. То есть, `1` игнорируется и возвращается `4` (`5 — 1`). Затем идёт умножение на два, в результате — `8`. content: | Что выведет этот код? Посмотрите на него очень внимательно, в этом вопросе есть подвох. «`js let a = [1, 2] (function() { alert(a) })() «` type: single answers: — `[object Array]``[object Object]``1,2`Будет ошибка correctAnswer: 3 correctAnswerComment: | Пропущена точка с запятой после `let a = [1, 2]`. Браузер автоматически не вставляет её перед скобкой, поэтому интерпретирует это как: «`js let a = [1, 2](function() { alert(a) })() «` …То есть, пытается вызвать массив `[1, 2]` как функцию, что, естественно, не выходит. Отсюда и ошибка. content: | Верно ли сравнение: `»ёжик» > «яблоко»`? type: single answers: — ДаНетЗависит от локальных настроек браузера correctAnswer: 0 correctAnswerComment: | В JavaScript строки сравниваются посимвольно. Символы соотносятся как их коды. В кодировке Unicode код буквы `»ё»` больше кода буквы `»я»`. Поэтому `»ёжик»` больше. content: | Какой результат будет у выражения ниже? «`js null + {0:1}[0] + [,[1],][1][0] «` type: single answers: — `0``1``2``undefined``NaN` correctAnswer: 2 correctAnswerComment: | Подробнее вычисления: <ol> <li>`null` превращается в `0`</li> <li>`{0:1}` — это объект, у которого ключ `0` имеет значение `1` «`js {0:1}[0] == 1 «` </li> <li> Второе слагаемое `[,[1],]` — это массив с 3-мя элементами. Элемент с индексом `1` — это массив `[1]`. Берём от него первый элемент: «`js [,[1],][1][0] == 1 «` </li> </ol> content: | Что выведет выражение ниже? «`js let a = new Array(1,2), b = new Array(3); alert(a[0] + b[0]); «` type: single answers: — `1``4``undefined``NaN` correctAnswer: 3 correctAnswerComment: | Дело в том, что `new Array(1,2)` создаёт массив из элементов `[1,2]`, а вот `new Array(3)` — это особая форма вызова `new Array` с одним численным аргументом. При этом создаётся массив без элементов, но с длиной. Любой элемент этого массива равен `undefined`. «`js //+ run let a = new Array(1,2), b = new Array(3); alert(a[0]); // 1 alert(b[0]); // undefined «` При арифметических операциях `undefined` становится `NaN`, поэтому и общий результат — `NaN`. content: | Яблоко стоит 1.15, апельсин стоит 2.30. Сколько стоят они вместе — чему равна сумма `1.15 + 2.30` с точки зрения JavaScript? type: single answers: — `345``3.45``3,45`Ни один из вариантов выше correctAnswer: 3 correctAnswerComment: | При сложении десятичных дробей проявляются ошибки округления, поэтому сумма будет другой: «`js //+ run alert(1.15 + 2.30); «` content: | Что выведет код ниже? «`js let obj = {‘1’: 0, 1: 1, 0: 2}; alert(obj[‘1’]); «` type: single answers: — `0``1`В коде ошибка correctAnswer: 1 correctAnswerComment: | При задании объекта через `{…}` — кавычки не обязательны, они нужны лишь в случаях, когда без них нельзя, например: «`js let obj = { «строка с пробелами» : 123 } «` Все ключи приводятся к строке. Поэтому второй ключ равен первому и перезаписал его. content: | Что выведет код ниже? «`js for (let key in {1:1, 0:0}) { alert(key); } «` type: single answers: — `1`, затем `0``0`, затем `1`В коде ошибкаЗависит от браузера correctAnswer: 1 correctAnswerComment: | Все современные браузеры сортируют цифровые ключи. content: | Есть ли различия между проверками: «`js if ( x <= 100 ) {…} // и if ( !(x > 100) ) {…} «` type: single answers: — Да, существует значение `x`, для которого они работают по-разномуНет, они полностью взаимозаменяемы.Зависит от браузера. correctAnswer: 0 correctAnswerComment: | Различие будет при `x = NaN` (или любого другого значения, которое преобразуется к `NaN`). content: | Внимательно посмотрите на синтаксис этого кода. Что он выведет? «`js let f = function(x) { alert(x) } (function() { f(1) }()) «` type: single answers: — Никакого результатаВыведет `1`Выведет `undefined`Будет ошибка correctAnswer: 3 correctAnswerComment: | Ошибка из-за отсутствия точки с запятой в строке `(*)`: «`js //+ run let f = function(x) { alert(x) } // (*) (function() { f(1) }()) «` JavaScript не вставляет точку с запятой на этом месте, так как ниже идёт открывающая скобка. Поэтому этот код воспринимается так: «`js let f = function(x) { alert(x) }(function() { f(1) }()) «` content: | Что выведет этот код? «`js let obj = { «0»: 1, 0: 2 }; alert( obj[«0»] + obj[0] ); «` type: single answers: — `2``3``4``12`В коде ошибка correctAnswer: 2 correctAnswerComment: | Дело в том, что у объектов в JavaScript ключи всегда строковые. Если в качестве ключа передано что-то ещё, то оно приводится к строке. Значения обрабатываются в порядке поступления, поэтому `0: 2` перекроет `»0″: 1`. В итоге получится объект с единственным ключом: `{«0» : 2}`. При доступе к ключу — `obj[«0»]` и `obj[0]` эквивалентны, опять же, поскольку ключ приводится к строке. content: | Чему равно такое выражение? «`js [] + false — null + true «` type: single answers: — `0``NaN``undefined``1` correctAnswer: 1 correctAnswerComment: | Шаги преобразования: <ol> <li>`[] + false = «false»`, т.к массив `[]` преобразуется к пустой строке, выходит `»» + false = «false»`.</li> <li>Далее `»false» — null = NaN`, т.к. вычитание преобразует к числу, получается `NaN — 0 = NaN`.</li> <li>…дальнейшие вычисления с `NaN` дают `NaN`</li> </ol> content: | Чему равно значение выражения `4 — «5» + 0xf — «1e1″`? type: single answers: — ЦифреСтроке`NaN` correctAnswer: 0 correctAnswerComment: | <ol> <li>Первый минус превратит строку `»5″` в число `5`</li> <li>Далее идёт сложение с числом 15, записанным в 16-ричной форме.</li> <li>Далее строка содержит число, записанное в научной форме: `1e1 = 10`, минус преобразует эту строку в число.</li> </ol> Получается: «`js 4 — 5 + 15 — 10 = 4 «` content: | Переменные `apple` и `Apple` (с большой буквы) — это одна и та же или разные? type: single answers: — Одна и та жеРазныеС большой буквы переменные называть нельзяСлово «apple» является зарезервированным, нельзя использовать correctAnswer: 1content: | Есть ли разница между вызовами `i++` и `++i`? type: single answers: — Разница в значении, которое возвращает такой вызов«Разница в значении `i` после вызова«Нет никакой разницы correctAnswer: 0content: | Какие вызовы `parseInt` возвратят число? type: multi answers: — `parseInt(«1px»)``parseInt(«-1.2»)``parseInt(«0 минут»)``parseInt(«$1.2»)` correctAnswer: — 012content: | Какой код корректно найдёт максимальное значение в непустом массиве `arr`? type: multi answers: — «`arr.reduce(function(prev, item) { return Math.max(prev, item) })`««`Math.max.apply(null, arr)`««`Math.max(arr)`«`arr.findMax()` correctAnswer: — 01

1. Какое ключевое слово позволяет создавать объекты общего вида:
а) object +
б) this
в) prototype

2. Какая функция позволяет очищать конечную анимацию:
а) setInterval
б) clearTimeout +
в) setTimeout

3. Что, из ниже перечисленного, относится к событию:
а) начало загрузки web-страницы
б) сохранение кодировки пользователем
в) завершение загрузки web-страницы +

4. Что, из ниже перечисленного, относится к событию:
а) изменение кодировки пользователем +
б) начало загрузки web-страницы
в) сохранение кодировки пользователем

6. Какой оператор служит для создания нового экземпляра из класса однотипных объектов:
а) this
б) new +
в) prototype

7. В какой строке создастся новый объект Array:
а) var pattern = /s&/;
б) var pattern = new Array[a,b,c];
в) var pattern = [a,b,c]; +

8. Какой метод позволяет изменять порядок элементов массива на противоположный:
а) reverse() +
б) join()
в) sort()

10. Объекты, отвечающие за то, что содержится на Web-странице в окне браузера, называются:
а) пользовательскими
б) клиентскими +
в) встроенными

11. Какой AJAX-транспорт позволит отправить файл на сервер без перезагрузки страницы:
а) только использование фреймов(IFrame) +
б) XmlHttpRequest справится!
в) невозможно ввиду ограничений безопасности javascript

12. Что нельзя сделать с помощью XmlHttpRequest:
а) передать запрос другого типа кроме GET и POST
б) сделать запрос с http://yandex.ru на http://google.com +
в) произвести запрос так, чтобы ответ был готов до следующей строки скрипта

13. Что такое ECMAScript:
а) спецификация языка Javascript +
б) новый язык программирования
в) переработанная реализация Javascript

14. Можно ли в скрипте перевести посетителя на другую страницу сайта:
а) да, но только в рамках текущего сайта
б) нет, нельзя
в) да, куда угодно +

15. Можно ли использовать один объект XmlHttpRequest для множества разных запросов:
а) можно +
б) нет, только один запрос на один объект
в) да, но перед каждым новым запросом надо вызывать abort()

16. Сколько параметров можно передать функции:
а) сколько указано в определении функции или меньше
б) любое количество +
в) ровно столько, сколько указано в определении функции

17. Какая арифметическая операция приводит к ошибке в javascript:
а) корень из отрицательного числа
б) деление на ноль
в) нет верного ответа +

18. Какие конструкции для циклов есть в javascript:
а) только одна: for
б) три: for, while и do…while. +
в) только две: for и while.

19. Какие из этих тэгов соответствуют стандарту HTML (strict):
а)

  • Назад
  • Обзор: Первые шаги
  • Далее

В этой части курса мы обсуждаем математику в JavaScript — как мы можем использовать operators (en-US) и другие функции, чтобы успешно манипулировать числами для выполнения наших задач.

Необходимые условия: Базовая компьютерная грамотность, базовое понимание HTML и CSS, понимание того, что такое JavaScript.
Цель: Ознакомление с основами математики в JavaScript.

Все любят математику

Хорошо, может быть, не все. Некоторые из нас любят математику, некоторые из нас ненавидели математику с тех пор, как мы изучали таблицу умножения в школе, а некоторые из нас находятся где-то между ними. Но никто из нас не может отрицать, что математика является фундаментальной частью жизни, и мы не можем обойтись без неё. Это особенно актуально, когда мы учимся программировать на JavaScript (или на любом другом языке, если на то пошло) — большая часть того, что мы делаем, опирается на обработку числовых данных, вычисление новых значений и т.д. Так что не удивительно, что JavaScript имеет полнофункциональный набор математических функций.

В этой статье обсуждаются только основные разделы, которые вам нужно знать сейчас.

Типы чисел

В программировании даже скромная система десятичных чисел, которую мы все так хорошо знаем, сложнее, чем вы думаете. Мы используем разные термины для описания различных типов десятичных чисел. Например:

  • Целые — это целые числа, такие как: 10, 400, или -5.
  • С плавающей точкой (или: с плавающей запятой) — имеют целую и дробную части, например: 12.5 или 56.7786543.
  • Doubles — тип чисел с плавающей точкой, которые имеют большую точность, чем стандартные числа с плавающей точкой (что означает, что они точны для большего числа десятичных знаков).

У нас даже есть разные типы числовых систем:

  • Бинарная — низкоуровневый язык компьютеров; нули и единицы (0 и 1);
  • Восьмеричная — 8-ми разрядная, использует 0–7 в каждом столбце;
  • Десятичная — 10-ти разрядная, использует 0-9 в каждом столбце;
  • Шестнадцатеричная — 16-ти разрядная, используют 0–9 и потом a–f в каждом столбце. Вы, возможно, уже встречали эти числа, когда задавали цвет в CSS.

Прежде чем взорвётся ваш мозг, остановитесь прямо здесь и сейчас!

Во-первых, мы просто будем придерживаться десятичных чисел на протяжении всего курса; вы редко когда будете сталкиваться с необходимостью думать в других числовых системах, если вообще когда-либо с ней столкнётесь.

Во-вторых, в отличие от некоторых других языков программирования, JavaScript имеет только один тип данных для чисел, как вы догадались это Number. Это означает, независимо от типа чисел, с которыми вы работаете в JavaScript, обрабатывать вы их будете точно так же.

Для меня всё — числа

Давайте быстро поиграем с некоторыми числами, чтобы снова познакомиться с основным синтаксисом, который нам нужен. Введите команды, перечисленные ниже, в вашу консоль (developer tools JavaScript console), или используйте простую встроенную консоль.

  1. Прежде всего, давайте объявим пару переменных и инициализируем их целым числом и числом с плавающей точкой, соответственно, затем введите имена переменных обратно, чтобы проверить, что все в порядке:
    var myInt = 5;
    var myFloat = 6.667;
    myInt;
    myFloat;
    
  2. Числовые значения набираются без кавычек. Попробуйте объявить и инициализировать ещё пару переменных, содержащих числа, прежде чем двигаться дальше.
  3. Теперь давайте убедимся, что обе переменные содержат одинаковый тип данных. Для этого есть оператор typeof, который позволяет проверить какой тип данных содержит в себе переменная. Введите две приведённые ниже строки:
    typeof myInt;
    typeof myFloat;
    

    В обоих случаях вы должны получить "number" — это все упрощает, чем если бы разные числа имели разные типы данных, и нам приходилось иметь дело с ними по-разному.

Арифметические операторы

Арифметические операторы — это основные операторы, которые мы используем для различных математических операций, например таких, как сложение или вычитание:

Оператор Имя Функция Пример
+ Сложение Объединение чисел в одно целое. 6 + 9
- Вычитание Вычитает правое число от левого. 20 - 15
* Умножение Умножает два числа вместе. 3 * 7
/ Деление Делит левое число на правое. 10 / 5
% Модуль числа Возвращает значение остатка при делении первого числа на второе. Результат будет иметь тот же знак, что и первое число. 11 % 3 = 2 (поскольку число 3 вмещается три раза, остатком будет число 2)
** показатель степени Возводит базовое число в указанную степень, то есть количество базовых чисел, указанных экспонентой, умножается вместе. Впервые он был представлен в EcmaScript 2016. 5 ** 5 (возвращает 3125, или как: 5*5*5*5*5)

Примечание: Иногда числа участвующие в математических операциях называют операндами ( operands (en-US) ).

Нам, вероятно, не нужно учить вас базовым математическим операциям, но мы хотели бы проверить ваше понимание синтаксиса. Попробуйте ввести приведённые ниже примеры в свою консоль (developer tools JavaScript console), или используйте встроенную консоль, с которой вы уже знакомы, чтобы ознакомиться с синтаксисом.

  1. Для начала попробуйте ввести простые примеры, такие как:
  2. Вы также можете попробовать объявить переменные и присвоить им различные числа. Попробуйте вместо чисел использовать ранее объявленные переменные — переменные будут вести себя точно так же, как значения, которые они хранят. Например:
    var num1 = 10;
    var num2 = 50;
    9 * num1;
    num2 / num1;
    
  3. И напоследок, попробуйте ввести более сложные выражения, например:
    5 + 10 * 3;
    num2 % 9 * num1;
    num2 + num1 / 8 + 2;
    

Некоторые примеры выше могут дать вам не тот результат, которого вы ожидали; приведённый ниже раздел может дать ответ на вопрос о том, почему.

Приоритет операторов

Давайте взглянем на последний пример сверху. Предположим, что num2 содержит значение 50 и num1 содержит значение 10 (как и было обозначено выше):

Будучи человеком, вы, вероятно, прочитаете это как «50 плюс 10 равно 60», затем «8 плюс 2 равно 10», и, наконец, «60 делить на 10 равно 6».

Но браузер видит это по-другому: «10 делить на 8 равно 1.25», затем «50 плюс 1.25 плюс 2 равно 53.25».

Это происходит из-за приоритета операторов — некоторые операторы будут применены перед другими в процесс вычисления суммы (в программировании её называют выражением). Приоритет операторов в JavaScript ничем не отличается от приоритета арифметических операций, который вы изучали в школе — умножение и деление всегда выполняются первыми, затем сложение и вычитание (сумма всегда вычисляется слева направо).

Если вы хотите переопределить порядок выполнения операторов, вы можете окружить парными скобками часть выражения, которая должна быть выполнена первой. Для получения результата 6 вам следует сделать следующее:

Результат этого выражения равен 6.

Примечание: полный список операторов JavaScript и приоритетов их выполнения можно найти по этой ссылке: Expressions and operators.

Операторы инкремента и декремента

Иногда вам захочется повторно добавить или вычесть единцу к/из значению числовой переменной. Это можно сделать с помощью оператора инкремента (++) и декремента (--). Мы использовали ++ в нашей игре «Угадай число» в статье первое погружение в JavaScript, где мы добавляли 1 к переменной guessCount, в которой хранилось значение количества попыток пользователя после каждого хода.

Примечание: Замечание: инкремент и декремент часто используются в циклах, о которых вы узнаете позже. Например, если вы захотите пройтись по списку цен и добавить к каждой налог с продаж, вам придётся в цикле обойти каждую цену и провести необходимые вычисления для учёта налога. Инкремент будет использован для перехода на новую ячейку списка при необходимости. У нас есть несложный пример реализации такого списка — попробуйте и взгляните на код чтобы посмотреть, сможете ли вы найти инкременты! Мы взглянем на циклы поближе позже по ходу курса.

Давайте попробуем сыграть с этим в вашей консоли. Для начала заметим, что вы не можете использовать инкремент/декремент непосредственно к числу, что может показаться странным. Дело в том, что мы присваиваем к переменной новое обновлённое число, а не просто вычисляем значение. Следующий пример приведёт к ошибке:

Таким образом, вы можете применить инкремент только к существующим переменным:

Так, вторая странность! Если вы сделаете это, вы получите значение 4 — браузер возвращает текущее число, после чего применяет к нему оператор инкремента. Вы можете удостовериться в том, что инкремент был применён, узнав значение переменной ещё раз:

То же самое для --: попробуйте пример ниже

var num2 = 6;
num2--;
num2;

Примечание: Замечание: вы можете заставить делать это в другом порядке — применить инкремент/декремент и только потом вернуть значение. Для этого необходимо записать оператор слева от переменной, а не справа. Попробуйте пример сверху ещё раз, но в этот раз используйте ++num1 и --num2.

Операторы присваивания

Операторы присваивания — операторы, которые присваивают значение переменным. Мы уже много раз использовали самый простой из них, =, он просто приравнивает значение переменной слева к значению справа:

var x = 3; // x содержит значение 3
var y = 4; // y содержит значение 4
x = y; // x теперь содержит значение y (x == 4)

Однако есть ещё несколько сложных конструкций, которые позволяют делать ваш код более простым и аккуратным. Наиболее часто используемые перечислены ниже:

Operator Name Purpose Example Shortcut for
+= Присваивание сложения Прибавляет значение справа к переменной слева и возвращает новое значение переменной x = 3; x += 4; x = 3; x = x + 4;
-= Присваивание вычитания Вычитает значение справа из переменной слева и возвращает новое значение переменной x = 6; x -= 3; x = 6; x = x - 3;
*= Присваивание умножения Умножает переменную слева на значение справа и возвращает новое значение переменной x = 2; x *= 3; x = 2; x = x * 3;
/= Присваивание деления Делит переменную слева на значение справа и возвращает новое значение переменной x = 10; x /= 5; x = 10; x = x / 5;

Попробуйте использовать такие конструкции, что понять, как они работают. Сможете ли вы определить значение до того, как напишите вторую строку?

Заметьте, что значение справа может быть как числом (константой), так и переменной, например:

var x = 3; // x содержит значение 3
var y = 4; // y содержит значение 4
x *= y; // x содержит значение 12

Активное обучение: меняем размеры коробки

В этом упражнении вы будете пользоваться числами и операторами для работы с размерами коробки. Коробка рисуется с помощью API браузера, которое называется Canvas API. Вам не следует беспокоиться о том, как это работает — просто сосредоточьтесь на математике. Ширина и высота коробки (в пикселях) определяются переменными x и y, которые изначально равны 50.

Открыть в новом окне

В коде сверху, который вы можете изменять, под комментарием есть две строчки, с помощью которых вы можете увеличивать/уменьшать размеры коробки. Мы хотим, чтобы вы выполнили несколько заданий:

  • Поменяйте строчку с размером x так, чтобы коробка была шириной 50px, причём 50 должно быть вычислено с помощью чисел 43 и 7 и арифметического оператора.
  • Поменяйте строчку с размером y так, чтобы коробка была высотой 75px, причём 75 должно быть вычислено с помощью чисел 25 и 3 и арифметического оператора.
  • Поменяйте строчку с размером y так, чтобы коробка была высотой 250, при этом 250 вычислено с помощью двух чисел и оператором взятия остатка (модуль).
  • Поменяйте строчку с размером y так, чтобы коробка была высотой 150px, причём 150 вычислено с помощью трёх чисел и операторов вычитания и деления.
  • Поменяйте строчку с размером x так, чтобы коробка была шириной 200px, при этом 200 вычислено с помощью числа 4 и оператора присваивания.
  • Поменяйте строчку с размером y так, чтобы коробка была высотой 200px, причём 200 вычислено с помощью чисел 50 и 3 и операторов умножения и присваивания сложения.

Не расстраивайтесь, если вы не поняли код сверху. Нажмите кнопку Reset для запуска программы снова. Если вы смогли ответить верно на все вопросы, попробуйте поэкспериментировать с кодом ещё (или, например, предложить друзьям несколько заданий).

Операторы сравнения

Иногда нам может понадобиться проверить какое-либо условие, а затем поступить в зависимости от результата — для этого мы используем операторы сравнения.

Оператор Имя Назначение Пример
=== Строгое равенство Проверяет левое и правое значения на идентичность 5 === 2 + 4
!== Строгое неравенство Проверяет левое и правое значения на неидентичность 5 !== 2 + 3
< Меньше Проверяет, меньше ли левое значение правого 10 < 6
> Больше Проверяет, больше ли левое значение правого 10 > 20
<= Меньше или равно Проверят, меньше ли левое значение правому (или равно ему) 3 <= 2
>= Больше или равно Проверят, больше ли левое значение левого (или равно ему) 5 >= 4

Примечание: вы можете заметить, что некоторые люди используют == и != в их программах для сравнения на равенство и неравенство — это валидные JavaScript-операторы, но они отличаются от ===/!== — первая пара проверяет на равенство/неравенство значений, не рассматривая их типы. Вторая пара — строгая версия первой, которая проверяет типы операндов. При использовании строгой версии выявляется больше ошибок, поэтому мы рекомендуем использовать именно её.

Если вы попробуете использовать эти операторы в консоли, вы увидите, что все они возвращают значения true/false — о типе данных boolean мы писали в прошлой статье. С их помощью мы можем принимать решения в нашей программе, например:

  • Порождать текст на кнопке в зависимости от того, нажата она или нет.
  • Высвечивать сообщение о поражении при проигрыше или поздравление при победе в игре.
  • Показывать пользователю верное окно приветствия в зависимости от времени года.
  • Увеличивать или уменьшать карту при выборе одной из двух опций.

Мы взглянем на то, как реализовать такую логику после знакомства с условными выражениями в следующей статье. Сейчас мы рассмотрим небольшой пример:

<button>Запустить машину</button>
<p>Машина остановлена</p>
var btn = document.querySelector('button');
var txt = document.querySelector('p');

btn.addEventListener('click', updateBtn);

function updateBtn() {
  if (btn.textContent === 'Start machine') {
    btn.textContent = 'Stop machine';
    txt.textContent = 'The machine has started!';
  } else {
    btn.textContent = 'Start machine';
    txt.textContent = 'The machine id stopped.';
  }
}

Открыть в новом окне

Мы использовали оператор равенства внутри функции updateBtn(). В этом случае мы не проверяем пару математических выражений на равенство значений — мы просто смотрим, является ли текст на кнопке определённой строкой — что по сути является тем же самым. Если кнопка при нажатии содержит «Start machine», мы меняем содержимое метки на «Stop machine» и обновляем метку. Если же текст кнопки — «Stop machine», при нажатии мы возвращаем все обратно.

Примечание: Такой элемент управления, который переключается между двумя состояниями, обычно называется тумблером. Он переключается между одним состоянием и другим: свет включён, свет выключен и т. д.

Итого

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

В следующей статье мы изучим текст и то, как мы работаем с ним в JavaScript.

Примечание: если вам хочется узнать подробнее о том, как математика реализуется в JavaScript, вы можете посмотреть главный раздел JavaScript MDN. Статьи Числа и даты и Выражения и операторы — хороший вариант для начала.

  • Назад
  • Обзор: Первые шаги
  • Далее

Информатика в настоящее время является стремительно развивающийся наукой. Многие студенты постают в технические университеты, чтобы в будущем связать свою деятельность с IT или приближенными областями. Для проверки знаний по теме JavaScript предлагаем пройти тестирование на этой странице. Обращаем ваше внимание, что в тесте правильные ответы выделены символом [+].

Какое ключевое слово позволяет создавать объекты общего вида:

[+] а) object

[-] б) this

[-] в) prototype

Какая функция позволяет очищать конечную анимацию:

[-] а) setInterval

[+] б) clearTimeout

[-] в) setTimeout

Что, из ниже перечисленного, относится к событию:

[-] а) начало загрузки web-страницы

[-] б) сохранение кодировки пользователем

[+] в) завершение загрузки web-страницы

Что, из ниже перечисленного, относится к событию:

[+] а) изменение кодировки пользователем

[-] б) начало загрузки web-страницы

[-] в) сохранение кодировки пользователем

Какой оператор служит для создания нового экземпляра из класса однотипных объектов:

[-] а) this

[+] б) new

[-] в) prototype

В какой строке создастся новый объект Array:

[-] а) var pattern = /s&/;

[-] б) var pattern = new Array[a,b,c];

[+] в) var pattern = [a,b,c];

Какой метод позволяет изменять порядок элементов массива на противоположный:

[+] а) reverse()

[-] б) join()

[-] в) sort()

Объекты, отвечающие за то, что содержится на Web-странице в окне браузера, называются:

[-] а) пользовательскими

[+] б) клиентскими

[-] в) встроенными

Какой AJAX-транспорт позволит отправить файл на сервер без перезагрузки страницы:

[+] а) только использование фреймов(IFrame)

[-] б) XmlHttpRequest справится!

[-] в) невозможно ввиду ограничений безопасности javascript

Что нельзя сделать с помощью XmlHttpRequest:

[-] а) передать запрос другого типа кроме GET и POST

[+] б) сделать запрос с http://yandex. ru на http://google. com

[-] в) произвести запрос так, чтобы ответ был готов до следующей строки скрипта

Что такое ECMAScript:

[+] а) спецификация языка Javascript

[-] б) новый язык программирования

[-] в) переработанная реализация Javascript

Можно ли в скрипте перевести посетителя на другую страницу сайта:

[-] а) да, но только в рамках текущего сайта

[-] б) нет, нельзя

[+] в) да, куда угодно

Можно ли использовать один объект XmlHttpRequest для множества разных запросов:

[+] а) можно

[-] б) нет, только один запрос на один объект

[-] в) да, но перед каждым новым запросом надо вызывать abort()

Сколько параметров можно передать функции:

[-] а) сколько указано в определении функции или меньше

[+] б) любое количество

[-] в) ровно столько, сколько указано в определении функции

Какая арифметическая операция приводит к ошибке в javascript:

[-] а) корень из отрицательного числа

[-] б) деление на ноль

[+] в) нет верного ответа

Какие конструкции для циклов есть в javascript:

[-] а) только одна: for

[+] б) три: for, while и do…while.

[-] в) только две: for и while.


  • Япония на пути модернизации — тест с ответами
  • Маркетинговые исследования — тест с ответами
  • Биология 8 класс — тест с ответами
  • Итоговый тест с ответами по истории для 8 класса — тест с ответами
  • Основы цитологии — тест с ответами

JavaScript — один из самых популярных языков программирования. Несколько лет назад про него говорили, что он ночной кошмар программиста, который работает с ним. В некоторых случаях это утверждение было правдой. Однако большей частью эти высказывания относились к DOM API. Тем не менее существует несколько явных ошибок языка.

Данная статья имеет целью предупредить читателя о некоторых недостатках JavaScript.

1. Название. JavaScript — это не Java.

Начнем с шутливого пинка по названию. Изначально оно звучало как Mocha, затем LiveScript, и, наконец, изменилось на JavaScript. В соответствии с историческими фактами, схожесть с названием Java стала результатом соглашения между Netscape и Sun, в обмен на согласие Netscape встроить поддержку Java в их тогда популярный браузер. Стоит также отметить, что название пришло почти как шутка благодаря соперничеству между LiveScript и Java в сфере скриптов на стороне клиента.

Тем не менее, в форумах присутствуют тысячи сообщений на тему “JavaScript не имеет ничего общего с Java”!

2. Null — это объект?

Попробуйте ввести в консоль JavaScript:

console.log(typeof null); // Возвращает: object

Утверждение не имеет смысла. Если null означает отсутствие значения, то как оно может иметь тип object? Простой ответ на поставленный вопрос: это обычная ошибка, которую сделали во время разработки первого релиза JavaScript. Она была перенесена из JScript.

3. NaN !== NaN

Мы можем предположить, что NaN ссылается на значение, которое не является разрешенным числом. Проблема заключается в том, что NaN ничему не равно, в том числе и самому себе.

console.log(NaN === NaN); // Врозвращает false 

Если Вы хотите проверить, имеет ли переменная значение Nan, то нужно использовать функцию isNaN().

4. Глобальные переменные.

Зависимость от глобальных переменных хорошо известна как одна из худших особенностей JavaScript. Для простых проектов, таких как всплывающие подсказки, их действие не заметно. Однако, основная нагрузка на глобальные переменные ложиться тогда, когда Вы начинаете ссылаться на многочисленные скрипты, без знанния внутренней структуры. И вот здесь программа начинает выдавать ошибки одну за другой по причине совпадения имен.

5. Строка userAgent содержит Mozilla. Интересно почему?

Данный факт не являектся ошибкой JavaScript. Все происходит из-за производителей браузеров. Использование строки userAgent является распространенной практикой в JavaScript, так как очень важно знать, с чем приходится иметь дело. Например, если в браузере Safari ввести в консоли JavaScript команду:

console.log(navigator.userAgent);  
// Вывод на экран: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10  

Заметьте: в начале строки стоит: Mozilla/5.0. Почему же браузер Safari идентифицируется как основанный на Mozilla? Хотя в дальнейшем происходит коррекция идентификации, нет объяснений, почему продолжается введение в заблуждение программистов. В действительности, Вы можете обнаружить, что большинство браузеров идентифицируют себя как Mozilla. Ответ на вопрос, почему так происходит, можно дать взлянув на десять лет назад. И основной причиной является не ошибка, а ряд непреодолимых обстоятельств.

Для тех, кто не знает, строка userAgent просто идентифицирует браузер и его версию. Например, первый браузер Mosaic имеет такую строку userAgent:

Mosaic/0.9     // имя браузера / номер версии

Смысл прослеживается очень четко. И когда Netscape вышло на рынок, они использовали формат Mosaic и добавили секцию кодировки.

Mozilla/2.02 [en] (Win95; I)     // имя браузера / версия / кодировка  

Продолжение отличное. Проблемы начались, когда на рынке появился новый игрок — догадайтесь какой — Internet Explorer 3. Когда он стартовал, Netscape был самым популярным доступным браузером. В действительности, много серверов и программ использовали строку userAgent для идентификации Netscape. Хотя сейчас это вызывает горячие споры, но тогда, если бы IE использовало свою собственную строку userAgent, например такую:

MSIE/3.0 (Win95; U)

Такой ход поставил бы IE 3 в очень ущербное положение, потому что Netscape уже идентифицировался большинством серверов. Поэтому разработчики решили идентифицировать продукт Microsoft как браузер Mozilla, а потом добавить метки для Internet Explorer.

Mozilla/2.0 (compatible; MSIE 3.0; Windows 95) 

В наши дни детекция с помощью строки userAgent стоит последней в списке задач. Поэтому отношение к ней соответствующее. Вы можете обнаружить, что большинство браузеров следует традиции IE идентифицировать себя как Mozilla, и причиной тому является цепная реакция разработчиков.

6. Несоответствие области видимости

Расмотрим следующий код:

// Создаем функцию, которая вызывает другую функцию с именем еквивалентным параметру fn.  
function foo(fn) {  
    if (typeof fn === "function") {  
        fn();  
    }  
}  
  
// Создает объект со свойством и методом.  
var bar = {  
    barbar : "Всем привет!",  
    method  : function() {  
        alert(this.barbar);  
    }  
};  
  
bar.method(); // Выводит "Всем привет!"  
foo(bar.method); // Если мы вызываем функцию foo и передаем метод "bar.method", будет выдано сообщение об ошибке "undefined."  
foo(function() { bar.method(); }); // Выводит "Всем привет!"  

Причина того, что foo(bar.method) не выводит такой же результат, заключается в том, что функция метода вызывается как метод объекта окна, а не bar. Для того, чтобы исправить положение мы должны вызвать bar.method() через вызов анонимной функции.

7. Использование побитовых операторов.

JavaScript имеет много похожего на Java. В том числе и побитовые операторы:

  • & — И
  • | — ИЛИ
  • ^ — исключающее ИЛИ
  • ~ — НЕ
  • > — знаковый сдвиг вправо
  • ??? — беззнаковый сдвиг вправо
  • << — сдвиг влево

Рассмотрим первый оператор &. Гораздо более эффективно будет использовать оператор &&, так как он будет выполняться быстрее. Так происходит потому, что JavaScript — это не Java, и у него нет типа integer. Поэтому процессы с относительной длиной требуют операции преобразования для операндов, выполняют операцию, а затем происходит обратное преобразование к исходному типу.

Поэтому вместо использования & как «И», и | как «ИЛИ» следует использовать && и ||.

8. Слишком много логических значений false

Может быть это не является ошибкой JavaScript, но очень затрудняет процесс изучения языка. Такие значения как null, false, и undefined почти всегда обозначают одно и тоже, но между ними существует разница, которая вызывает затруднение в понимании.

!!(0); // false  
!!(false); // false  
!!(''); // false  
!!(null); // false  
!!(undefined); // false  
!!(NaN); // false  

Обратите внимание, что все остальные значения обозначают true.

9. Он делает ошибки в арифметических операциях.

JavaScript имеет несколько особенностей при работе десятичными числами. Для примера, откройте консоль, и введите console.log(.2 + .4). Ожидается, что будет выведено «.6», не так ли? Так, но не совсем!

Разметка XHTML

console.log(.2 + .4); // 0.6000000000000001

Как такое происходит? Причина в том, что JavaScript использует стандарт IEEE для арифметики двоичных чисел с плавающей десятичной точкой. Механизм достаточно сложный для объяснения в данной статье, но когда происходит работа с десятичными дробями, результат может немного отличаться от того, что Вы ожидаете. Помните, что целочисленная арифметика точна, и таким образом можно избежать влияния данного пункта на результат работы программы.

10. Выбор стиля кодирования не зависит от Вас!

Когда дело доходит до кодирования, то начинается использование своего собственного стиля. Многие программисты предпочитают ставить скобочки на одной строке с оператором, другие предпочитают переносить на следующую строку:

// Скобочки на одной строке справа  
return {  
  foo : bar  
};  
  
// Скобочки на новой строке  
return  
{  
  foo : bar  
};  

В зависимости от того, какую книжку про программирование мы прочитали первой, или от того, что сказал учитель, Вы предпочитаете какой-либо из методов приведенных выше, или оба сразу. Однако в JavaScript это не будет зависеть от Вас!

Рассмотрим приведенные выше выражения. Верите Вы или нет, но они НЕ идентичны. Добавьте следующие строки на какую-нибудь страницу HTML.

var foo = function() {  
  
    return {  
        a : 'b'  
    };  
  
}();  
  
alert(foo.a); // b 

Код просто создает переменную foo, которой присваивается возвращаемый объект. Когда мы вызываем alert(foo.a), то ожидаем увидеть окно сообщения со значением b. Теперь сдвинем открывающуюся скобку от выражения return на одну строку вниз:

return  
{  
    a : 'b'  
};

Если Вы запустите страницу в браузере снова, то получитие в окне сообщений инструмента разработчика сообщение об ошибке, такое как «foo is undefined».” И в чем дело!?

Почему JavaScript так реагирует? Потому, что существует нечто, называемое «вставкой точки с запятой». В действительности JavaScript пытается корректировать наш плохой код. Здесь он считает, что Вы пропустили закрывающую точку с запятой, поэтому переходит вперед и добавляет ее для Вас. Хотя в оригинале данное свойство задумывалось как помощь в кодировании, особенно начинающим программистам, в действительности это очень плохая штука, как было продемонстрировано выше.

В нашем примере нет возможности определить, почему foo.a возвращает «undefined». Теперь, когда мы знаем про вставку точки с запятой, причина становится понятной — JavaScript добавил точку с запятой после выражения return.

return; // JS ошибочно добавляет здесь точку с запятой.  
{  
    a : 'b'; // Здесь также будет добавлена точка с запятой, так как JS не распознает это как объект.  
};  

Надеюсь, что урок был полезен для Вас!

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как человек может изменить жизнь другого
  • Какие бывают морфологические ошибки
  • Как янукович изменил конституцию
  • Как человек изменил тундру
  • Какие бывают логические ошибки

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии