为什么.includes()不能与.classList一起使用?

Bra*_*don 15 javascript

element.classList返回一个类数组,它understanding .includes()与数组一起使用,所以我不明白为什么这不起作用,我知道我可以使用.contains()和classList,但我很好奇为什么.includes()没有工作.

两者都是数组,如果我输入这个例如它不会工作

var li=document.createElement('li');
li.classList.add('main-nav');
li.classList.includes('main-nav');
Run Code Online (Sandbox Code Playgroud)

但这会

var ary=['a','b','c'];
ary.includes('a');                               
Run Code Online (Sandbox Code Playgroud)

vad*_*lim 27

Element.classList是一个DOMTokenList对象,虽然它在控制台中打印出类似数组的对象.但如果你尝试使用Firefox,它就会回归DOMTokenList["main-nav"]

并且,包括一个方法阵列,而不是DOMTokenList.

这就是为什么预计会遇到li.classList.includes is not a function你的情况.

您可以使用ES2015扩展运算符将其转换为数组.

[...li.classList].includes('main-nav')
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用DOMTokenList.contains方法.

li.classList.contains('main-nav')
Run Code Online (Sandbox Code Playgroud)

为什么它被声明为includes代替hascontains?(感谢@akinuri)

引用该提案

Web具有像DOMStringListDOMTokenList 这样的类,它们类似于数组,并且具有名为contains的方法,其语义与我们的包含相同.不幸的是,与它们的网格划分不是网络兼容的.


evo*_*box 11

原因includes不起作用的原因是不是classList数组,而是数组类对象.在这种情况下,它是一个DOM Token List.

您可以使用以下命令将类似数组的对象转换为数组:

var liClasses = [].slice.apply(li.classList);
Run Code Online (Sandbox Code Playgroud)

要么

var liClasses = [...li.classList]; // es2015 syntax
Run Code Online (Sandbox Code Playgroud)

否则,.includes()应该是.contains().请参阅https://developer.mozilla.org/en-US/docs/Web/API/Element/classList

li.classList.contains('main-nav')
Run Code Online (Sandbox Code Playgroud)

包含(字符串)

检查元素的class属性中是否存在指定的类值.