简单说 !![]==true 与 []==true 引发的思考

thrift 大list序列化过慢引发的客户端耗时记录和服务端不一致问题 一、问题背景 最近在工作上遇到了一个问题,服务端说我们服务的返回长尾太长了,经常40+ms。找了一个trace发现,我们服务端记录这个trace从开始到返回,总共才花了6ms。多试了几个trace发现有同样的现象,这就很奇怪了。 二、问题分析 1. 请求链路 首先思考一下一个请求的整个链路都包含哪些阶段 如图所示,对于客户端来说,他们的耗时记录是在最上面两个过程中,但是服务端是最下面函数处理前后,两者差着序列化和tcp传输,所以猜测是不是这两个地方导致的问题。 2. tcp传输 我们的rpc框架用的是th 阅读详情

说明

直接说出问题

!![] == true //结果是true 
[] == true   //结果是false 
![] == []    //结果是true

为什么会出现这种情况

解释

首先说一下,如果你看到这些代码,能想到 相等运算符(== ),两个操作数类型不同时,进行的转换,那么你已经接近答案了。

不要浪费时间,我们需要先知道在JavaScript中的一些比较特别的类型转换,最好能记住哦!!!

[] 转为字符串是 ""       // String([]) 返回""
[] 转为数字是 0     	   // Number([]) 返回0
[] 转为布尔值是 true 	   // Boolean([]) 返回true
true 转为数字是 1       // Number(true) 返回1
false 转为数字是 0      // Number(false) 返回0

如果想知道为什么,请点这里。
简单说 JavaScript中的tostring( ) 与 valueOf( )方法

我们一句一句的看

!![] == true //结果是true
! (逻辑非),会将操作数的布尔值求反,而!! 就是类型转换,将对应的类型转换为boolean型
所以我们看一看,[ ]一次求反 (![]) 返回的就是false,再求反(!![]) 返回的就是true。
最后的比较就变成 true == true 自然结果是 true

[]==true //结果是false
这里我们重点说说,相等运算符(==) 在遇到两个操作数类型不同的时候,要遵守的规则和类型转换
1、如果-个值是null, 另一个是undefined,则它们相等
null == undefined //返回true
2、如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。

1 == "1" //1==1  //结果是true
2 == "1" //2==1  //结果是false

3、如果其中一个值是true,则将其转换为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较。

"1" == true 	//1==1 结果是true
0 == false  	//0==0 结果是true

4、如果一个值是对象,另一个值是数字或字符串,则将对象转换为原始值,然后再进行比较。对象通过toString()方法或者valueOf()方法转换为原始值,JavaScript语言核心的内置类先尝试使用valueOf(),再尝试使用toString(),除了日期类,日期类只能使用toString()转换,那些不是JavaScript语言核心中的对象则通过各自的实现中定义的方法转换为原始值。

原始值:不可变更的值,包括undefined、null、布尔值、数字、和字符串。

所有的对象都有toString() 和 valueOf()这两个方法。
toString()方法的作用是,返回一个反映这个对象的字符串。
valueOf()方法的作用是,一个对象那个如果存在任意原始值,它就默认将对象转换为表示它的原始值。

5、其他不同类型之间的比较均不相等。

好的,我们知道这些规则后,再来看行代码
[]==true //结果是false
true 会转为1
[ ] 会转为 0
最后是比较的是 0 == 1,所以结果是false

理解了上面的内容的话,那么
![] == [] //结果是true
这行代码,也就好理解了
![ ] ,也就是 [] 先转为 布尔值(true),然后求反,就是false,false 转为数字就是0
[ ]转为数字就是0
最后就是 0 == 0 ,所以结果就是true

总结

强调一点,[ ] 转数字 是0,转布尔值,是true,但是这不是说, 0 转为布尔值是true,而是false,是false,false。

这篇文章主要是说一些关于隐式转换的事。
根据上面的三行代码,还能写出一些其他的来,看看下面这些有趣的代码吧。

[] == 0      //返回结果是 true
![] == 0	 //返回结果是 true
[] == ''     //返回结果是 true
!![] == ''   //返回结果是 false
'' == true   //返回结果是 false

文章不长主要是想说清楚,最开始提到的问题。
最后推荐两篇相关的文章,希望对大家有所帮助。
简单说 JavaScript中的tostring( ) 与 valueOf( )方法
简单说 通过JS的隐式转换,关键时刻救你一命

