首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js switch语句计算true/false的奇怪行为

JavaScript中的switch语句是一种条件语句,用于根据不同的条件执行不同的代码块。它的语法如下:

代码语言:txt
复制
switch (expression) {
  case value1:
    // 当expression等于value1时执行的代码
    break;
  case value2:
    // 当expression等于value2时执行的代码
    break;
  ...
  default:
    // 当expression不等于任何一个case时执行的代码
}

在switch语句中,expression是要进行比较的表达式,而value1、value2等则是可能的取值。当expression的值与某个case的值相等时,对应的代码块将会被执行。如果没有匹配的case,则会执行default代码块(可选)。

然而,在JavaScript中,switch语句的比较是使用的"宽松相等"(loose equality)规则,这导致了一些奇怪的行为。宽松相等会进行类型转换,尝试将两个不同类型的值转换为相同类型进行比较。

具体来说,当expression与某个case的值进行比较时,会按照以下规则进行类型转换:

  • 如果expression和case的值类型相同,则直接进行比较。
  • 如果expression是字符串,case的值会被转换为字符串进行比较。
  • 如果expression是数值,case的值会被转换为数值进行比较。
  • 如果expression是布尔值,case的值会被转换为布尔值进行比较。
  • 如果expression是对象,case的值会被转换为原始值(通过调用valueOf和toString方法)进行比较。

这种宽松相等的规则可能会导致一些意外的结果。例如,当expression为字符串"true"时,它与布尔值true进行比较时会被转换为数值1,与布尔值false进行比较时会被转换为数值0。因此,下面的代码会输出"true":

代码语言:txt
复制
var expression = "true";
switch (expression) {
  case true:
    console.log("true");
    break;
  case false:
    console.log("false");
    break;
  default:
    console.log("default");
}

对于这种奇怪的行为,我们可以通过使用严格相等(strict equality)来避免。严格相等使用"==="进行比较,不进行类型转换。因此,下面的代码会输出"default":

代码语言:txt
复制
var expression = "true";
switch (expression) {
  case true:
    console.log("true");
    break;
  case false:
    console.log("false");
    break;
  default:
    console.log("default");
}

总结一下,switch语句是一种根据不同条件执行不同代码块的语句。在JavaScript中,它使用宽松相等规则进行比较,可能导致一些奇怪的行为。为了避免这种情况,可以使用严格相等进行比较。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

奇怪Java题:为什么128 == 128返回为false,而127 == 127会返回为true?

奇怪Java题:为什么128 == 128返回为false,而127 == 127会返回为true? 在回答这个问题之前,我们先来看看int和Integer对比,一步步揭开问题答案。...Integer i = new Integer(100); Integer j = new Integer(100); System.out.print(i == j); //false 因为new生成是两个对象...,其内存地址不同 (2) Integer变量和int变量比较时,只要两个变量值是相等,则结果为true。...,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量比较 (3) 非new生成Integer变量和new Integer()生成变量比较时,结果为false。...static void main(String[] args) { //声明一个Integer对象 Integer num = 9; //进行计算时隐含有自动拆箱

2.2K31

JavaScript之选择控制语句(if,switch,while,do-while,for循环)及很重要表达式真与假

(true)与假(false) · 正 · 文 · 来 · 啦 · 在程序代码中,我们经常都会使用流程控制语句,它是用来控制程序中各语句执行顺序语句,利用语句组合便能完成一定功能小逻辑模块...与上面的 value 值都不匹配,执行此处语句 语句体4; break; } 注意事项: 在JSswitch语句与其他变成语言一个主要区别是:switch语句判断表达式可以是任意类型...语句头部圆括号中所有三个表达式都是可选 初始化值可以定义在圆括号里头,也可以定义在外头,但是个人强烈建议定义在里头,不要写让人猜代码,更不要写奇奇怪代码,让人看不懂,不是在炫技,而是在挖坑,...结语 本小节主要学习到js选择控制语句,if语句,switch语句,while语句以及do..while语句,for循环对比,每个语句都有与之对应应用场景以及解决问题 当然最后学习到了表达式中真...(true)与假(false),在我们平时做一些逻辑判断时候,对于一些边界值判断往往是非常重要

2.1K20

2023-07-19:布尔表达式 是计算结果不是 true 就是 false 表达式 有效表达式需遵循以下约定: ‘t‘,运

