眼见不一定为实!记一次JS字符串查找过程中遇到的让人怀疑人生的Bug的修复过程

本文主要是介绍眼见不一定为实!记一次JS字符串查找过程中遇到的让人怀疑人生的Bug的修复过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.浏览器坏了还是我的眼睛出问题了?开始怀疑人生。。。

首先,说一下发生问题的代码的场景,本来我是在写油猴脚本,不懂的可以百度一下,油猴脚本大体的用途就是可以让你在任何网站插入自己的JS代码并执行。

目标网站有一个很长的列表,我在目标网站插入自己的代码,代码的功能是添加一个按钮,按钮点击的时候 根据一个关键词数组在每个列表项里去查询是否包含可能的关键词。有几个列表项内容里包含了以下内容:

于是我想把以上2项内容 归类到一起 我使用了关键词 FCT 去查询所有列表项,结果代码没有查询到。返回一个空数组。着实让我很意外,因为我的代码是可以查询到别的关键词的,所以我没有怀疑是查询代码的问题。我觉得可能是 FCT 这个查询字符串的问题,于是 我重新刷新页面,等全部列表项加载完毕之后,我使用Chrome浏览器自带的查询功能(Ctrl+F)输入 FCT 字符串,更奇怪的事情发生了 ,Chrome也没有查询到相关的关键词。(不信的可以使用浏览器的查找功能看看能不能定位到这个 FCΤ) 我就纳闷了,我明明看见页面有好几个 FCT 为什么 浏览器说没有找到呢???我不解,我困惑。。。

2.根据经验进行初步的Bug分析

这时候,我以往的丰富的踩坑经验告诉我,页面显示的实际内容 可能跟我使用肉眼看到的内容 不一样。。那怎么验证呢??

当你不确定页面显示的字符是什么的时候,或者不知道怎样使用输入法打出那个字符的时候,有一个简单的小技巧,那就是使用复制功能。这个小技巧经常使用在设置一些软件的特殊昵称的时候派上用场,比如你想在自己的昵称里加上 π  或者 ☺  这时候 靠拼音 你是不能打印出这些字符的,这时候 你就可以使用 输入法的特殊符号也行 ,百度相关页面 然后去页面复制这些符号也行。然后就可以粘贴到你需要设置特殊昵称的软件里面了。

言归正传,我使用上面的 FCT 去搜索查询列表项,结果没有找到,那么有一种可能性:页面显示的肉眼看起来像是 FCT 但是实际上可能不是 英文字母的 FCT ,那我们怎么验证呢?

有些朋友应该已经想到了,我们可以使用上面的复制的方法,这时候我打开了Chrome浏览器的开发者工具,然后选中其中一条列表项,在控制台测试了以下代码,先给你们看一下结果,看看有人能看懂不。

对于不熟悉前端的开发者,我先解释一个东西,上面的$0代表我选中的那个HTML元素

我来逐条解释一下 每行代码执行时的环境和意思

1.输出HTML元素包含的文本内容,就是页面看到的内容,这里很清楚的能看到 内容 包含 FCT 

2.我在HTML文本内容里查询 FCT ,这个字符串是我手动输入的,执行结果false表明 没有查询到,虽然上面代码的执行结果里 看着 明明有一个 FCT。。。

3.这个结果就神奇了 ,这个结果是true 标明查询到了,为什么这个看起来和 上面 第二部的 一模一样,执行结果却不一样呢,这个跟第二部手动输入的 FCT 不同的是  这个是我 通过切换到 element面板 使用右键复制出来的内容,并不是手动输入的三个字母,结果就是true了。。。

这时候我拿出了文件比较的神器---Compare

新建2个文本文件:

1.TXT 手动输入 FCT 三个字母
2.TXT 通过element面板复制得到长得像FCT的三个字符

然后进行比对,一比对,果然结果表明两者不一样。。

记事本打开,两个文件看起来都像是 FCT 但是在Compare里 却变成了上图。

虽然不清楚为什么 T 变成了 韦  ,但是至少说明两个文件的内容 是不一样的。

这里基本上可以断定 页面显示的内容 和 我手动 输入的 FCT 三个字母是 不一样的。

肉眼看起来是一样的内容,实际上 是不一样的!

这里,我要插入一个很宝贵的经验:做开发,要使用工具去比较文件是否一样,不要肉眼比较!

3.深入分析和定位出现Bug的原因

上面我们已经知道,页面的显示内容肉眼看起来像是 英文字母 FCT,但是实际上不是,下一步我们就要断定,到底问题出在哪个字母上面,或者页面显示的内容到底是什么??

这时候我又拿出来了控制台 然后测试代码  具体请看以下截图:

由上面的截图的执行结果可以看到,在页面内容里能查询到F、FC,但是查不到FCT,由此可以断定 问题出在 字母  T 上面,现在还不知道这个长得像T的字母到底是什么。

真的万万没想到,万万没想到啊,一大群英文字母里混入了一个长得像英文字母,但是实际上不是英文字母的字符。。。

这时候,我们百度 “像T的字母”,搜索结果前几项就能看到一个 希腊字母里 有一个像 T的字母,

还能看到怎样输出这个字符:点输入法栏--菜单--软键盘--希腊字母

这时候我还是在控制台测试代码 先写上FC然后使用上面的方法输入这个T 然后发现果然查询结果是true 标明 这个字符就是希腊字符。。。我们上面不是说 Chrome浏览器自带的查找 也没找到吗,现在还是使用同样的方法去Chrome的查找框里输入,发现 FCT内容也能查询到了。。。

至此此次神奇Bug的分析已经完成。

4.解决Bug之后的问题思考和扩展

后来过了几分钟,我脑子中突然闪现,这个可以当成一道装逼的面试题啊,请看下面的表达式执行结果,问:为什么是false。

后来,想了想,还是不够迷惑人,只有一个字符 容易被识破,得加一些干扰字符,于是就是优化改造得到了下面的表达式:

这个表达式 能够唬住很多人吧,哈哈。原因有2个:

1.比较的字母是多个,增加找出出问题的那个字母的难度
2.JS里有 true,而此处是 True 多多少少会给回答问题的人增加一些分析问题时候的干扰

哈哈,觉得今天的这个Bug,挺有意思的,所以在此记录一下。也希望能给以后遇到类似问题的兄弟们一点提示和帮助吧。

 

最后,再说一遍:做开发,比较内容一定要使用工具!不要肉眼比较!!!

 

这篇关于眼见不一定为实!记一次JS字符串查找过程中遇到的让人怀疑人生的Bug的修复过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/387235

相关文章

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

Spring Boot 整合 Apache Flink 的详细过程

《SpringBoot整合ApacheFlink的详细过程》ApacheFlink是一个高性能的分布式流处理框架,而SpringBoot提供了快速构建企业级应用的能力,下面给大家介绍Spri... 目录Spring Boot 整合 Apache Flink 教程一、背景与目标二、环境准备三、创建项目 & 添

pytest+allure环境搭建+自动化实践过程

《pytest+allure环境搭建+自动化实践过程》:本文主要介绍pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、pytest下载安装1.1、安装pytest1.2、检测是否安装成功二、allure下载安装2.

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

Redis指南及6.2.x版本安装过程

《Redis指南及6.2.x版本安装过程》Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSIC语言编写、支持网络、... 目录概述Redis特点Redis应用场景缓存缓存分布式会话分布式锁社交网络最新列表Redis各版本介绍旧