이 기사의 예에서는 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입니다.