电工识图入门:从电气符号到控制逻辑的完整指南 电工图纸是电气工程领域的通用语言,无论是设备安装、线路检修还是系统设计,看不懂图纸就像航海没有海图。很多初学者面对复杂的电气符号和线路走向感到无从下手,实际上只要掌握正确的识图方法,就能从简单的照明电路逐步过渡到复杂的自动化控制系统。 本文将从最基础的电气符号和图纸类型讲起,通过实际图纸案例解析,带你建立完整的识图逻辑。你将学会如何区分主回路和控制回路,如何追踪电流路径,以及如何结合图纸进行故障排查。无论你是电工新手、设备维护人员还是相关专业学生,这套方法都能帮你快速提升图纸理解能力。 1. 电气图纸基础: 阅读详情

相关推荐

【低空经济】无人机充电站设计方案

随着无人机技术的快速发展和广泛应用,其在物流、农业、巡检、救援等领域的应用日益普及。然而,无人机的续航能力一直是限制其大规模应用的关键因素之一。为了解决这一问题,无人机充电站的设计与建设显得尤为重要。本项目旨在设计一套高效、智能、可扩展的无人机充电站系统,以满足不同场景下无人机的充电需求,提升其作业效率和应用范围。无人机充电站的设计将围绕以下几个核心目标展开:首先,充电站应具备快速充电能力,以减少无人机的停机时间,提高作业效率;

2960

!![]==true 、 []==true与![] == []

!![]==true 、 []==true与![] == []

weixin_62176431的博客 694

ZXDoc工业级CAN总线仿真工具全解析与应用实践

CAN总线作为现代工业通信的核心协议,其仿真技术是汽车电子和工业控制领域的关键支撑。通过物理层信号模拟、协议层报文解析和应用层人机交互的三维仿真,开发者能够构建完整的硬件在环测试环境。ZXDoc作为工业级仿真工具,集成了DBC工程化管理、HMI面板设计和自动化测试脚本等核心功能,特别适用于ECU开发、产线验证等场景。工具支持ISO11898标准协议,提供错误帧注入、负载压力测试等高级特性,结合Python API可实现复杂测试用例的自动化执行。在新能源车VCU测试等实践中,通过优化采样点等参数配置,显著提升

weixin_30096975的博客 472

[] == false 和 !![] == true 解析

==是相等操作符,先转换再比较;===是全等操作符,仅比较不转换。

weixin_51204324的博客 439

基准电压 + 运放 + 低边MOS恒流源控制原理

因为恒流源强制 Iout不变,而 Vin​ 增加时,负载压降 Iout⋅Rload不变,多余的电压只能由MOS管的 VDS承担,因此 VDS必然增加。在饱和区,MOS 管的 ID 仅由 VGS决定,与 VDS 无关,这样,负载变化时,VDS可自由调整以维持 Iout恒定。当 Vin​ 小到无法满足 VDS>VGS−Vth时,MOS管进入线性区,Iout 会随 Vin​ 下降而减小,恒流失效。由于 Vref和 Rsense未变,Iout无需调整,运放无需动作,OUT保持不变,Iout恒定。

weixin_50643237的博客 2657

Webots+UR机械臂仿真全流程:手把手教你用Python实现Pick-and-Place轨迹规划

本文详细介绍了使用Webots和Python实现UR六自由度机械臂的Pick-and-Place轨迹规划全流程。从环境搭建、运动学正逆解计算到轨迹规划实战技巧,涵盖工业场景中的关节补偿、末端校准等实际问题解决方案,帮助开发者快速掌握机械臂精准控制技术。

weixin_29083649的博客 284

常见js中判断== true/false总结

常见js中判断==为true/false总结 false == 0 输出true;因为在做判断的时候,两者中有boolean(布尔类型),会把boolean先转化为number(数字类型),false为0,true是1。也就是等价于判断 0 == 0 ,结果为true。 ’ ’ == false 输出为true;js中空字符串与0相等,也就意味着空字符串等等于false。 ‘0’ == false 正确输出为true;这里犯了一个错误认为结果会是false,我想的是空字符串等于false,非空字符串

weixin_44774699的博客 9057

AT91SAM9260搭建LINUX操作系统

一、 编写目的 2 二、 系统搭建 2 1. 下载相关软件包 2 2. Bootstrap编译 3 3. U-BOOT编译 5 4. LINUX编译 7 5. 通过U-BOOT的TFTP命令从TFTP服务器下载系统镜像 9 6. 文件系统制作 10 7. 挂载NFS作为根文件系统 10 三、 总结 14 一、编写目的 本文档用于记录AT91SAM9260 LINUX学

