[javascript] 숫자 유형을 객체 키로 사용하는 방법이 있습니까?

객체의 키 이름으로 숫자 유형을 사용하면 항상 문자열로 변환되는 것 같습니다. 어쨌든 실제로 숫자로 저장할 수 있습니까? 정상적인 타입 캐스팅이 작동하지 않는 것 같습니다.

예:

var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

Dir 출력 :

{
    '1': 'a value'
}

내가 원하는 것은 다음과 같습니다.

{
    1: 'a value'
}

조언?



답변

아니요, 불가능합니다. 키는 항상 문자열로 변환됩니다. 참조 속성 접근 자 문서를

속성 이름은 문자열이어야합니다. 즉, 문자열이 아닌 개체는 개체에서 키로 사용할 수 없습니다. 숫자를 포함한 문자열이 아닌 객체는 toString 메소드를 통해 문자열로 형변환됩니다.

> var foo = {}
undefined

> foo[23213] = 'swag'
'swag'

> foo
{ '23213': 'swag' }

> typeof(Object.keys(foo)[0])
'string'


답변

개체에서는 아니요,하지만 이 응용 프로그램에 Map이 매우 유용하다는 것을 알았습니다 . 여기에서 키 기반 이벤트 인 숫자 키에 사용했습니다.

onKeydown(e) {
  const { toggleSidebar, next, previous } = this.props;

  const keyMapping = new Map([
    [ 83, toggleSidebar ],  // user presses the s button
    [ 37, next          ],  // user presses the right arrow
    [ 39, previous      ]   // user presses the left arrow
  ]);

  if (keyMapping.has(e.which)) {
    e.preventDefault();
    keyMapping.get(e.which)();
  }
}


답변

ECMA-262-5에서 의도적으로 설계된 것처럼 보입니다.

속성 식별자 유형은 속성 이름을 속성 설명자와 연결하는 데 사용됩니다. 속성 식별자 유형의 값은 형식 (이름, 설명자)의 쌍입니다. 여기서 이름은 문자열이고 설명자는 속성 설명자 값입니다.

그러나 ECMA-262-3에는 이에 대한 명확한 사양이 없습니다. 그럼에도 불구하고 나는 속성 이름으로 비 문자열을 사용하지 않을 것입니다.


답변

이런 게 필요한가요?

var userId = 1;var myObject ={};
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

콘솔 : 개체

1 : “값”


답변

위의 것을 숫자처럼 접근하기 위해 사용하고 싶다면 다음과 같이 할 수 있다고 생각합니다.

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key))){
          return true; //continue;
     }
     //Code to perform operation
}

키가 숫자로 시작하지 않는 경우에만 작동합니다. 그렇지 않으면 숫자로 변환됩니다. 다음 예를 참조하십시오.

parseInt("45kjghk") === 45

여기서 jQuery를 사용했습니다.


업데이트 :

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key)) || (key.length !== parseInt(key).toString().length) ){
          return true; //continue;
     }
     //Code to perform operation
}

위의 문제를 극복 할 수 있습니다. 가능한 경우 더 나은 것을 제안하고 있으면이 답변에 문제가 있습니다.


답변

자바 스크립트에서 숫자 문자열과 숫자는 서로 바꿔 사용할 수 있으므로

myObject[1] == myObject['1']

정말로 숫자가 객체의 키가되기를 원한다면 배열을 원할 수 있습니다 (예 : new Array()또는로 생성됨 []).


답변