首页 > 解决方案 > 使用 `Object.keys().forEach()` 遍历对象会更改值类型

问题描述

考虑以下示例代码:

let obj = {a: '1', b: '2'};

Object.keys(obj).forEach(function(key, val){
    console.log(typeof val);    //returns: number
});

console.log(typeof obj['a']);   //returns: string

我觉得这种行为很有趣。为什么这样做?我认为这与 JavaScript 在某些情况下自动解析变量(例如将数字连接到字符串)以及将所述变量传递给回调函数有关。

我也很好奇是否有一种简单的方法可以保留原始值类型?我知道您可以强制使用特定类型,但是有一种方法可以根据最初传递的内容将其保留为数字或字符串,而无需添加随后将设置为变量类型的变量?

标签: javascriptobjectiteration

解决方案


为回调提供Array.prototype.forEach了三个参数,当前值、索引和数组本身。val是第二个参数(实际上应该给它一个更合适的名称),所以它是索引,它是一个数字。

这可以帮助您理解:

let obj = {a: '1', b: '2'};

Object.keys(obj).forEach(function(key, idx, arr){
    console.log("Key:", key);
    console.log("Index:", idx);
    console.log("Original Array:", arr);
    console.log("Value:", obj[key]);
});

或者,您可以使用Object.entries直接访问值(使用解构):

let obj = {a: '1', b: '2'};

Object.entries(obj).forEach(function([key, val], idx, arr){
    console.log("Key:", key);
    console.log("Index:", idx);
    console.log("Original Array:", arr);
    console.log("Value:", val);
});


推荐阅读