整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

前端入门教程之 JS 「比较运算符」值的比较 javascript学习

们知道,在数学中有很多用于比较大小的运算符。

在 JavaScript 中,它们的编写方式如下:

  • 大于 / 小于:a > b,a < b。
  • 大于等于 / 小于等于:a >= b,a <= b。
  • 检查两个值的相等:a == b,请注意双等号 == 表示相等性检查,而单等号 a = b 表示赋值。
  • 检查两个值不相等:不相等在数学中的符号是 ≠,但在 JavaScript 中写成 a != b。

在本文中,我们将进一步了解不同类型的比较,JavaScript 是如何进行比较的,包括一些重要的特殊性。

在文末给出了一些秘诀,帮助你避免 “JavaScript 陷阱”相关的问题。

比较结果为 Boolean 类型

所有比较运算符均返回布尔值:

  • true —— 表示“yes(是)”,“correct(正确)”或“the truth(真)”。
  • false —— 表示“no(否)”,“wrong(错误)”或“not the truth(非真)”。

示例:

alert( 2 > 1 );  // true(正确)
alert( 2 == 1 ); // false(错误)
alert( 2 != 1 ); // true(正确)

和其他类型的值一样,比较的结果可以被赋值给任意变量:

let result = 5 > 4; // 把比较的结果赋值给 result
alert( result ); // true

字符串比较

在比较字符串的大小时,JavaScript 会使用“字典(dictionary)”或“词典(lexicographical)”顺序进行判定。

换言之,字符串是按字符(母)逐个进行比较的。

例如:

alert( 'Z' > 'A' ); // true
alert( 'Glow' > 'Glee' ); // true
alert( 'Bee' > 'Be' ); // true

字符串的比较算法非常简单:

  1. 首先比较两个字符串的首位字符大小。
  2. 如果一方字符较大(或较小),则该字符串大于(或小于)另一个字符串。算法结束。
  3. 否则,如果两个字符串的首位字符相等,则继续取出两个字符串各自的后一位字符进行比较。
  4. 重复上述步骤进行比较,直到比较完成某字符串的所有字符为止。
  5. 如果两个字符串的字符同时用完,那么则判定它们相等,否则未结束(还有未比较的字符)的字符串更大。

在上面的第一个例子中,'Z' > 'A' 比较在算法的第 1 步就得到了结果。

在第二个例子中,字符串 Glow 与 Glee 的比较则需要更多步骤,因为需要逐个字符进行比较:

  1. G 和 G 相等。
  2. l 和 l 相等。
  3. o 比 e 大,算法停止,第一个字符串大于第二个。

非真正的字典顺序,而是 Unicode 编码顺序

在上面的算法中,比较大小的逻辑与字典或电话簿中的排序很像,但也不完全相同。

比如说,字符串比较对字母大小写是敏感的。大写的 "A" 并不等于小写的 "a"。哪一个更大呢?实际上小写的 "a" 更大。这是因为在 JavaScript 使用的内部编码表中(Unicode),小写字母的字符索引值更大。我们会在 字符串 这章讨论更多关于字符串的细节。

不同类型间的比较

当对不同类型的值进行比较时,JavaScript 会首先将其转化为数字(number)再判定大小。

例如:

alert( '2' > 1 ); // true,字符串 '2' 会被转化为数字 2
alert( '01' == 1 ); // true,字符串 '01' 会被转化为数字 1

对于布尔类型值,true 会被转化为 1、false 转化为 0。

例如:

alert( true == 1 ); // true
alert( false == 0 ); // true

一个有趣的现象

有时候,以下两种情况会同时发生:

  • 若直接比较两个值,其结果是相等的。
  • 若把两个值转为布尔值,它们可能得出完全相反的结果,即一个是 true,一个是 false。

例如:

let a = 0;
alert( Boolean(a) ); // false

let b = "0";
alert( Boolean(b) ); // true

alert(a == b); // true!

对于 JavaScript 而言,这种现象其实挺正常的。因为 JavaScript 会把待比较的值转化为数字后再做比较(因此 "0" 变成了 0)。若只是将一个变量转化为 Boolean 值,则会使用其他的类型转换规则。

