前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试题:HTML标签的相关操作判断题目

面试题:HTML标签的相关操作判断题目

作者头像
木子星兮
发布2020-07-16 15:48:59
1.4K0
发布2020-07-16 15:48:59
举报
文章被收录于专栏:前端小码农

笔试题:HTML标签的相关操作判断

  1. 统计HTML标签中以b开头的标签数量
  2. 统计HTML标签中出现次数最多的标签
  3. 判断DOM标签的合法性
    • 标签的闭合
    • span里面不能有div
    • 其他符合HTML标签合法性的规则

一些基础知识

getElementsByTagName()

在DOM中根据标签去获取元素的原生api是 getElementsByTagName(),它返回的是一个包含所有给定标签名称的元素 HTML集合HTMLCollection[1], 整个文件结构都会被搜索,包括根节点。

我们可以通过 document.getElementsByTagName('*')来获取当前文档中的所有标签。

HTMLCollection

还有一点需要注意:

HTMLCollection 对象是一种类数组对象,可以通过位置来访问。

请注意,虽然可以通过方括号语法来访问 HTMLCollection 的值,而且这个对象也有length属性,但是它并不是Array的实例。所以在需要使用 数组的方法的时候,比如 forEach, filter 等需要将类数组转为真正的数组。下面几种方法都可以实现:

  • 扩展运算符可以将其转为真正的数组,这个里面也是有一点需要注意,是因为 HTMLCollection 对象实现了 Iterator。对于那些没有部署 Iterator 接口的类似数组的对象,扩展运算符就无法将其转为真正的数组。
代码语言:javascript
复制
// 1
let tags = document.getElementsByTagName('div');
let array = [...tags];

// 2
let arrayLike = {
  '0': 'a',
  '1': 'b',
  '2': 'c',
  length: 3
};

// TypeError: Cannot spread non-iterable object.
let arr = [...arrayLike];
  • Array.from:用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)
  • Array.prototype.slice.call(),比如在函数中我们经常使用它,将函数的参数 arguments(也是类数组)转为真正的数组 var args = Array.prototype.slice.call(arguments);

startsWith

下面引用自 ECMAScript 6 入门 - 字符串的新增方法[2]

JavaScript 只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6 又提供了三种新方法。

  • includes():返回布尔值,表示是否找到了参数字符串。
  • startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
  • endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
代码语言:javascript
复制
let s = 'Hello world!';

s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true

这三个方法都支持第二个参数,表示开始搜索的位置。

代码语言:javascript
复制
let s = 'Hello world!';

s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false

map

JavaScript的对象中只能使用字符串作为键,ES6 提供了 Map 数据结构,类似于对象,但是它的”键“不限制于字符串。Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应。map比对象更为灵活。

1. 统计HTML标签中以b开头的标签数量

代码语言:javascript
复制
const tags = document.getElementsByTagName('*');
// 要使用数组的方法必须将类数组转为真正的数组
const value = [...tags].filter((item) => item.tagName.startsWith('B'))

或者

代码语言:javascript
复制
const $prefixBElements = [];
function dfs($el) {
    if ($el.tagName.startsWith('B')) {
        $prefixBElements.push($el);
    }
    for (const $child of $el.children) {
        dfs($child);
    }
}
dfs(document.documentElement);
console.log($prefixBElements);

2. 统计HTML标签中出现次数最多的标签

实现一个统计一个字符串中出现字符最多的字符统计一篇文章中出现最多的字是差不多类型的题。

代码语言:javascript
复制
const tags = document.getElementsByTagName('*');
let map = new Map();
let maxStr = '';
let max = 0;
// 只是使用下标来获取,没有使用数组的方法,所以不需要将类数组转为数组
for(let i = 0; i < tags.length; i++) {
    let value = map.get(tags[i].tagName)
    if(value) {
        map.set(tags[i].tagName, ++value)
    } else {
        map.set(tags[i].tagName, 1);
    }
    if(value > max) {
        maxStr = tags[i].tagName;
        max = value;
    }
}
console.log(`当前最多的标签为 ${maxStr},个数为 ${max}` );

当然此题中使用对象来存储也是可以的。

3. 判断DOM标签的合法性

判断标签的闭合可以使用栈,跟判断有效的括号差不多。

Vue中的 compiler/parser/html-parser.js[3] 中其实会有该部分相关的逻辑实现。

这道题暂时还没想到合适的答案,如果你有合适的答案,欢迎提供给我。

参考资料

[1]

HTMLCollection: https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCollection

[2]

ECMAScript 6 入门 - 字符串的新增方法: https://es6.ruanyifeng.com/#docs/string-methods

[3]

compiler/parser/html-parser.js: https://github.com/vuejs/vue/blob/dev/src/compiler/parser/html-parser.js

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 牧码的星星 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 笔试题:HTML标签的相关操作判断
  • 一些基础知识
    • getElementsByTagName()
      • startsWith
        • map
        • 1. 统计HTML标签中以b开头的标签数量
        • 2. 统计HTML标签中出现次数最多的标签
        • 3. 判断DOM标签的合法性
          • 参考资料
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档