В JavaScript есть два типа значений: примитивы и объекты. Мы просто поговорим о примитивных типах данных.
Так что же такое примитивы?
примитив - это тип данных, который не является объектом и не имеет методов и свойств. В JavaScript есть 6 примитивных типов данных: строка, число, логическое, нулевое, неопределенное, символ (новое в ECMAScript 2015). Все остальное - объект.
Разница между объектами и примитивами:
Объект - это набор свойств. Свойство может ссылаться на объект или примитив как на значение (используя метод valueOf ()). Примитивы - это литералы значений, у них нет свойств.
За исключением null
и undefined
, все примитивные значения имеют объектные эквиваленты, которые обтекают их.
typeof
true; //"boolean"
typeofBoolean(true); //"boolean"
typeofnew
Boolean(true); //"object"
typeof"abc"; //"string"
typeofString("abc"); //"string"
typeofnew
String("abc"); //"object"
typeof 123; //"number"
typeofNumber(123); //"number"
typeofnew
Number(123); //"object"
Теперь вопрос в том, почему у примитивных значений нет свойств, почему 123.toString () возвращает значение?
Потому что JavaScript легко сопоставляет примитивы и объекты. В этом случае числовое значение приводится к числовому объекту, чтобы получить доступ к его методу toString (). Числовой объект используется только в течение доли секунды, после чего его приносят в жертву богам сборки мусора.
Вот более экологически ответственный пример, который проверяет тип объекта без вмешательства в сборку мусора:
Number.prototype.toString = function(){ return typeof
this; }
(123).toString(); //"object"
Мы довольно хорошо понимаем типы данных javascript, их тень объектов и принуждение между примитивами и объектами. Теперь давайте посмотрим, как тип оператора + приводит значения к примитивам, числам и строкам.
1. Введите преобразование значений в числа.
Number(undefined) //NaN
Тип объекта obj приводится к числу путем вызова его метода valueOf () и последующего применения конструктора Number () к (примитивному) результату.
Number(null) //NaN
Number(true) //NaN
Number(false) //NaN
Number("123") //123
Number(obj) //
2. Приведение значений типа к строке
String(undefined) //"undefined"
An object obj преобразуется в строку путем вызова метода toValue () и последующего применения конструктора String () к (примитивному) результату.
String(null) //"null"
String(true) //"true"
String(false) //"false"
String(123) //"123"
String(obj) /
Что происходит, когда мы складываем два значения? Давайте разберемся в этом на нескольких примерах.
Пример 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