hugh 的个人博客

忽略的知识点-Object key

起因:

const obj = {1: "a", 2: "b"}

console.log(obj["1"]) // a
console.log(obj[1]) // a

根据MDN中关于object构造器的描述

// 对象初始化器(Object initialiser)或对象字面量(literal)
{ [ nameValuePair1[, nameValuePair2[, ...nameValuePairN] ] ] }

nameValuePair1, nameValuePair2, ... nameValuePairN成对的名称(字符串)与值(任何值),其中名称通过冒号与值分隔。

键值会被存放为字符串类型(除symbol外)

范例:

var b = {}
b[1] = 1;
b["2"] = 2;
b[{c:3}] = 3
b[{e:4}] = 4
b[Symbol("f")] = 5

for(var i in b){
console.log(Object.prototype.toString.call(i))// [object String] * 3
}

Q1: 为什么结果只输出了三个

A1: Symbol作为键时,无法被遍历器遍历, 只能通过特定函数获取 Object.getOwnPropertySymbols(b)

同时因为{c:3}、{e:4}同时被转换成String -> '[object String]'存储, 所以只有三个输出


标题:忽略的知识点-Object key
作者:hugh0524
地址:https://blog.uproject.cn/articles/2019/07/04/1562205712090.html