【问题标题】:Iterating through object with `Object.keys().forEach()` changes value type使用 `Object.keys().forEach()` 遍历对象会更改值类型
【发布时间】:2020-06-26 20:46:08
【问题描述】:

考虑以下示例代码:

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 在某些情况下自动解析变量(例如将数字连接到字符串)以及将所述变量传递给回调函数有关。

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

【问题讨论】:

    标签: javascript object iteration


    【解决方案1】:

    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);
    });

    【讨论】:

      【解决方案2】:

      val 只是一个 foreach 迭代器索引号。需要使用obj[key]获取值

      【讨论】:

        【解决方案3】:

        forEach 的第一个参数是一个值,第二个是数组的索引

        let obj = {a: '1', b: '2'};
        
        Object.keys(obj).forEach(function(key, index){
          console.log(typeof index);    //returns: number
          console.log(typeof key);      //returns: string
        });
        
        console.log(typeof obj['a']);   //returns: string
        

        【讨论】:

          猜你喜欢
          • 2022-11-14
          • 1970-01-01
          • 2016-07-27
          • 2012-06-21
          • 2013-03-11
          • 2014-02-19
          • 1970-01-01
          • 1970-01-01
          • 2021-07-29
          相关资源
          最近更新 更多