使用 Object.keys().forEach() 迭代对象会改变值类型

Xan*_*dor -3 javascript iteration object

考虑以下示例代码:

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
Run Code Online (Sandbox Code Playgroud)

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

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

hev*_*ev1 8

回调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]);
});
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用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);
});
Run Code Online (Sandbox Code Playgroud)