lshiceman的专栏 7415

区分 is true 和 == true

关键字通常用于类型检查,特别是在模式匹配中。这里它被用于检查 check 是否是布尔类型并且值为。在C#中,有两种用于语句检测的语言。: 适用于任何布尔类型的变量。或其他类型),它将返回。是否是布尔类型,如果。,编译时会抛出错误。

weixin_50600749的博客 347

Nginx下ModSecurity模块安装详细教程

本文提供了在Nginx 1.28.0上安装ModSecurity v3的完整教程。首先需安装编译依赖,然后从源码编译安装ModSecurity库并设置优化参数。接着编译Nginx动态模块并配置加载。核心配置包括设置规则引擎、日志路径及性能优化参数。安装OWASP核心规则集后,在Nginx站点配置中启用ModSecurity。最后测试规则有效性并给出性能优化建议,如规则排除、精简规则集等。整个过程包含详细的命令和配置示例,确保安全防护功能正常运作。

深山技术宅的博客 1784

10X Genomics单细胞数据分析实战:从FASTQ到UMAP可视化的完整流程

本文详细介绍了10X Genomics单细胞数据分析的完整流程,从FASTQ原始数据处理到UMAP可视化。通过Seurat工具包实现数据质量控制、标准化、降维聚类和细胞注释,特别适合生物信息学新手学习。文章包含可复现的代码示例和常见问题解决方案,帮助研究者快速掌握单细胞测序数据分析的核心技术。

weixin_30952535的博客 535

JavaScript中的隐式转换和!![]==true与[]==true的思考

1.问题: !![] == true //结果是true [] == true //结果是false ![] == [] //结果是true 为什么会出现这种情况? 2.解释 不要浪费时间,我们需要先知道在JavaScript中的一些比较特别的类型转换,最好能记住哦!!! [] 转为字符串是 "" // String([]) 返回"" [] 转为数字是 0 ...

yangyang的专栏 9588

【运动规划算法项目实战】全覆盖分区算法

全覆盖规划在机器人学领域具有重要意义,其应用场景涵盖了自动农场、扫地机器人、扫描监视无人机等多个领域。该问题的核心目标是使机器人能够从指定起点出发,规划一条避开障碍物、同时路径尽可能短的轨迹,从而实现对特定区域的全面覆盖。在实际应用中,全覆盖规划的成功实现对于提高机器人在各类环境中的工作效率至关重要。这一问题的解决涉及到高效的路径规划和规划区域分解技术。其中,梯形单元分解算法是一种常用分区的技术,过将地图上需要规划的区域进行分区,采用梯形分解的方式,可以更好地应对复杂环境。全覆盖算法规划流程。

xiewf的博客 1万+

简单说 !![]==true 与 []==true 引发的思考

说明 直接说出问题 !![] == true //结果是true [] == true //结果是false ![] == [] //结果是true 为什么会出现这种情况 解释 首先说一下,如果你看到这些代码,能想到 相等运算符(== ),两个操作数类型不同时,进行的转换,那么你已经接近答案了。 不要浪费时间,我们需...

weixin_34349320的博客 244

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

几个小例子引发的思考

楚广明老师的c#教程每一节都会给出几个小例子让大家联系,对于初学者来说这确实是一件很纠结的事情,下面我把这几个小例子简单的写一下。同时看一下我们学到了什么 1、面向过程版的圆周长面积计算 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Console

金福林的博客 1200

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

线程池的应用-ChromeDriver自动化引发的思考

线程池的应用-ChromeDriver自动化引发的思考 文章目录线程池的应用-ChromeDriver自动化引发的思考1.前言2.设计与实现3.总结 1.前言 在ChromeDriver自动化开发过程中,左耳碰到了一个问题,就是ChromeDriver驱动是比较消耗资源的存在,所以要对它进行管制,正好左耳了解线程池的机制,其作用就是节约资源,避免不必要的创建与销毁开销,而ChromeDriver不...

左耳听风的博客 2697

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JavaScript中一个运算符优先级问题引发的思考

JavaScript中一个运算符优先级问题引发的思考 题目 假设 val 已经声明,可定义为任何值。则下面js代码有可能输出的结果为: console.log('Value is ' + (val != '0') ? 'define' : 'undefine'); A. Value is defineB. Value is undefin...