严格相等

普通的相等性检查 == 存在一个问题,它不能区分出 0 和 false:

alert( 0 == false ); // true

也同样无法区分空字符串和 false:

alert( '' == false ); // true

这是因为在比较不同类型的值时,处于相等判断符号 == 两侧的值会先被转化为数字。空字符串和 false 也是如此,转化后它们都为数字 0。

如果我们需要区分 0 和 false,该怎么办?

严格相等运算符 === 在进行比较时不会做任何的类型转换。

换句话说,如果 a 和 b 属于不同的数据类型,那么 a === b 不会做任何的类型转换而立刻返回 false。

让我们试试:

alert( 0 === false ); // false,因为被比较值的数据类型不同

同样的,与“不相等”符号 != 类似,“严格不相等”表示为 !==。

严格相等的运算符虽然写起来稍微长一些,但是它能够很清楚地显示代码意图,降低你犯错的可能性。

对 null 和 undefined 进行比较

当使用 null 或 undefined 与其他值进行比较时,其返回结果常常出乎你的意料。

当使用严格相等 === 比较二者时

它们不相等,因为它们属于不同的类型。

alert( null === undefined ); // false

当使用非严格相等 == 比较二者时

JavaScript 存在一个特殊的规则,会判定它们相等。它们俩就像“一对恋人”,仅仅等于对方而不等于其他任何的值(只在非严格相等下成立)。

alert( null == undefined ); // true

当使用数学式或其他比较方法 < > <= >= 时:

null/undefined 会被转化为数字:null 被转化为 0,undefined 被转化为 NaN。

下面让我们看看,这些规则会带来什么有趣的现象。同时更重要的是,我们需要从中学会如何远离这些特性带来的“陷阱”。

奇怪的结果:null vs 0

通过比较 null 和 0 可得:

alert( null > 0 );  // (1) false
alert( null == 0 ); // (2) false
alert( null >= 0 ); // (3) true

是的,上面的结果完全打破了你对数学的认识。在最后一行代码显示“null 大于等于 0”的情况下,前两行代码中一定会有一个是正确的,然而事实表明它们的结果都是 false。

为什么会出现这种反常结果,这是因为相等性检查 == 和普通比较符 > < >= <= 的代码逻辑是相互独立的。进行值的比较时,null 会被转化为数字,因此它被转化为了 0。这就是为什么(3)中 null >= 0 返回值是 true,(1)中 null > 0 返回值是 false。

另一方面,undefined 和 null 在相等性检查 == 中不会进行任何的类型转换,它们有自己独立的比较规则,所以除了它们之间互等外,不会等于任何其他的值。这就解释了为什么(2)中 null == 0 会返回 false。

特立独行的 undefined

undefined 不应该被与其他值进行比较:

alert( undefined > 0 ); // false (1)
alert( undefined < 0 ); // false (2)
alert( undefined == 0 ); // false (3)

为何它看起来如此厌恶 0?返回值都是 false!

原因如下:

  • (1) 和 (2) 都返回 false 是因为 undefined 在比较中被转换为了 NaN,而 NaN 是一个特殊的数值型值,它与任何值进行比较都会返回 false。
  • (3) 返回 false 是因为这是一个相等性检查,而 undefined 只与 null 相等,不会与其他值相等。

避免问题

我们为何要研究上述示例?我们需要时刻记得这些古怪的规则吗?不,其实不需要。虽然随着代码写得越来越多,我们对这些规则也都会烂熟于胸,但是我们需要更为可靠的方法来避免潜在的问题:

  • 除了严格相等 === 外,其他但凡是有 undefined/null 参与的比较,我们都需要格外小心。
  • 除非你非常清楚自己在做什么,否则永远不要使用 >= > < <= 去比较一个可能为 null/undefined 的变量。对于取值可能是 null/undefined 的变量,请按需要分别检查它的取值情况。

