草庐IT

JavaScript 逻辑运算符 || 和 &&

runoob 2023-03-28 原文

一、先来说说 ||(逻辑或), 从字面上来说,只有前后都是 false 的时候才返回 false,否则返回 true。

alert(true||false);       // true
alert(false||true);       // true
alert(true||true);        // true
alert(false||false);      // false

但是,从深层意义上来说的话,却有另一番天地,试下面代码

alert(0||1);

显然,我们知道,前面 0 意味着 false,而后面 1 意味着 true,那么上面的结果应该是 true,而事实返回的结果是 1。再看下面代码:

alert(2||1);

我们知道,前面 2 是 true,后面 1 也是 true,那返回结果又是什么呢?测试结果是 2,继续看:

alert('a'||1);

同样,前面 'a' 是 true,后面 1 也是 true;测试结果是 'a',下面

alert(''||1);

由上,我们知道前面 '' 是 false,后面 1 是 true,而返回结果是 1。再看下面

alert('a'||0);

前面 'a' 是 true,而后面 0 是 false,返回结果是 'a',继续下面

alert('a'||'b');

前面 'a' 是 true,后面 'b'是 false,返回结果是 'a',我们继续下面

alert(''||0);

前面 '' 是 false,后面 0 同样是 false,返回结果是0

alert(0||'');

前面0是false,后面''是false,返回结果是''

这就意味:

  • 1、只要 || 前面为 false,不管 || 后面是 true 还是 false,都返回 || 后面的值。
  • 2、只要 || 前面为 true,不管 || 后面是 true 还是 false,都返回 || 前面的值。

二、下面说说 &&(逻辑与), 从字面上来说,只有前后都是 true 的时候才返回 true,否则返回 false。

alert(true&&false);      // false
alert(true&&true);       // true
alert(false&&false);     // false
alert(false&&true);      // false

然后,根据上面经验,我们看看 && 号前后,不单单是布尔类型的情况。

alert(''&&1);

结是返回 '', && 前面 '' 是 false,后面是 1是 true。

alert(''&&0);

结是返回 '', && 前面 '' 是 false,后面是 0 也是 false。

alert('a'&&1);

结是返回 1, && 前面 'a' 是 true,后面是 1 也是 true。

alert('a'&&0);

结是返回 0, && 前面 'a' 是 true,后面是 0 是 false。

alert('a'&&'');

结是返回 '', && 前面 'a' 是 true,后面是 '' 是 false。

alert(0&&'a');

结是返回 0, && 前面 0 是 false,后面是 'a' 是true。

alert(0&&'');

结是返回 0, && 前面 0 是 false,后面是 '' 也是false。

这意味着

  • 1、只要 && 前面是 false,无论 && 后面是 true 还是 false,结果都将返 && 前面的值;
  • 2、只要 && 前面是 true,无论 && 后面是 true 还是 false,结果都将返 && 后面的值;

让我们总结一下:

  • 1、只要 || 前面为 false,无论 || 后面是true还是 false,结果都返回 || 后面的值。
  • 2、只要 || 前面为 true,无论 || 后面是true还是 false,结果都返回 || 前面的值。
  • 3、只要 && 前面是 false,无论 && 后面是true还是 false,结果都将返 && 前面的值;
  • 4、只要 && 前面是 true,无论 && 后面是true还是false,结果都将返 && 后面的值;

由上两个测试可知,逻辑运算符, || 和 && 都是遵行短路原则,只要确定符号前面的真假,既可确定返回值。

需要说明的是 && 的优先级是高于 || 的,下面测试:

alert(1||'a'&&2);

返回结果是1。

根据反证原理,我们假设 || 的优先级不低于 && (这里只所以用"不低于",是为了同时证明等级相同的情况)。

根据上面我们得出的结论(1),(1||'a')将返回前面的值1,(1&&2)根据结论(4)应该返回后面的值2。这显然不对,由此可知 && 的优先级是高于 || 的。

来源地址:http://www.cnblogs.com/pigtail/archive/2012/03/09/2387486.html

有关JavaScript 逻辑运算符 || 和 &&的更多相关文章

  1. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  2. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  3. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  4. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  5. ruby - 定义自定义 Ruby 运算符 - 2

    问题是:除了在“OperatorExpressions”?例如:1%!2 最佳答案 是的,可以创建自定义运算符,但有一些注意事项。Ruby本身并不直接支持它,但是superatorsgem做了一个巧妙的把戏,将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:$geminstallsuperators19然后:require'superators19'classArraysuperator"%~"do|operand|"#{self}percent-tilde#{operand}"endendputs[1]%~[2]#Out

  6. ruby - Ruby 中 <=> 运算符的名称是什么?他们怎么调用它? - 2

    在Ruby中有运算符(operator)。在API中,他们没有命名它的名字,只是:Theclassmustdefinetheoperator...Comparableusestoimplementtheconventionalcomparison......theobjectsinthecollectionmustalsoimplementameaningfuloperator...它叫什么名字? 最佳答案 参见上面的@Tony。然而,它也被称为(俚语)“宇宙飞船运算符(operator)”。

  7. ruby - 将运算符传递给函数? - 2

    也许这听起来很荒谬,但我想知道这对Ruby是否可行?基本上我有一个功能...defadda,bc=a+breturncend我希望能够将“+”或其他运算符(例如“-”)传递给函数,这样它就类似于...defsuma,b,operatorc=aoperatorbreturncend这可能吗? 最佳答案 两种可能性:以方法/算子名作为符号:defsuma,b,operatora.send(operator,b)endsum42,23,:+或者更通用的解决方案:采取一个block:defsuma,byielda,bendsum42,23,

  8. ruby - OR 运算符和 Ruby where 子句 - 2

    可能真的很简单,但我很难在网上找到关于这个的文档我在Ruby中有两个activerecord查询,我想通过OR运算符连接在一起@pro=Project.where(:manager_user_id=>current_user.id)@proa=Project.where(:account_manager=>current_user.id)我是ruby​​的新手,但我自己尝试使用||@pro=Project.where(:manager_user_id=>current_user.id||:account_manager=>current_user.id)这没有用,所以1.我想知道如何在

  9. ruby - Ruby 中字符串运算符 + 和 << 的区别 - 2

    我是Ruby和这个网站的新手。下面两个函数是不同的,一个在函数外修改变量,一个不修改。defm1(x)x我想确保我理解正确-当调用m1时,对str的引用被复制并传递给将其视为x的函数。运算符当调用m2时,对str的引用被复制并传递给将其视为x的函数。运算符+创建一个新字符串,赋值x=x+"4"只是将x重定向到新字符串,而原始str变量保持不变。对吧?谢谢 最佳答案 String#+::str+other_str→new_strConcatenation—ReturnsanewStringcontainingother_strconc

  10. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

随机推荐