2015-11-30 8 views
2

Я создаю несколько конкретных функций для компилятора, над которым я работаю, но некоторые ограничения в природе компилятора помешают мне использовать встроенные методы JavaScript, такие как Array.prototype.pop(), для выполнения всплывающих окон массива. .Restricted JavaScript Array Pop Polyfill не работает

Поэтому я решил попытаться написать некоторый рудиментарный псевдокод, чтобы попытаться подражать процессу, а затем основывать свою конечную функцию на псевдокоде ... Но мои тесты, похоже, терпят неудачу ... на основе текущее поведение компилятора, это позволит мне использовать array.length, назначение элементов массива, и это о нем ... Мой код ниже ...

pop2 = function(arr) { 
    if(arr.length>0){ 
     for(var w=undefined,x=[],y=0,z=arr.length;y<=z;y++){ 
      y+1<z?(x[y]=arr[y]):(w=arr[y],arr=x); 
     } 
    } 
    return w; 
} 
Arr = [-1,0,1,2]; 

// Testing... 
console.log(pop2(Arr)); // undefined... should be 2 
console.log(Arr); // [-1,0,1,2]... should be [-1,0,1] 

Я пытаюсь подражать природе функции pop, но не может показаться, что мой палец указывает на то, что заставляет функцию по-прежнему предоставлять undefined, а исходный массив ... undefined должен возвращаться только в том случае, если начальный пустой массив отправлено, точно так же, как вы ожидали бы с помощью [].pop() ...

У кого-нибудь есть подсказки относительно того, как я могу адаптировать этот код, чтобы правильно имитировать поп?

И хотя я слышал, что arr.splice(array.length-1,1)[0]; может работать ... компилятор в настоящее время не способен определять splice или аналогичные методы ... Возможно ли это сделать, используя изменение моего кода?

Заранее спасибо ...

ответ

2

Вы действительно задумались [].pop(). As defined in the specs, процесс [].pop() является:

  1. Получить длину массива
  2. Если длина 0
    1. возвращение undefined
  3. Если длина больше, чем 0
    1. Получать товар в length - 1
    2. Уменьшить array.length на 1
    3. Возврат товара.

(... плюс несколько вещей, что двигатель JavaScript должен сделать за кадром, как вызов ToObject на массив или обеспечить длину является беззнаковое 32-битное целое число.)

Это может быть сделано с такой же простой функцией, как и ниже, нет необходимости в цикле.

function pop(array) { 

    var length = array.length, 
     item; 

    if (length > 0) { 

     item = array[length - 1]; 
     array.length -= 1; 

    } 

    return item; 

} 

Редактировать

Я предполагаю, что проблема с компилятором, что Array.prototype.pop не понял вообще. Повторно прочитав сообщение, похоже, что у массивов есть метод pop, но компилятор не может решить, является ли переменная массивом или нет. В этом случае еще более простой вариант этой функции будет следующим образом:

function pop(array) { 
    return Array.prototype.pop.call(array); 
} 

Try, что первым, как это будет немного быстрее и надежнее, если он работает. Это также шаблон для любого другого метода массива, который вам может понадобиться использовать.

0

С этой модификации, это работает:

http://jsfiddle.net/vxxfxvpL/1/

pop2 = function(arr) { 
    if(arr.length>0){ 
     for(var w=undefined,x=[],y=0,z=arr.length;y<=z;y++){ 
      if(y+1<z) { 
       (x[y]=arr[y]); 
      } else { 
       (w=arr[y],arr=x); 
       break; 
      } 
     } 
    } 
    return w; 
} 
Arr = [-1,0,1,2]; 

// Testing... 
console.log(pop2(Arr)); // 2 

Теперь проблема заключается в удалении последнего элемента. Вы должны построить исходный массив снова без последнего элемента. У вас будут проблемы с этим, потому что вы не можете изменить исходный массив. Вот почему эти задачи затушевываются prototype (Array.prototype.pop2, может быть, может вам помочь)

 Смежные вопросы

  • Нет связанных вопросов^_^