总结

  • 比较运算符始终返回布尔值。
  • 字符串的比较,会按照“词典”顺序逐字符地比较大小。
  • 当对不同类型的值进行比较时,它们会先被转化为数字(不包括严格相等检查)再进行比较。
  • 在非严格相等 == 下,null 和 undefined 相等且各自不等于任何其他的值。
  • 在使用 > 或 < 进行比较时,需要注意变量可能为 null/undefined 的情况。比较好的方法是单独检查变量是否等于 null/undefined。

任务

值的比较

重要程度: 5

以下表达式的执行结果是?

5 > 4
"apple" > "pineapple"
"2" > "12"
undefined == null
undefined === null
null == "\n0\n"
null === +"\n0\n"

解决方案

5 > 4 → true
"apple" > "pineapple" → false
"2" > "12" → true
undefined == null → true
undefined === null → false
null == "\n0\n" → false
null === +"\n0\n" → false

结果的原因:

  1. 数字间比较大小,显然得 true。
  2. 按词典顺序比较,得 false。"a" 比 "p" 小。
  3. 与第 2 题同理,首位字符 "2" 大于 "1"。
  4. null 只与 undefined 互等。
  5. 严格相等模式下,类型不同得 false。
  6. 与第 4 题同理,null 只与 undefined 相等。
  7. 不同类型严格不相等。

冠肺炎疫情还在持续。

而近期,国内各个省市预计又将面临大规模返工潮。不少人要从老家回到工作的城市,开启合租生活。

不少人担心:最近山东、湖南等地都爆发聚集性疫情,合租房的个人防护要怎么做?在公共区域如何避免交叉感染?

今天,丁香医生贴心地为大家准备了合租房个人防护指南。文章在手,安全我有!

1. 与房东(业主)确认返回时间、提前了解室友情况

拿小本本记好:这件事情很重要!

两件事:

第一:和房东(业主)联系,主动报备身体健康情况,与房东(业主)沟通确定返回时间。疫情当前,不少社区会下发应对疫情通知。根据通知内容,决定返程时间。

可别到了小区进不了门,就尴尬了。

第二:确认合租室友的情况。

  • 身体状况:确认室友是否有发热、鼻塞等症状。如果有,不推荐返回居住地。

  • 接触史:确认室友是否曾经有过疑似接触史,是否处于隔离期。如果有,不推荐返回居住地。

在信息交流的过程中,保持礼貌、友好的态度。若室友来自湖北省等疫情高发区,不要抱有歧视的态度。

「我们防的是病毒,不是湖北人。」

2. 与室友见面戴口罩

在公共区域戴口罩。

提前与室友沟通,在厨房、阳台、客厅等公共区域,双方可戴口罩,以最低程度降低感染风险。

减少与室友的接触,如果有事情需要当面讲,可以与对方保持 1 米的距离。

3. 外出回来后做好个人清洁

将外穿的鞋子放在门外,清理使用过的口罩,然后洗手,最后消毒随身小物件。

如果口罩变潮湿或者被分泌物玷污,必须立即换掉,将废弃的口罩丢入垃圾桶;

如果口罩完好无损且没有去过人流密集区,可以挂晾在干净、通风的地方,或存放在清洁透气的纸袋里即可(纸袋方便打孔透气)。

图片来源:首都医科大学附属北京胸科医院 李亮、杜建医生

千万要记得洗手哦!

图片来源:世界卫生组织

如果要清洗身上的衣服,使用洗衣液或洗衣粉就好,不用做特别的消毒处理。

至于手机、钥匙等小物件,可以先用湿纸巾、消毒湿巾或者酒精棉片擦拭消毒就好。

疫情期间,可以选择一件常穿的外衣出门,回家直接脱掉挂起来,减少污染。

4. 记得要常通风

一天通风两次,每次 30 分钟。

半个月没人住的房间,当然要开开窗透透气。通风可以增加空气流动,达到空气稀释和空气交换的作用,更新空气,提高舒适度。

有些合租房在公共区域只有狭长的走廊,这时候可以提前和室友沟通,约定好时间打开大门和窗户,让新鲜空气进入房间。

5. 使用公共洗衣机,不会感染病毒

很多人担心,使用合租房里的公共洗衣机洗衣服会感染病毒吗?

