Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   чем отличаются объявления Array от new Array (https://javascript.ru/forum/misc/70357-chem-otlichayutsya-obyavleniya-array-ot-new-array.html)

vitek-82 30.08.2017 13:38

чем отличаются объявления Array от new Array
 
Подскажите в чём отличие объявлений нового массива:
var arr = Array(5);
var arr1 = new Array(5);

console.dir(arr);  // Array[0]
console.dir(arr1);  // Array[0]

В обоих __proto__ имеет одинаковые свойства и методы. Какое объявление лучше использовать и для чего? Спасибо!

j0hnik 30.08.2017 13:44

отличается более короткой записью, ее и используйте.

vitek-82 30.08.2017 14:04

т.е. я так понимаю что разницы никакой и в :

var obj = new Object();
var obj1 = Object();

console.log(obj); // Object {}
console.log(obj1); // Object {}


... потому как такое объявление объектов так же идентично

j0hnik 30.08.2017 14:16

лучше через литералы.
var obj = {}, arr=[];

MallSerg 30.08.2017 14:24

По сути при инициализации переменной (var a = b) ты вызываешь конструктор который создает и встраивает переменную в текущий контекст. new отличается тем что на каждый вызов создает новый объект (на который указывает this) а "Object()" это вызов функции которая возвращает результат. В современных браузерах очень хорошие оптимизаторы которые не делают лишних движений без необходимости по этому разница не заметна и в скомпилированном коде ее нет.

Подробнее читай про конструкторы. Результат работы тот же но работают эти механизмы по разному.

Rise 30.08.2017 14:56

vitek-82,
Каждый встроенный объект ведет себя по разному с new и без new, надо узнавать особенности Standard built-in objects.

rgl 30.08.2017 15:28

Немножко не в тему, но в качестве прикола.
Код, которым можно свести с ума программиста на C/C++
var a = Boolean(false);
if( a )
  console.log( "a=true" );
else
  console.log( "a=false" );

var b = new Boolean(false);
if( b )
  console.log( "b=true" );
else
  console.log( "b=false" );

// a=false
// b=true

Alexandroppolus 30.08.2017 15:57

vitek-82,

такое поведение, как у Array или Object, достигается простым трюком:
function Func() {
  if (!(this instanceof Func)) {
    return new Func();
  }
  // дальше работа конструктора
}


в условие попадает случай вызова Func(), без new

бытует мнение, что если функция будет работать только как конструктор, то желательно сделать именно так, тогда new будет необязательно.

MallSerg 30.08.2017 16:26

Цитата:

Сообщение от rgl (Сообщение 463130)
Немножко не в тему, но в качестве прикола.
Код, которым можно свести с ума программиста на C/C++
var a = Boolean(false);
if( a )
  console.log( "a=true" );
else
  console.log( "a=false" );

var b = new Boolean(false);
if( b )
  console.log( "b=true" );
else
  console.log( "b=false" );

// a=false
// b=true

Ты реально думаешь что людей использующих язык с перегрузкой почти всех операторов где есть препроцессор и трюки с «#define true false» и ссылками на ссылки ссылок, все это смачно переправлено шаблонами и виртуальными функциями. Смутить банальным приведением типов четко описанном в спецификации ? =). Вряд ли можешь представить сколькими способами там можно выстрелить себе в ногу. там даже goto есть.
Я вот товарищу перегрузил операторы + и - и по полнолуниям нельзя было складывать или вычитать единицу из целых чисел. А ты про приведение типов )).

Nexus 30.08.2017 16:34

Цитата:

Сообщение от MallSerg
Ты реально думаешь что людей использующих язык с перегрузкой почти всех операторов где есть препроцессор и трюки с «#define true false» и ссылками на ссылки ссылок, все это смачно переправлено шаблонами и виртуальными функциями. Смутить банальным приведением типов четко описанном в спецификации ? =). Вряд ли можешь представить сколькими способами там можно выстрелить себе в ногу. там даже goto есть.

Страшный язык...


Часовой пояс GMT +3, время: 10:00.