Типы примитивов JavaScript и соответствующие объекты

В JavaScript не все данные являются объектами. Существует несколько примитивных типов, таких как строки, числа и логические значения, которые не являются объектами. Для каждого из этих типов существует конструктор, который выводит объект с аналогичным поведением: Число , Строка и Логическое значение . Чтобы запутать ситуацию, на самом деле можно вызывать методы для примитивных типов - они будут преобразованы в соответствующие объекты во время этой операции, а затем преобразованы обратно. Например, можно сделать

var a = 4.1324;
a.toFixed(1) // Outputs 4.1

Тем не менее, если вы попытаетесь сравнить примитивные типы и объекты со строгим равенством, разница обнаружится

var a = new Number(4);
var b = 4;
a === b; // False!!!
typeof a; // 'object'
typeof b; // 'number'

На самом деле, если попытаться сравнить объекты, они все равно окажутся разными:

var a = new Number(4);
var b = new Number(4);
a === b; // False!!!

( С концептуальной точки зрения я как бы понимаю различие. Объекты могут иметь дополнительные свойства, поэтому они не должны сравниваться как равные, если они на самом деле не идентичны. Итак, если мы хотим иметь 4 === 4 нам нужно использовать тип, который не является объектом. Но с этой дилеммой сталкивается любой достаточно динамичный язык программирования, но я знаю только JavaScript, где есть два типа - один объектный, а другой нет - для чисел или строк.)

В чем преимущество сохранения двух разных представлений для чисел, строк и логических значений? В каком контексте может понадобиться различие между примитивными типами и объектами?

11
задан Peter Mortensen 25 June 2019 в 13:32
поделиться