В JavaScript есть два типа значений: примитивы и объекты. Мы просто поговорим о примитивных типах данных.

Так что же такое примитивы?

примитив - это тип данных, который не является объектом и не имеет методов и свойств. В JavaScript есть 6 примитивных типов данных: строка, число, логическое, нулевое, неопределенное, символ (новое в ECMAScript 2015). Все остальное - объект.

Разница между объектами и примитивами:
Объект - это набор свойств. Свойство может ссылаться на объект или примитив как на значение (используя метод valueOf ()). Примитивы - это литералы значений, у них нет свойств.

За исключением null и undefined, все примитивные значения имеют объектные эквиваленты, которые обтекают их.

typeof true; //"boolean"
typeof
Boolean(true); //"boolean"
typeof
new Boolean(true); //"object"
typeof
"abc"; //"string"
typeof
String("abc"); //"string"
typeof
new String("abc"); //"object"
typeof 123; //"number"
typeof
Number(123); //"number"
typeof
new Number(123); //"object"

Теперь вопрос в том, почему у примитивных значений нет свойств, почему 123.toString () возвращает значение?

Потому что JavaScript легко сопоставляет примитивы и объекты. В этом случае числовое значение приводится к числовому объекту, чтобы получить доступ к его методу toString (). Числовой объект используется только в течение доли секунды, после чего его приносят в жертву богам сборки мусора.

Вот более экологически ответственный пример, который проверяет тип объекта без вмешательства в сборку мусора:

Number.prototype.toString = function(){ return typeof this; }
(123).toString(); //"object"

Мы довольно хорошо понимаем типы данных javascript, их тень объектов и принуждение между примитивами и объектами. Теперь давайте посмотрим, как тип оператора + приводит значения к примитивам, числам и строкам.

1. Введите преобразование значений в числа.

Number(undefined) //NaN
Number(null) //NaN
Number(true) //NaN
Number(false) //NaN
Number("123") //123
Number(obj) //
Тип объекта obj приводится к числу путем вызова его метода valueOf () и последующего применения конструктора Number () к (примитивному) результату.

2. Приведение значений типа к строке
String(undefined) //"undefined"
String(null) //"null"
String(true) //"true"
String(false) //"false"
String(123) //"123"
String(obj) /
An object obj преобразуется в строку путем вызова метода toValue () и последующего применения конструктора String () к (примитивному) результату.

Что происходит, когда мы складываем два значения? Давайте разберемся в этом на нескольких примерах.

Пример 1:

> [] + []
  ''

Примитивный эквивалент [] сам по себе является массивом, который не является примитивным значением. Таким образом, будет вызвана функция toString (), которая вернет пустую строку. Следовательно, результатом будет пустая строка.

Пример 2:

> [] + {}
  ''

Как объяснялось в предыдущем примере, [] возвращает пустую строку. Преобразование пустого объекта в строку дает следующий результат.

> String({})
    '[object Object]'

Результатом является объединение «» и «[объект-объект]».

Пример 3:

> {} + {}
  NaN

Какие????? Шутки в сторону????

Расслабляться…

Проблема в том, что JavaScript интерпретирует первый {} как пустой блок кода и игнорирует его. Таким образом, NaN вычисляется путем вычисления + {} (плюс с последующим вторым {}). Плюс, который вы видите здесь, - это не оператор двоичного сложения, а оператор унарного префикса, который преобразует свой операнд в число так же, как работает конструктор Number ().

Аргументы функций или методов также всегда анализируются как выражения. Вы можете исправить ситуацию, принудительно проанализировав ввод как выражение:

> ({} + {})
    '[object Object][object Object]'
> console.log({} + {})
    '[object Object][object Object]'

Надеюсь, теперь мы разобрались с типами данных в javascript и их приведением типов.

Я оставляю вам небольшую загадку. Старайтесь не использовать консоль;)

Какое значение y:

x={ valueOf() {return 7}, toString() {return ‘hi’} }
y=String(x) + x + `${x}`

Это мой самый первый блог. Я также учусь с вами, ребята, пока пишу этот блог :)

Комментарии и предложения всегда приветствуются; D

Ссылки
http://2ality.com/2011/03/javascript-values-not-everything-is.html