>  기사  >  웹 프론트엔드  >  Javascript 배열의 push 메소드 활용 분석

Javascript 배열의 push 메소드 활용 분석

高洛峰
高洛峰원래의
2016-12-08 13:31:051835검색

이 기사의 예에서는 Javascript 배열에서 push 메소드를 사용하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.

다음 코드를 살펴보세요.

var o = {
  1:'a'
  ,2:'b'
  ,length:2
  ,push:Array.prototype.push
};
o.push('c');

Q:o 지금 내부 가치는 어떤 모습인가요?

첫 번째 반응은 거부감이었습니다. 왜 불합리한 상황에서 [설명 엔진]의 동작을 연구합니까? 하지만 이런 추론은 때로 매우 매력적이어서 돌아와서 곰곰이 생각해보니 사실 매우 간단하다는 것을 알게 되었습니다.

Push 방식은 반사적으로 스택을 생각합니다. [클래식 스택의 데이터 구조] 스택 푸시 및 팝 작업은 스택의 최상위 포인터를 기반으로 합니다. 이는 스택을 누르면 자동으로 증가하거나 감소함을 의미합니다. JavaScript의 배열에서 이 포인터는 길이입니다. 따라서 위 코드에서 o.push('c')는 o.2 = 'c'입니다(물론 o.2는 직접 액세스할 수 없습니다. 이는 의사 코드일 뿐입니다). 따라서 코드가 실행된 후 o에 있는 데이터는

{
  1:'a'
  ,2:'c'
  ,length:3 //push操作=>length+1
  ,push:Array.prototype.push
}

추가 설명:

JavaScript에서는 모든 것이 객체이며, JavaScript 객체 간에는 약간의 차이가 있습니다. 강력한 형식의 개체는 업적이 키-값 쌍의 모음임을 이해합니다. 배열 유형도 예외는 아닙니다. 해당 첨자 액세스는 키 액세스입니다(그러나 해당 키는 모두 자연수입니다). 위의 예에서 a에 할당된 객체 리터럴은 실제로 배열(1개의 배열에서 시작하는 첨자)을 시뮬레이션합니다. 배열에는 몇 가지 특성만 있습니다. 예를 들어 실제 배열에 키를 사용하여 액세스하면 길이를 기준으로 범위를 벗어난 검사를 수행합니다.

푸시 위치가 길이에 따라 결정된다는 점만 알면 다음과 같이 이상해 보이는 현상을 쉽게 이해할 수 있습니다.

//1.length不存在,引擎置为0
var o = {
  '1':'a'
  ,'2':'b'
  ,push:Array.prototype.push
};
o.push('c');//c {0:'c',1:'a',2:'b',...}
//2.length为负值,这是个有趣的问题,涉及到原码反码和补码【1】
var o = {
  '1':'a'
  ,'2':'b'
  ,length:-1
  ,push:Array.prototype.push
};
o.push('c');//c {1:'a',2:'b',4294967295:'c',length:4294967296,...}
//3.length为字符或对象
var o = {
  1:'a'
  ,2:'b'
  ,length:'A'
  ,push:Array.prototype.push
};
o.push('c');//c {0:'c',1:'a',2:'b',length:1,...}我还以为js解释器会把A转换成ASCII码来给length赋值呢,终于看到了javascript的自由还是有节操的

컴퓨터의 숫자 값은 2의 보수 형식으로 저장됩니다. 연산을 용이하게 하기 위해 -1의 보수는 4294967295의 보수와 동일합니다. 길이의 의미에 따라 부호 없는 숫자는 다음과 같습니다

[-1] Complement = 1111 1111 1111 1111 1111 1111 1111 1111 = [4294967295] Supplement = 1111 1111 1111 1111 1111 1111 1111 1111

o를 쌍으로 누릅니다. 2객체, 키는 4294967296 이지만, 배열의 최대 길이는 4294967296으로 제한됩니다. 즉, 아래 첨자는 4294967295까지만 사용할 수 있고 32비트만 사용할 수 있습니다. - 4294967296 = 1 0000 0000 0000 0000 0000 0000 0000 0000의 경우 마지막 32비트를 가져온 후, 0이 되므로 이 푸시의 위치는 0입니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.