Подтвердить что ты не робот

Почему бы избежать создания объектов в JavaScript?

Я следую руководству JavaScript по W3Schools. При чтении почти на каждой странице они дают примечание пользователю "Избегать создания объектов" и вместо этого использовать примитивные типы данных. Они дают основание для этого, поскольку "код становится трудно понять или скорость выполнения будет уменьшена, если объект используется". Правда ли, что мы должны избегать создания объектов в JavaScript?

Например:

var value = new Number(1);  // Avoid this
var value = 1;              // do something like this instead.
4b9b3361

Ответ 1

Утверждение "избегать создания объектов" само по себе является абсурдным в JavaScript, который имеет объекты повсюду и является одним из наиболее объектно-ориентированных языков. Но "избегать создания объектных версий примитивов", который является кодом, который вы указываете, действительно. То есть избегайте new String, new Number и new Boolean.

JavaScript имеет как примитивные, так и объектные версии строк, чисел и булевых. Практически никогда не было причин создавать объектную версию любого из них явно, и это может привести к путанице; см. встроенные комментарии:

var s1, s2, n1, n2;

// These are false because with ===, an object is never equal to a non-object
s1 = new String("hi");
s2 = "hi";
console.log(s1 === s2); // false
n1 = new Number(42);
n2 = 42;
console.log(n1 === n2); // also false

// These are false because even with ==, two *different* objects are never equal
// (even if they're equivalent)
s1 = new String("what the...");
s2 = new String("what the...");
console.log(s1 == s2);  // also false
n1 = new Number(42);
n2 = new Number(42);
console.log(n1 == n2);  // also false

Ответ 2

Это изменяет интуитивно понятный способ, которым операторы ведут себя с числами, строками и булерами:

  • строгое сравнение (===) ломается при построении любого из чисел, поэтому 42 === 42 истинно, а 42 === new Number(42) - нет,
  • абстрактное сравнение (==) ломается, когда оба числа являются объектами, поэтому 42 == new Number(42) истинно, а new Number(42) == new Number(42) - нет,
  • оператор typeof дает другой результат при построении числа, поэтому typeof(42) number, но typeof(new Number(42)) есть object,
  • при преобразовании в логическое значение, 0 является ложным, но new Number(0) является истинным, поэтому следующие два будут иметь другое поведение:

var a = 0;
if (a)
  console.log("not zero");
else
  console.log("zero!");     // "zero!"

var b = new Number(0);
if (b)
  console.log("not zero");     // "not zero"
else
  console.log("zero!");