没必要惊慌。清洗和晾晒(干燥)后,病毒会很难存活。

有条件的,可以把洗衣机的水温设定为 60~90 摄氏度,然后自然晾干或者高温烘干。

图片来源:站酷海洛

没条件的也别担心,从洗衣机捞出衣服后,把衣服、被子放在阳光中晒晒,阳光虽然不能杀死病毒,但会让病毒存活的时间更短、更脆弱。

此外,衣物干燥后,病毒也难以存活。

当然,使用公共洗衣机结束后,记得洗洗手。

6. 和室友的私人物品尽量分开放、别误用他人牙刷、毛巾

如果可以,把私人卫生物品放在自己房间或固定位置,随用随取。如果只能放在公共区,尽量隔远点,使用时注意别拿错。

误用他人的卫生用品,可能造成不必要的交叉感染。

牙刷上有许多口腔里附着的细菌,毛巾也可能含有黄色葡萄球菌、白色念球菌、大肠杆菌等细菌,误用室友的牙刷、毛巾可能感染疾病,产生不必要的风险。

另外,再教大家一招正确放置牙刷和毛巾的办法:

  • 牙刷:刷牙后,用清水把牙刷上残留的牙膏、食物碎屑冲干净,甩干,刷牙头朝上放置在干燥、通风的环境中;

  • 毛巾:搓洗干净,展开晾着。每三个月更换一条毛巾。

同时,可以在洗漱台上换上洗手液,勤洗手。

7. 勤洗手是关键,公用区域和物品,必要时可消毒

一般情况,房间不需要常规消毒,只要回家立即洗手,就不必担心把病毒带回家。

如果合租房人多且杂,自己实在不放心,可以进行一些简单的消毒。

一般来说有几个地方需要重点消毒:大门(主门)内侧门把手以及门边、手机和钥匙、其他门把手、门面、开关按钮、电脑键盘、鼠标、地面、厨房台面、洗手间、家具。

  • 大门(主门)内侧门把手以及门边:用消毒湿巾或酒精棉片擦拭去污,按由内到外的顺序进行擦拭消毒。

  • 手机、钥匙、开关按钮、其他门把手门面、电脑键、鼠标:用消毒湿巾或酒精棉片擦拭消毒,注意起火风险。

  • 地面、厨房台面:喷洒并擦拭次氯酸钠消毒剂;关门关窗 30 分钟;再自然通风。

  • 洗手间(马桶盖、马桶圈、冲水按钮、洗手台以及水龙头):用消毒湿巾或酒精棉片擦拭消毒或使用次氯酸钠消毒剂。

  • 家具(书桌面、化妆台、床头柜):喷洒并擦拭次氯酸钠消毒剂;关门关窗 30 分钟;自然通风。

在配置次氯酸钠消毒剂时可以参考以下步骤:

  • 在通风的环境下使用;

  • 使用前佩戴医用手套 / 厨房手套以及防护面屏 / 防喷溅护目镜;

  • 有效氯含量为 500mg/L 消毒效果最好,具体配置可参考商家说明;

  • 装入喷雾瓶中;

  • 使用完毕后应将喷雾瓶洗净;

  • 不可与其他清洁剂同时使用;

  • 使用期间人要离开。

一些房东(业主)也可提供上门清洁服务,如果有条件,可以直接联系,让专业人士对房屋进行消毒处理。

8. 使用公共卫生间尽量不要带手机

手被污染后再摸手机,虽然洗了手,但手机也「脏」了。

即便不传播新冠病毒,别的病毒和细菌也可以传播,养成好的卫生习惯很重要。

如果合租房人比较多,可以考虑公共卫生间厕所使用前后都尽量消毒。

使用公共坐便的时候,冲粪便时盖上盖子,定期消毒清洗马桶。擦完屁屁的纸可以直接扔进马桶里用水冲走,不需要丢在垃圾桶里。

图片来源:站酷海洛

记住不要随地吐痰,更不要用脚去踩碾地面上的痰。

9. 食物煮熟后再吃

这年才过完,很多商店还没开始营业。这段时间,需要自己动手,丰衣足食。

