Привет, привет! Продолжаем, без долгих вступлений, сегодня вторая статья с вопросами на собеседованиях по JavaScript.
Поехали!
Что такое NaN? NaN === NaN?
NaN или Not a Number (не число) - это значение, получаемое в результате выполнения числовой операции над не числовым значением.
console.log(parseInt('abc'))
console.log(parseInt(null))
console.log(parseInt(undefined))
console.log(parseInt({} * 10))
console.log(parseInt('abc' - 2))
console.log(parseInt(0 / 0))
console.log(parseInt('10a' * 10))
В JS есть встроенный метод isNaN, позволяющий проверять является ли значение NaN, но он ведет себя довольно странно:
console.log(isNaN()) // true
console.log(isNaN(undefined)) // true
console.log(isNaN({})) // true
console.log(isNaN(String('a'))) // true
console.log(isNaN(() => { })) // true
Результатом всех console.log является true, несмотря на то, что ни одно из значений не является NaN.
ES6 для проверки, является ли значение NaN, рекомендует использовать метод Number.isNaN. Мы так же можем написать вспомогательную функцию для решения проблемы "неравенства NaN самому себе":
function checkIsNan(value){
return value !== value;
}
NaN всегда не равен NaN
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
Какими способами можно объявить переменную?
Объявить переменную можно четырьмя способами;
1. a = 5;
2. var a = 5;
3. let a = 5;
4. const a = 5;
Отличие var, let и const?
Фундаментальным новшеством в ES2015 стало введение ключевых слов let и const.
Переменные, объявленные с помощью ключевого слова «var», являются глобальными. Это означает, что они доступны из любого места в коде:
function giveMeX(showX){
if(showX){
var x = 5
}return x
}
console.log(giveMeX(false))
console.log(giveMeX(true))
Результатом первого console.log будет undefined, второго — 5. Мы имеем доступ к переменной «x» из-за ее всплытия в глобальную область видимости. Код из примера выше интерпретируется следующим образом:
function giveMeX(showX){
var x // имеет значение undefined
if(showX){
x = 5
}
return x
}
Результатом первого console.log является undefined, поскольку объявленные переменные, которым не присвоено значения, имеют значение undefined по умолчанию.
Переменные, объявленные с помощью ключевых слов «let» и «const» имеют блочную область видимости. Это означает, что они доступны только внутри блока ({ }), это даёт больше уверенности в том, что переменные, созданные в различных блоках кода, не повлияют на то, что находится за пределами этих блоков. :
function giveMeX(showX){
if(showX){
let x = 5
}
return x
}
function giveMeY(showY){
if(showY){
let y = 5
}
return y
}
Вызов этих функций с параметром false приведет к ошибке ReferenceError, потому что к переменным «x» и «y» нет доступа снаружи блока и их значения не возвращаются (не всплывают).
Разница между «let» и «const» состоит в том, что в первом случае мы может менять значение переменной, а во втором — нет (константа). При этом, мы можем менять значение свойства объекта, объявленного с помощью const, но не само свойство (переменную).
Чем отличается == от ===?
Оператор нестрогого равенства '==' проверяет на абстрактное равенство, сравнивает только значение, т.е. он выполняет необходимые преобразования типов перед выполнением сравнения на равенство.
Оператор строгого равенства '===' проверяет на строгое равенство, т.е. он не будет выполнять преобразование типа, сравнивает и значения и тип данных, поэтому, если два значения не одного типа, при сравнении он вернет false.
продолжение следует....
#javascript #nan #let #const #var