Comments 68
На мой взгляд, проще прочитать раздел приведения типов (вроде так) в книге JavaScript The Definitive Guide, даже на русском, там подробно расписано про этот момент, а так же про .toString() и другие вещи.
+2
Получилась очередная статья по основам js (причем короткая и не полная), коих предостаточно в сети.
+5
Статья получилась не только неполная, но местами и некорректная. Кроме этого, не сказано главное и основное: оператор строгого равенства "===" не проверяет на «идентичность», такого понятие в языке нет. В действительности этот оператор на самом деле сначала проверяет тип (typeof), а потом проверяет значение. Одного этого достаточно чтобы в любом случае точно предсказать результат.
+5
> Одного этого достаточно чтобы в любом случае точно предсказать результат.
Нет, этого недостаточно:
Нет, этого недостаточно:
var a = {}, b = {};
console.log(a === b);
+4
У меня тоже возникло ощущение, что либо после этого:
«Оператор == сравнивает на равенство, а вот === — на идентичность. Плюс оператора === состоит в том, что он не приводит два значения к одному типу. Именно из-за этого он обычно и используется.»
нужно было остановиться, либо же расписывать очень подробно
«Оператор == сравнивает на равенство, а вот === — на идентичность. Плюс оператора === состоит в том, что он не приводит два значения к одному типу. Именно из-за этого он обычно и используется.»
нужно было остановиться, либо же расписывать очень подробно
+2
Полностью с Вами согласен. Вот думаю, после прочтения таких статей, давно уже изъезженных, а самое главное хорошо описанных в спецификации, думаешь, ну неужели в javascript нету куда более тонких мест чем, точно хорошо описано его создателями. Мне куда интереснее было бы почитать, про разное поведение в разных движках языка(не только браузерных). Уж лучше написать статью про определение типов написать, хотя это тоже тема разобрана по кусочкам.
0
> Так что решил полностью раскрыть эту тему
полностью? да ладно.
Например, что вернёт «NaN === NaN», или как кастятся объекты, +0 тоже самое что и -0? и т.д.
Там в принципе тонкости есть свои.
полностью? да ладно.
Например, что вернёт «NaN === NaN», или как кастятся объекты, +0 тоже самое что и -0? и т.д.
Там в принципе тонкости есть свои.
+11
Когда увидел название статьи, хотел было сказать, что такой узкой темы маловато для статьи, но раскрыто шикарно, спасибо!
-4
abc === undefined; // true - только если abc = undefined!
Вот так точно делать не стоит. undefined не зарезервированное слово, поэтому нужно проверять как typeof === 'undefined'
+2
(function(undefined) {
// тут правильный undefined
})();
+2
бесспорно, но об этом нигде не упомянуто
+1
Зачем, если итак работает?
-5
Дело в том что undefined это не совсем ключевое слово и может быть переопределено. Ничто не мешает одному из скриптом на странице выполнить такой код:
undefined = true
+2
Это да, но это актуально только если пишешь библиотеку/фреймворк или не доверяешь собственному коду.
Кстати есть более краткая форма, которую я, правда, нигде больше не видел:
var undef;
// undef — правильный undefined
Кстати есть более краткая форма, которую я, правда, нигде больше не видел:
var undef;
// undef — правильный undefined
-3
undefined — это свойство global (он же window), у которого Writable == false (менять не можем значение) и Configurable == false (не можем его удалить).
+1
Совершенно верно и, стоит дополнить, что такое поведение было введено в JavaScript 1.8.5 — developer.mozilla.org/en/JavaScript/Reference/Global_Objects/undefined (Starting in JavaScript 1.8.5 (Firefox 4), undefined is non-writable, as per the ECMAScript 5 specification.)
+1
А можно еще так:
abs === void 0
+1
Не поверите, но такая конструкция используется даже в jQuery.
-1
Мне просто интересно. А вот так стоит делать?:
void зарезервированное слово
abc === void 0;
void зарезервированное слово
0
У вас один знак равенства лишний — typeof всегда возвращает строку.
0
a == a; // true
a === a; // true
ну это уже совсем.
В целом — статья достаточно пустословная. Просто раскрытое понятие, что делает абсолютное сравнение (а именно — проверка без приведения). Любой, кто изучал js чуть глубже, чем $('.hide').click(function(){$(this).hide())}) (да и не только js, достаточно много языков, где есть такая же конструкция), знает в чем разница. А действительно сложные и спорные моменты не раскрыты
a === a; // true
ну это уже совсем.
В целом — статья достаточно пустословная. Просто раскрытое понятие, что делает абсолютное сравнение (а именно — проверка без приведения). Любой, кто изучал js чуть глубже, чем $('.hide').click(function(){$(this).hide())}) (да и не только js, достаточно много языков, где есть такая же конструкция), знает в чем разница. А действительно сложные и спорные моменты не раскрыты
+5
Вы еще на главной про объявления переменных расскажите.
+1
abc == undefined; // true, если abc = undefined | null | 0 | false | '' | а также [] в IE6
Заблуждение из PHP. Смотрим:
console.log( 0 == undefined ); // false
console.log( false == undefined ); // false
console.log( '' == undefined ); // false
undefined нестрого равен только null и наоборот.
+3
Да я полностью с Вами согласен, и об этом нам говорит спецификация es5.github.com/#x11.9.3, в которой не так много уж много букв, чтобы не осилить ее( в частности по поводу операторов).
0
Почитайте, там много интересного. Вот, например, одна из прекрасных пудр для мозгов:
Number.prototype.a = function(){}();
Number.b = 7;
var a = 123,
b = Infinity,
c = new Number(b);
c.b = b.b = a.a = true;
console.log(typeof a.a); // ?
console.log(typeof b.b); // ?
console.log(typeof c.a); // ?
console.log(typeof c.b); // ?
+1
UFO just landed and posted this here
Спойлерну пожалуй.
Собственно 'X.Y' резолвится как Reference(base: 'X', refname: 'Y').GetValue().
«Конструктор» тупо заполняет внутренние члены класса Reference, основная логика ложится на GetValue().
Примитивы (Type(123) и Type(Infinity) == Number (не, не класс)) конвертятся в объекты Number.
Но фишка в том, что конвертятся только во время выполнения данного метода, то есть a.a = true проходит вполне нормально. Но после выполнения a становится снова примитивом.
На время второго обращения он снова превращается в объект, но это новый объект, без заполненного свойства. Если бы нас не пытались дурить (Number.b = 7, хаха), а написали правильно через прототип, то вторая строчка была бы number.
Это что касается первых двух выводов в лог.
Для резолва свойства объекта управление переходит на внутренний метод типа Object — Get().
Который зовёт GetPropery() и в нашем случае возвращает два дескриптора — для ".a" и ".b", для второго случая всё понятно — вернётся четко «true», подводных камней нет.
А на первом опять ловушка на невнимательность. Это FE с одновременным вызовом функции, замыкание, да. Ну и всем, надеюсь, известно, что по-дефолту без return'a функция возвращает undefined.
А typeof undefiend == 'undefined'.
PS: как-то так, возможно наврал в именах функций.
Собственно 'X.Y' резолвится как Reference(base: 'X', refname: 'Y').GetValue().
«Конструктор» тупо заполняет внутренние члены класса Reference, основная логика ложится на GetValue().
Примитивы (Type(123) и Type(Infinity) == Number (не, не класс)) конвертятся в объекты Number.
Но фишка в том, что конвертятся только во время выполнения данного метода, то есть a.a = true проходит вполне нормально. Но после выполнения a становится снова примитивом.
На время второго обращения он снова превращается в объект, но это новый объект, без заполненного свойства. Если бы нас не пытались дурить (Number.b = 7, хаха), а написали правильно через прототип, то вторая строчка была бы number.
Это что касается первых двух выводов в лог.
Для резолва свойства объекта управление переходит на внутренний метод типа Object — Get().
Который зовёт GetPropery() и в нашем случае возвращает два дескриптора — для ".a" и ".b", для второго случая всё понятно — вернётся четко «true», подводных камней нет.
А на первом опять ловушка на невнимательность. Это FE с одновременным вызовом функции, замыкание, да. Ну и всем, надеюсь, известно, что по-дефолту без return'a функция возвращает undefined.
А typeof undefiend == 'undefined'.
PS: как-то так, возможно наврал в именах функций.
0
Спасибо, поправил. Это верно не для undefined, а для false. Заодно немножко дополнил статью.
0
Напишите про конкатенацию, пожалуйста. Не разберу в чём различие += и -=.
-4
Вашу функцию:
Можно переписать гораздо короче:
Результат будет тот же :)
function isEq(a, b){
if(a == b) return true;
for(var i in a){
if(!isEq(a[i], b[i])) return false;
}
for(var i in b){
if(!isEq(a[i], b[i])) return false;
}
return true;
}
Можно переписать гораздо короче:
function isEq(){return true}
Результат будет тот же :)
+10
захотелось расширить, а просто 5 не расширяется
5..property = "value";
0
Мои пять копеек
new Number(5).valueOf() === 5; // true
new Number(5).valueOf() === 5; // true
0
Да, любое число — это объект класса Number.
Нет, на самом деле в JS есть простые типы. Число 5 — это простой тип, а вот new Number(5) — это объект класса Number. Поэтому они и не равны при строгом сравнении.
0
Что касается «передачи в this» — там происходит автоматический боксинг примитивных типов, соответственно this будет содержать соответствующий объект (аля new Number(5)).
Но тут тоже есть ньюанс — в strict mode this может быть примитивным типом (автоматического боксинга там не будет):
Но тут тоже есть ньюанс — в strict mode this может быть примитивным типом (автоматического боксинга там не будет):
(function() { console.log(this === 5); }).call(5) // false
(function() { "use strict"; console.log(this === 5); }).call(5) // true
0
Sign up to leave a comment.
Articles
Change theme settings
Отличия == и === в JavaScript