странное поведение метода среза массива на javascript - PullRequest
0 голосов
/ 02 апреля 2020

Я обнаружил очень странное поведение массива, когда он используется в классе ... Я пытался выяснить, что происходит, но я не мог обернуться. Вот что произошло.

class wtf{
  constructor(){
    this.array=[0,2,3];
    this.fn=this.fn.bind(this);
  }
  fn(){
    console.log(this.array.slice(0,this.length));// will print [0,2,3]
    console.log(this.array.slice(0,this.length-1));// will print an empty array
  }
}
const k=new wtf();
k.fn();

Это работает совершенно нормально, когда я пытаюсь получить весь массив, используя this.array.slice(0,this.length). Это даст мне полный массив. Но затем, когда я пытаюсь использовать this.array.slice(0,this.length-1), чтобы получить массив, не включающий последний элемент, он даст мне пустой массив вместо того, что я хотел. Кажется, это происходит только тогда, когда это написано в методе объекта. Потому что он нормально работает.

const array=[0,2,3];
console.log(array.slice(0,this.length-1)); // will print [0,2]

Я пытался удалить метод bind, чтобы посмотреть, влияет ли это на поведение, но все равно дает мне тот же результат ...

Может кто-нибудь объяснит, почему это происходит?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Ваш код неверен, введите this.array.length -1

this.length undefined

Из вашего разговора, который я обнаружил, вы пытаетесь унаследовать DOM Array

Попробуйте наследовать Array следующим образом

class MyArray extends Array {
   constructor(props){
    super();
    for(var i=0;i<arguments.length;i++) this.push(arguments[i]);
   }
}

const k=new MyArray(5,6,7,8);
console.log(k.length);
0 голосов
/ 02 апреля 2020

проблема связана с ключевым словом this внутри метода slice. Он пытается найти свойство length объекта, которое не определено. Также не определено - 1 приводит к NaN

ваш код такой же, как следующий код:

class wtf{
  constructor(){
    this.array=[0,2,3];
  }
  fn(){
   let length = this.array.length
    console.log(this.array.slice(0,undefined));// undefined because length is not defined on the object
    console.log(this.array.slice(0,NaN));// NaN because undefined-1 is NaN
  }
}
const k=new wtf();
k.fn();

Вместо этого попробуйте это:

class wtf{
  constructor(){
    this.array=[0,2,3];
  }
  fn(){
   let length = this.array.length
    console.log(this.array.slice(0,length)); // logs [0,2,3]
    console.log(this.array.slice(0,length-1)); // logs [0,2]
  }
}
const k=new wtf();
k.fn();
...