Почему результат равен 4?
let obj = { "0": 1, 0: 2 };alert( obj["0"] + obj[0] );
Сумма равна 12, потому что он сложил строки, но почему откинул скобки?
[] + 1 + 2А этот самый не понятный - почему 8?
let a = (1,5 - 1) * 2;alert(a);
Asked
Active
Viewed 261 times
2
2 Answers
4
console.log({ "0": 1, 0: 2 }); // same property defined twice
console.log([].toString()); // empty string
console.log((1,5 - 1)); // operator , returns the last operand
doox911
- 3,818
-
Подобное
console.log((1,5 - 1));кроме тестов и вопросов на собеседовании может в реальной практике встречаться? – doox911 Jan 14 '19 at 20:54 -
1Если быть точным, оператор возвращает последний операнд, а не второй (тоже не понимаю, зачем это нужно). – Beast Winterwolf Jan 14 '19 at 20:59
-
@BeastWinterwolf вы абсолютно правы. Почитал тут: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%97%D0%B0%D0%BF%D1%8F%D1%82%D0%B0%D1%8F – doox911 Jan 14 '19 at 21:07
-
@doox911, может, но крайне редко. Само собой, не в таком виде. И, вероятно, если линтер не используется. – Qwertiy Jan 14 '19 at 21:21
-
@BeastWinterwolf, скорее всего, перетащили из Си, как и другие конструкции. Иногда удобно, если несколько действий логически связаны. Кстати, в си в макросах можно применять - гораздо удобнее, чем
do { ... } while(0);. А ещё, чтобы скобки не ставить (впрочем, в js скобки обычно ставят всегда). – Qwertiy Jan 14 '19 at 21:23
1
Ключами в объекте могут быть только строки, либо Symbol. В данном случае 0 приводится к строке "0" и в объекте добавляется всего одно поле. Убедиться в этом можно просто выведя полученный объект:
let obj = {
"0": 1,
0: 2
};
console.log(obj);
Оператор + применяет к своим аргументам внутреннюю функцию ToPrimitive, для массива это равносильно вызову .toString(), литералы чисел остаются числами.
Далее, если хотя бы один из операндов строка, все остальные тоже приводятся к строке и происходит конкатенация строк.
В итоге получается [].toString() + 1 + 2 -> "" + 1 + 2 -> "1" + 2 -> "12"
Ответ на следующий вопрос подробно описан здесь: (1,5-1)*2 = 8 JavaScript
Grundy
- 81,538
+:) надо третий найти про ключи, я помню что-то было про повторяемость, ты еще писал типа сначала запретили, потом опять разрешили когда вычисляемые ввели – Grundy Jan 14 '19 at 21:50