2023-07-19:布尔表达式 是计算结果不是 true 就是 false 表达式 有效表达式需遵循以下约定: 't',运算结果为 true 'f',运算结果为 false '!...4.函数f中首先获取当前索引处字符judge,判断其类型。 5.如果judge为't',返回结果为true,索引保持不变。 6.如果judge为'f',返回结果为false,索引保持不变。...9.如果judge为'&'或'|',则设置布尔变量ans为相应值(truefalse),并在循环中处理多个子表达式。...12.返回到parseBoolExpr函数,获取f函数结果Info,返回Info.ans作为布尔表达式最终计算结果。 13.输出最终结果。...根据给定表达式"&(|(f))",计算结果为false,打印结果false。 时间复杂度:假设表达式字符串长度为n,递归过程涉及到遍历字符串中每个字符,因此时间复杂度为O(n)。

28630

JavaScript强化教程——使用误区

if 条件语句返回 false (是我们预期)因为 x 不等于 10: var x = 0; if (x == 10) if 条件语句返回 true (不是我们预期)因为条件语句行为 x 赋值 10...,10 为 true: var x = 0; if (x = 10) if 条件语句返回 false (不是我们预期)因为条件语句行为 x 赋值 0,0 为 false: var x = 0; if...比较运算符常见错误 在常规比较中,数据类型是被忽略,以下 if 条件语句返回 true: var x = 10; var y = "10"; if (x == y) 在严格比较运算中,=== 为恒等计算符...,同时检查表达式值与类型,以下 if 条件语句返回 false: var x = 10; var y = "10"; if (x === y) 这种错误经常会在 switch 语句中出现,switch...语句会使用恒等计算符(===)进行比较: 以下实例会执行 alert弹窗: var x = 10; switch(x) { case 10: alert("Hello"); } 以下实例由于类型不一致不会执行

64260

JavaScript强化教程——使用误区

if 条件语句返回 false (是我们预期)因为 x 不等于 10: var x = 0; if (x == 10) if 条件语句返回 true (不是我们预期)因为条件语句行为 x 赋值 10...,10 为 true: var x = 0; if (x = 10) if 条件语句返回 false (不是我们预期)因为条件语句行为 x 赋值 0,0 为 false: var x = 0; if...比较运算符常见错误 在常规比较中,数据类型是被忽略,以下 if 条件语句返回 true: var x = 10; var y = "10"; if (x == y) 在严格比较运算中,=== 为恒等计算符...,同时检查表达式值与类型,以下 if 条件语句返回 false: var x = 10; var y = "10"; if (x === y) 这种错误经常会在 switch 语句中出现,switch...语句会使用恒等计算符(===)进行比较: 以下实例会执行 alert弹窗: var x = 10; switch(x) { case 10: alert("Hello"); } 以下实例由于类型不一致不会执行

46020

JavaScript -1- 基础教程与部分功能示例

js/myScript1.js"> 基本语法 条件语句 使用 if 来规定要执行代码块,如果指定条件为 true 使用 else 来规定要执行代码块,如果相同条件为 false...使用 else if 来规定要测试新条件,如果第一个条件为 false 使用 switch 来规定多个被执行备选代码块 if 语句 if (条件 1) { 条件 1 为 true 时执行代码块...} else if (条件 2) { 条件 1 为 false 而条件 2 为 true 时执行代码块 } else { 条件 1 和条件 2 同时为 false 时执行代码块...- 当指定条件为 true 时循环一段代码块 for 循环 for (语句 1; 语句 2; 语句 3) { 要执行代码块 } While 循环 while (条件) { 要执行代码块...如果函数被某条语句调用,JavaScript 将在调用语句之后“返回”执行代码。 函数通常会计算出返回值。

71120

JavaScript 第二天

逻辑非 取反 真变假, 假变真 truefalse falsetrue 逻辑运算符里短路: 只存在于**&&和||中**,当满足条件会让右边代码不执行 &&: 左边为false就短路...c || b && a console.log(d) 表达式和语句: 表达式是一组代码集合,js解释器会计算出一个结果 某些情况, 也可把表达式理解为语句, 因为它在计算结果, 也是做事 表达式是计算出一个值...,语句用来自行使某件事发生(做什么事) 表达式: 3 + 4 , 语句: alert() 弹出对话框 js语句是以分号结束 (可省略) , 如: if语句 for循环 分支语句: 程序三大流程控制语句:..., switch语句 图片 1. if语句: if语句有三种使用:单分支、双分支、多分支 括号内条件为true时,就进入大括号里执行代码 小括号内结果若不是布尔类型时,会发生隐式转换转为布尔类型...Switch 语句: switch case语句用于等值判断, 不适合用于区间判断 switch case需要配合break关键字使用, 没有break会造成case穿透 找到跟小括号里数据全等case

93930
领券