2
  • Почему результат равен 4?

    let obj = {
     "0": 1,
     0: 2
    };
    

    alert( obj["0"] + obj[0] );

  • Сумма равна 12, потому что он сложил строки, но почему откинул скобки?

    [] + 1 + 2
  • А этот самый не понятный - почему 8?

    let a = (1,5 - 1) * 2;
    

    alert(a);

Qwertiy
  • 123,725
doox911
  • 3,818
  • Лучше задавать по одному вопросу в вопросе, а не по несколько – Grundy Jan 14 '19 at 21:47
  • @Grundy, а вот и главный дубликатор. Какое отношение первый вопрос имеет к этому? Кстати, у меня где-то был ответ про числовые индексы. – Qwertiy Jan 14 '19 at 21:49
  • @Qwertiy, там про алгоритм оператора + :) надо третий найти про ключи, я помню что-то было про повторяемость, ты еще писал типа сначала запретили, потом опять разрешили когда вычисляемые ввели – Grundy Jan 14 '19 at 21:50
  • @Grundy отличные ответы в приведённых ссылках. Спасибо. Постараюсь лучше гуглить( – doox911 Jan 14 '19 at 21:54
  • @Grundy, вроде всё нашёл, передубликатил немного. А то, про что ты вспомнил - вот, но вроде к теме не относится? Впрочем, в дубликате тоже упоминается про дублирование ключей. – Qwertiy Jan 14 '19 at 22:15

2 Answers2

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