Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.08.2017, 13:38
Аспирант
Отправить личное сообщение для vitek-82 Посмотреть профиль Найти все сообщения от vitek-82
 
Регистрация: 18.03.2017
Сообщений: 30

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

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

В обоих __proto__ имеет одинаковые свойства и методы. Какое объявление лучше использовать и для чего? Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 30.08.2017, 13:44
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

отличается более короткой записью, ее и используйте.
Ответить с цитированием
  #3 (permalink)  
Старый 30.08.2017, 14:04
Аспирант
Отправить личное сообщение для vitek-82 Посмотреть профиль Найти все сообщения от vitek-82
 
Регистрация: 18.03.2017
Сообщений: 30

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

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

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


... потому как такое объявление объектов так же идентично
Ответить с цитированием
  #4 (permalink)  
Старый 30.08.2017, 14:16
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

лучше через литералы.
var obj = {}, arr=[];
Ответить с цитированием
  #5 (permalink)  
Старый 30.08.2017, 14:24
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,008

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

Подробнее читай про конструкторы. Результат работы тот же но работают эти механизмы по разному.
Ответить с цитированием
  #6 (permalink)  
Старый 30.08.2017, 14:56
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,489

vitek-82,
Каждый встроенный объект ведет себя по разному с new и без new, надо узнавать особенности Standard built-in objects.
Ответить с цитированием
  #7 (permalink)  
Старый 30.08.2017, 15:28
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 322

Немножко не в тему, но в качестве прикола.
Код, которым можно свести с ума программиста на 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
Ответить с цитированием
  #8 (permalink)  
Старый 30.08.2017, 15:57
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 867

vitek-82,

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


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

бытует мнение, что если функция будет работать только как конструктор, то желательно сделать именно так, тогда new будет необязательно.
Ответить с цитированием
  #9 (permalink)  
Старый 30.08.2017, 16:26
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,008

Сообщение от rgl Посмотреть сообщение
Немножко не в тему, но в качестве прикола.
Код, которым можно свести с ума программиста на 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 есть.
Я вот товарищу перегрузил операторы + и - и по полнолуниям нельзя было складывать или вычитать единицу из целых чисел. А ты про приведение типов )).
Ответить с цитированием
  #10 (permalink)  
Старый 30.08.2017, 16:34
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,482

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем отличаются 2 вызова? wwwboy jQuery 4 07.12.2011 21:47
Чем отличаются объекты HTMLCollection и NodeList? Cooskon Events/DOM/Window 4 12.09.2010 17:32
Многомерный массив в json Л_Денис Общие вопросы Javascript 1 21.04.2010 20:43