第 76 题:说出以下代码运行结果

发布于 2022-06-12 14:50:54 字数 336 浏览 1147 评论 14

// example 1
var a={}, b='123', c=123;
a[b]='b';
a[c]='c';
console.log(a[b]);

// example 2
var a={}, b=Symbol('123'), c=Symbol('123');
a[b]='b';
a[c]='c';
console.log(a[b]);

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

拧巴小姐 2022-05-04 13:56:12
// example 1
var a={}, b='123', c=123;  
a[b]='b';
a[c]='c';  
console.log(a[b]);

---------------------
// example 2
var a={}, b=Symbol('123'), c=Symbol('123');  
a[b]='b';
a[c]='c';  
console.log(a[b]);

---------------------
// example 3
var a={}, b={key:'123'}, c={key:'456'};  
a[b]='b';
a[c]='c';  
console.log(a[b]);
久伴你 2022-05-04 13:56:12

看完流下了没有技术的泪

怀念你的温柔 2022-05-04 13:56:12

输出以下代码运行结果

// example 1
var a={}, b='123', c=123;  
a[b]='b';
a[c]='c';  
console.log(a[b]);

---------------------
// example 2
var a={}, b=Symbol('123'), c=Symbol('123');  
a[b]='b';
a[c]='c';  
console.log(a[b]);

---------------------
// example 3
var a={}, b={key:'123'}, c={key:'456'};  
a[b]='b';
a[c]='c';  
console.log(a[b]);
  • 第一题,JS里对象的key都是字符串或者symbol,其他类型的都会被转换成字符串,所以b和c都是'123',指向同一个属性,所以会被覆盖,输出 c
  • 第二题,symbol可以作为对象的key且任何一个symbol的值都是唯一的不会被覆盖,所以输出b
  • 第三题,对象当作key时,会调用toString方法转换成字符串,所以两个key都是[object Object],所以输出c
來不及說愛妳 2022-05-04 13:56:12

再加一题

// example 4
var a={}, b=function(){return 1} c=function(){return 2};
a[b]='b';
a[c]='c';
console.log(a[b]);

空城旧梦 2022-05-04 13:56:12

再加一题

// example 4
var a={}, b=function(){return 1} c=function(){return 2};
a[b]='b';
a[c]='c';
console.log(a[b]);

你这代码书写有问题,少了逗号啊!function也会调用toString方法,所以结果是b

一杆小烟枪。 2022-05-04 13:56:11

喜欢这种 看着简单却做不对的题目TT

山人契 2022-05-04 13:56:11

对象类型应该是调用 String() 方法转为字符串吧。

被翻牌 2022-05-04 13:56:11

javascript 普通对象的key都是字符串。

所以:

1,a[c]会先将c转换为字符串,然后再赋值。
2,symbol也可以作为普通对象的key,而且这两个symbol不是相等的。
3,先将对像转换为字符串,然后赋值,所以第二个覆盖了第一个,如果给对象增加一个toString()方法那就会不一样了。

独自唱情﹋歌 2022-05-04 13:56:07

前面说的很清楚了,除了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'
绮筵 2022-05-04 13:55:48

我是知道了这个题考察的 对象 键名转换,我知道键名是string,但是第三个我想成了 stringify ,toString就比较容易理解了

深海夜未眠 2022-05-04 13:38:53

我是这样的,看完解析,才恍然觉得我好像以前记过这个啊!!

酸甜透明夹心 2022-05-04 12:08:20

牛皮~ 看起来又是不会的知识

情话已封尘 2022-05-04 10:55:36

Got it!

要走干脆点丶 2022-05-02 17:06:38

这题考察的是对象的键名的转换。

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

// c 的键名会被转换成字符串'123',这里会把 b 覆盖掉。
a[c]='c';  

// 输出 c
console.log(a[b]);
// example 2
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]);
// example 3
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]);
~没有更多了~

关于作者

0 文章
0 评论
25 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文