为什么Map对象可以使用.has()判断键是否存在,却无法使用.includes()?
为什么Map对象可以使用.has()判断键是否存在,却无法使用.includes()?
嘿,我来给你把这个问题说透!
首先得搞明白:不同的JS内置对象,自带的方法是不一样的。你用的includes()是数组(Array)专属的方法,它的作用是检查某个值是不是在数组的元素里;而Map是ES6新增的键值对集合类型,它有自己一套专属的操作方法,has()就是专门用来判断某个键是否存在于Map里的方法。
你看你写的第一段代码,为啥quantWords.includes(word)会失效?因为Map这个类型根本就没提供includes()这个方法,JS引擎找不到这个方法,自然就没法正常工作啦。而第二段代码用quantWords.has(word)就没问题,这完全是踩中了Map的正确用法~
另外顺便提个小细节,你两段代码里的quantWords.set(word, + 1)其实都写错啦!这里应该写成quantWords.set(word, quantWords.get(word) + 1),不然每次只会把值设为1,根本做不到累加统计词频的效果哦,修正后才能得到正确的词频统计结果。
先看你那段用includes()的错误代码:
const sentence = "hello world hello boy"; let words = sentence.split(" "); const quantWords = new Map(); for (let word of words) { if (quantWords.includes(word)) { quantWords.set(word, + 1); } else { quantWords.set(word, 1); } } console.log(quantWords);
再看修正了方法(并且修正累加逻辑)的正确代码:
const sentence = "hello world hello boy"; let words = sentence.split(" "); const quantWords = new Map(); for (let word of words) { if (quantWords.has(word)) { // 这里修正为累加现有值 quantWords.set(word, quantWords.get(word) + 1); } else { quantWords.set(word, 1); } } console.log(quantWords);
要是你好奇有没有办法用includes()来实现类似判断?其实可以把Map的键转成数组再用,比如[...quantWords.keys()].includes(word),但完全没必要多此一举,直接用has()不仅代码更简洁,执行效率也更高,毕竟这是Map原生支持的操作。
备注:内容来源于stack exchange,提问作者Edilson Nogueira
相关产品推荐
相关产品推荐

