[查遗补漏] 对象的键名转换

我心飞翔 分类:javascript

今天继续冲鸭!!!

根据代码题,查遗补漏一些JavaScript知识点。

今天的代码题如下:

  • 对象的键名只能是字符串和 Symbol 类型。
  • 其他类型的键名会被转换成字符串类型。
  • 对象转字符串默认会调用 toString 方法。
var a={}, b='123', c=123;  
a[b]='b'; //此时 a = { 123: 'b' }

a[c]='c'; // c 的键名会被转换成字符串'123',这里会把 b 覆盖掉。
          // 此时 a = { 123: 'c' }
console.log(a[b]); // 输出c
 
var a={}, b=Symbol('123'), c=Symbol('123');  

// b 是 Symbol 类型,不需要转换。
a[b]='b';

// c 是 Symbol 类型,不需要转换。任何一个 Symbol 类型的值都是不相等的,所以不会覆盖掉 b。
a[c]='c';

// 输出 b
console.log(a[b]);
 
var a={}, b={key:'123'}, c={key:'456'};  

// b 不是字符串也不是 Symbol 类型,需要转换成字符串。
// 对象类型会调用 toString 方法转换成字符串 [object Object]。
a[b]='b';

// c 不是字符串也不是 Symbol 类型,需要转换成字符串。
// 对象类型会调用 toString 方法转换成字符串 [object Object]。这里会把 b 覆盖掉。
a[c]='c';  

// 输出 c
console.log(a[b]);
 

对象

普通对象(plain object)

  • 属性的键必须是字符串或者 symbol(通常是字符串)
  • 值可以是任何类型

我们可以用下面的方法访问属性:

  • 点符号: obj.property
  • 方括号 obj["property"],方括号允许从变量中获取键,例如 obj[varWithKey]

其他操作:

  • 删除属性:delete obj.prop
  • 检查是否存在给定键的属性:"key" in obj
  • 遍历对象:for(let key in obj) 循环。

注意:

  • 使用const声明的对象是可以被修改的

ES6 Map

Map对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。

上面的代码题中,除了Symbol,如果想要不被覆盖 可以使用ES6提供的Map

var a=new Map(), b='123', c=123;
a.set(b,'b');
a.set(c,'c');
a.get(b);  // 'b'
a.get(c);  // 'c'
 

参见

  • zh.javascript.info - 对象
  • 对象引用和复制
  • muyiy.cn/question/js…

回复

我来回复
  • 暂无回复内容