weixin_34408624的博客 175

c#几个小例子引发的思考

楚广明老师的c#教程每一节都会给出几个小例子让大家联系,对于初学者来说这确实是一件很纠结的事情,下面我把这几个小例子简单的写一下。同时看一下我们学到了什么 1、面向过程版的圆周长面积计算 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Con

飞蛾分吧 415

简单说 通过JS的隐式转换,关键时刻救你一命

说明JavaScript是非常灵活的,比如在比较的时候,会进行隐式转换,这很有趣,你如果对隐式转换不是特别熟悉,结果往往出乎你的意料,但这也正是它有趣的地方。 我们来看看这行代码 (![]+[])[+!![]- -+!![]- -+!![]]+({}+[])[+!![]]+(![]+[])[+!![]- -+!![]- -+!![]]这行代码的结果可能出乎你的意料,看结果 结果居然是sos

FEWY的博客 3万+

算法复习:由爬楼梯问题引发的斐波那契数列的 递归、动态规划的实现的思考

问题引出: leetcode NO.70 再做这类题的时候 如果无从下手: 可以考虑 1.暴力法能否解决 不行的话就考虑下面的方法 2.因为问题比较复杂 比较绕 那么就先只看基本情况 在考虑采用数学归纳法 归纳出一般性 3.找逻辑 找最近重复子问题,也就是要去找问题中重复的部分 ——可以考虑采用递归 递归 1.最普通的傻递归 O(2^n) 而且可能引发StackOverflow // 方法一:直接...

c22cxz的博客 263

一道循环题引发的深思~

  我们在敲代码的时候经常会遇到这样的问题,面对一道编程题,看着看着就在纸上列起了方程,,,然而计算机哪能给我们列方程!!我们要渐渐从以前上学学的数学解题思维中慢慢抽出来,一点一点地培养起我们的计算机的逻辑思维,我认为的最高境界就是——工具人!  为什么会有这番感慨,还是要从今天看到的非常简单的一道编程题,没有任何数组和集合等数据结构的内容,单单是一道一层的循环结构,我却默默地在纸上列起了方程...

qq_41936561的博客 1492

(持续更新中!!~)26、原来可以这样理解C语言_顺序表的应⽤

3)增加联系⼈信息 4)删除指定联系⼈ 5)查找制定联系⼈ 6)修改指定联系⼈ 7)显⽰联系⼈信息。1)⾄少能够存储100个⼈的通讯信息 2)能够保存⽤⼾信息:名字、性别、年龄、电话、地址等。200,我们再继续插⼊了5个数据,后⾯没有数据插⼊了,那么就浪费了95个数据空间。C语⾔基础要求:结构体、动态内存管理、顺序表、⽂件操作。【思考2】如何保证程序结束后,历史通讯录信息不会丢失。【思考1】⽤静态顺序表和动态顺序表分别如何实现。经典算法OJ题2: 合并两个有序数组。课后练习:静态顺序表实现通讯录。

do_yo的博客 1544

一个由斗地主引发的血案!~~

**引子: 今早起来开开心心逛逛网页,看到一个在腾讯面试AI智能工程师的妹子分享的面试题, 鹅厂面试官问:”斗地主是我们常玩的一种游戏,请问一下王炸的概率?”, 面试妹子:”emmm…”,心中估计一万个草泥马飞过中~~不过还是赶紧拿着笔和小本子去计算了.** 王炸!~~,看到这个小故事我也试着拿笔去算了算, (唉,尼玛,去试一下自己的智商下限!) 然后得出如下思路:地主20,...

风行云k(让编程成为一种享受!~) 714

一道“获得月份天数”题引发的迷思

一道“获得月份天数”题引发的迷思

MoeCany的博客 217

java 中 同构和异构_听课随想(17)同课之“同构”与“异构”

this.p={ m:2,b:2,loftPermalink:'',id:'fks_084064087095082068085087085095081081080067080087',blogTitle:'听课随想(17)同课之“同构”与“异构”',blogAbstract:'上午一口气听了三节语文课,有“三同”:同年级,八年级;同样的课,鲁迅先生的散文诗《雪》;同样的课堂设计:自由读--讲解“...

weixin_30824391的博客 289
上一篇: 简单说 JavaScript中的tostring( ) 与 valueOf( )方法
下一篇: 简单说 通过JS的隐式转换,关键时刻救你一命
FEWY
FEWY 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄10年 504粉丝 77原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值