看来,当我在对象中使用数字类型作为键名时,它总是会转换为字符串。无论如何,实际上是否可以将其存储为数字?正常的类型转换似乎不起作用。
例:
var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);
目录输出:
{
'1': 'a value'
}
我想要的是:
{
1: 'a value'
}
忠告?
看来,当我在对象中使用数字类型作为键名时,它总是会转换为字符串。无论如何,实际上是否可以将其存储为数字?正常的类型转换似乎不起作用。
例:
var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);
目录输出:
{
'1': 'a value'
}
我想要的是:
{
1: 'a value'
}
忠告?
Answers:
不,这是不可能的。 密钥将始终转换为字符串。请参阅属性访问器文档
属性名称必须是字符串。这意味着非字符串对象不能用作对象中的键。任何非字符串对象(包括数字)都可以通过toString方法转换为字符串。
> var foo = {}
undefined
> foo[23213] = 'swag'
'swag'
> foo
{ '23213': 'swag' }
> typeof(Object.keys(foo)[0])
'string'
length属性。
myArray["1"] = foo,关联语法似乎在设置属性,而实际上却在设置数组元素,但这仅是因为“ 1”是整数的字符串表示形式,这是完全的语言废话-但这就是Javascript。
myArray["1"] = foo不只是看起来要设置一个属性,它实际上是在设置属性(一键“1”)中的定义属性的每一个意义。例如,myArray.hasOwnProperty("1")产量true。从语义上讲,由于具有数字键,此属性也可以被视为“元素”,但是没有什么可以将数组“元素”与数组属性区分开的了。阅读规格。如果您仍然不同意,请引用您的消息来源。
在一个对象中,没有,但是我发现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)();
}
}
我们需要这样的东西吗?
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
}
它可以克服上述问题。如果可以的话,请提出更好的建议,如果有问题,请回答这个问题。
在JavaScript中,数字字符串和数字可以互换,因此
myObject[1] == myObject['1']
如果您确实希望数字成为对象的键,则可能需要一个数组(即用new Array()或创建[])。
Object.prototype.toString.call(someObject)问题:您不能将数字用作键。