javascript - 使用 `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 在某些情况下自动解析变量(例如将数字连接到字符串)以及将所述变量传递给回调函数有关。
我也很好奇是否有一种简单的方法可以保留原始值类型?我知道您可以强制使用特定类型,但是有一种方法可以根据最初传递的内容将其保留为数字或字符串,而无需添加随后将设置为变量类型的变量?
解决方案
为回调提供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);
});
推荐阅读
- scala - 从 Cassandra 查询的数据无法在同一列上再次过滤(InvalidQueryException)
- php - 在哪里以及如何实例化依赖项
- ajax - ASP.NET MVC - 对pdf文件的服务器端的ajax调用?
- c++ - std::lists 的 std::vector 中的不可复制元素
- xpath - 难以找到正确的 xpath
- c - 在 C 中包含守卫
- angular - 无法使用@viewchild 获取模态内部元素的引用
- character - 如何从任何 Text VB.NET 或 C# 中获取真正的字符代码?
- php - PHP删除开头字符串中的所有标点符号、空格和数字
- html - 是否可以根据父元素的高度设置元素的宽度?这个怎么做?