在疫情期间,关于吃要注意三点:不要接触野生动物;不要现杀活禽;在正规地点购买的肉类和蛋类,煮熟之后,可以放心吃。

10. 尽量少去人多的地方

回去之后,免不了与朋友或恋人的见面、约会,毕竟很多人已经大半个月没见到对象了。

见面的时候,尽量避免去人员密集的的地方。如果要出门,记得戴口罩。

最后最后,如果自己出现了疑似症状:

  • 佩戴好口罩及时去往指定发热门诊筛查和治疗。

  • 及时告知社区与相关人员,保持信息双向流通。

在合租房里,室友之间的交流与沟通很重要。尤其是疫情当前,信息要及时同步。

疫情当下,每个人都一起加油,等待春暖花开的那一天。

本文经由 第三军医大学呼吸学硕士 蒋永源、上海市公共卫生临床中心医师 林逸骁审核

— 参考文献 —

[1]世界卫生组织对公众的建议 https://www.who.int/zh/emergencies/diseases/novel-coronavirus-2019/advice-for-public

[2]在线等!室友要从疫区回来了,慌的一批,我该怎么办https://mp.weixin.qq.com/s/tUuvw_z96jxnnnda_7EsPg

[3]家里最脏的地方竟然不是卫生间,而是这里……https://dxy.com/column/9656

[4]WHO, Infection prevention andcontrol during health care when novel coronavirus (nCoV) infection issuspected, 2020-01-25

[5]Version:0.9StartHTML:0000000105EndHTML:0000000512StartFragment:0000000141EndFragment:0000000472 卫生保健中易发生流行及大流行的急性呼吸道疾病感染预防与控制 世卫组织临时指南

策划 Ant、奥利宝

责编feidi

封面图来源站酷海洛

外媒8月20日报道,一名名来自英国达勒姆郡达尔顿-勒代尔的21岁男子,在梦游时非礼了好朋友的女友,但是因为他当时处于睡眠状态,目前陪审团已经达成一致,裁定其无罪。

凯利(右)离开法庭

事情发生在2017年4月17日,英国男子戴尔·凯利和他的好友以及这位哥们儿的女朋友去了夜店,之后乘坐出租车回到了朋友的家中。

疲惫的他们回到家中,就立即上床睡觉了。凯利在睡梦中走进了这对情侣的卧室,并躺在了他们的床上,还亲密地触摸了哥们儿的女朋友。

大约一个小时后,女方醒来,发现凯利躺在他们的床上。她认为凯利非礼了她,并报了警。凯利说,他当时正在做梦,以为自己在和一个女人约会。

事发后,凯利离开了他们的家,过了一会儿,他给朋友发了一条信息,上面写着:“我发誓,现在我真的不知道究竟发生了什么,那些都发生在睡梦中,我也想醒来。”

约克郡刑事法庭

被捕后,凯利接受了相关测试。经过测试,他的确存在睡眠障碍,包括梦游。

原来凯利从小就患有异睡症。专家表示,他很可能在侵犯女方时正处于梦游的状态,尽管他们也不能百分百确定当时是否就是这样。

凯利的辩护律师埃莉诺·弗莱表示,他的当事人无法说出那天早上究竟发生了什么,因为他当时正在睡觉。

尽管艰难的商议,但陪审团最后还是裁定,凯利存在相关睡眠障碍疾病,需要进行治疗,由于他当时处于睡着的状态,罪名不应该成立。

尽管陪审团已经作出了结论,但本案的主审法官西蒙·希奇称这是一个“不寻常”的案件,他表示最终的判决还要看一下医院和检查的结果。

经过两个多小时的庭审,约克郡刑事法庭决定对最终的判决进行推迟,将再请专家进一步弄清此案中存在的一些“疑惑”。

医生认为,凯利的“精神障碍”可以得到治疗。

目前凯利已获准保释,此案件将于9月23日再次开庭,届时法官将有最终的判决。

(登登)

硬汉男星被曝出轨后又拒降8750万片酬?来“中国网”(CIIC_China)官方微信,搜更多猛料