JS中的“&&”与“&”和“||”“|”有什么区别?

老实说,“&&”和“||”在JS中它们是逻辑运算符,但是“&”和“|”是按位运算符。
不要对这一点感到困惑。

展开:我们先来说说最重要的事情。
如果“||”不正确,无论后面如何,下一个值都将原样返回。
去年我们运行项目的时候,有一个地方是“||”它用于设置默认值。
结果,我们忘记检查之前的值是 true 还是 false,这几乎导致系统崩溃。
另一方面,如果“&&”为假,则无论后面发生什么,都将返回前一个值。
很多人都没有注意到这一点,在去年球队重建的时候就掉进了陷阱。
还有另一个重要的细节。
位运算符“|”意思是只要两位有一位为1 就是1 ,比如5 |3 二进制1 01 |01 1 是1 1 1 ,也就是7 老实说,这很令人困惑。
新手写了“&&”,整个表达式就崩溃了。

一开始我以为是“||”它总是返回最后一个值,但我后来发现这是错误的。
这取决于先前的值是 true 还是 false。
提醒一下,位运算和逻辑运算的返回值类型可能不同。
例如,“||”前面是一个对象,后面是一个数字将返回一个对象,所以要小心这一点。

建议多写测试用例来验证这个逻辑,不要仅仅依靠想象。

JavaScript不同类型运算

说实话,当我学习 JavaScript 运算符时,我对它们感到困惑,但后来我逐渐开始使用它们,发现它们很有趣。
以算术运算符为例,例如加法(+),它非常灵活。
我的一个同学在写代码的时候,居然用+来连接字符串,比如z = "hello" + "world",结果z就是"helloworld"。
但是如果你用var z = 1 0 + "5 ",嘿嘿,这时候z就变成了"1 05 ",因为JS自动把数字转成了字符串。
这让我想知道应该优先考虑数字还是字符串。
后来查了资料发现其实是由操作符两边的类型决定的。
如果数字在前,则进行加法;如果字符串在先,则进行拼接。

在比较运算符方面,我遇到了很多陷阱。
例如,==和===的区别绝对是初学者常犯的错误。
我记得有一次我写了一份登录确认信。
我本来想查一下用户输入的密码是否是“1 2 3 4 5 6 ”,但是我用了==。
结果用户输入“1 2 3 4 5 6 ”或者1 2 3 4 5 6 (不带引号),就可以绕过验证,因为JS会自动帮你转换类型。
这真的很糟糕,然后我用 === 解决了这个问题。
还有1 0 ===“1 0”的例子。
结果显然是false,因为一个是数值类型,一个是字符串类型。
严格比较当然不等同。

我最常用的逻辑运算符是 && 和 ||。
例如,在编写权限语句时,必须同时满足多个条件才能访问特定页面。
在这种情况下,请使用 &&,例如 (user.isAdmin && user.isLoggedin)。
只要其中一个为假,则全部为假,程序将无法继续运行。
我经常用||对于默认值设置,例如 var timeout = config.timeout || 3 000。
如果config.timeout未定义或为null,则超时为3 000。
这种用法特别方便。

说到按位运算符,说实话,我用的不多,但是学了之后觉得还是蛮酷的。
比如5 和1 的结果是1 ,涉及到二进制,5 是1 01 ,1 是001 ,按位与是001 ,就是1 在我的一个老项目中,为了性能优化,使用了按位运算。
理解后觉得很牛逼,但实际工作中很少遇到这么极端的情况。
还有左移<<和右移>>。
比如5 << 2>
总的来说,这些运算符如果用得好,可以省去很多麻烦,但如果用得不好,就很容易出现错误。
尤其是比较和类型转换,你必须小心。
我被==和===困扰了很长一段时间,直到真正理解了类型强制转换的机制之后我才放下心来。
其实,如果你多写,多练习,这些细节就会慢慢地刻在你的脑海里。

javascript运算符可分为哪些

八维教育计算机培训JavaScript:变量、数据类型、运算符和循环

说实话,当我学习 JavaScript 时,变量确实让我很困扰。
以 var 和 let 为例。
我一开始就不明白为什么 ES6 要创建一个 pass。
当时我正在做一个小组项目,当我在var中编写它时,我不小心在函数中声明了一个同名的变量。
结果好几天整个逻辑都是错的。
后来,我尝试更改限额,块级作用域突然变得清晰起来——例如,如果您在实例中声明一个变量,则无法从外部访问它。
这比var的变量提升更让人困惑。
但坦率地说,这种混乱是进步的标志。
至少现在我不再害怕写代码时var值意外增加。

就数据类型而言,给我印象最深的是null类型。
当时,我正在调试第三方库中的一个问题。
控制台显示 typeof null 实际上是一个“对象”。
我当时就意识到,这显然是历史遗留问题。
气得我喝凉水都会噎住。
后来我意识到,我在设计时,认为null是一个“空对象”。
结果,这种看法持续了很多年。
但现在有了代码,我感觉 JS 类型系统终于有点意思了,尽管我从未在实际项目中使用过它。

运算符实际上并不那么困难,但比较运算符很容易遇到问题。
我有一个同事用==来比较数字和字符串,但是由于隐式类型转换结果是正确的,最终整个报表数据都是错误的。
说实话,我现在写代码已经习惯使用===了。
虽然一开始我觉得它太“僵化”,但现在我已经习惯了,我觉得它更安全了。
比如===会直接指定类型和值,不会有“5 ”等于5 之类的棘手操作。

我最常用的循环结构是for...of,它特别适合遍历数组。
上次我重构了一个旧系统,把它改成……全部改成……改成。
结果,代码读起来更加清晰。
当然,while和do...while有时也会用到,比如处理条件复杂的场景时。
但说实话,现在写前端的时候,用的比较多的是DOM操作。
比如使用for...of来遍历选中的元素,批量修改样式,其实效率更高。

最后说几个要点:对于作用域,我强烈推荐使用let/const,var很容易出问题;说到类型转换,==就是魔鬼,使用===可以避免多少错误;当break和continue在循环控制中正确使用时,代码的逻辑会更加清晰。
我更喜欢模板链。
当我编写登录提示之类的字符串时,使用后退标签并不是很有趣。
掌握了这些基础知识之后,后面学习异步函数和编程就会容易很多。
毕竟,它们都是构建块。
如果这些部件正确地组合在一起,您以后就可以建造高层建筑。