JS的逻辑运算结果和其他一些强类型语言差别比较大,也比较容易让人产生困惑,看下面的例子:

    <script type="text/javascript">
var a = 40;
var b = "hello";
alert(!!a);//true
alert(!!b);//true
alert(a && b);//alert hello
</script>

我们定义两个变量a、b,对a、b进行两次取反获取它们转换成boolean类型的值均为true。然后將变量a和变量b做逻辑运算,发现结果竟然不是true,而是”hello”。

为了明确JS逻辑运算的最终结果是怎样的,我们需要先了解一下JS中哪些类型的值在做逻辑判断的时候会被认为是false。

  • 空字符串""
  • 数值类型(number)中的0和NaN
  • null类型
  • undefined类型
  • boolean类型中的false
    <script type="text/javascript">
//alert false
if(""|| 0 || null || undefined || NaN || false )
{
alert(true);
}else
{
alert(false);
}
</script>

执行上面代码对话框中弹出false,其他值在逻辑判断时均被认为是true。

接下来在来解释逻辑运算符||和&&的返回结果是怎么一回事:

事实上,JS以参与逻辑运算的最后一个值作为本次逻辑运算的最终结果,这句话理解起来可能有点困难,我们来看看下面的例子:

        var num1 = 40;
var str1 = "hello";
alert(num1 || str1);//40
alert(num1 && str1);//hello

大家都知道 || 运算符是”一真则真”,num1转换为boolean类型为true,已经有一个”true”了,所以 || 运算符后面的部分没有被执行,也就是说str1根本就没有参与该逻辑运算。JS会把num1的值作为本次逻辑运算的结果。

而逻辑运算符&&则是”一假则假”,num1转换为boolean类型为true,能够决定该逻辑运算结果转换为boolean类型真假的是str1。所以JS以str1作为该逻辑运算的结果。

有了这些依据下面的逻辑运算结果就很容易判断了:

        var num2 = 0;
var str2 = "wrold";
alert(num2 || str2);//hello
alert(num2 && str2);//0 var num3 = 40;
var str3 = "";
alert(num3 || str3);//40
alert(num3 && str3);//""

num2值为0,转换成boolean类型为false, num2 || str2逻辑运算的结果由str2决定。num2 && str2逻辑运算中num2 已经为假,str2未参与逻辑运算,所以以num2作为该逻辑运算的结果。下面的一个例子也是同样的道理。

你不知道的JavaScript(八)逻辑运算的更多相关文章

  1. 为JavaScript正名--读你不知道的JavaScript(持续更新..)

    你不知道的JavaScript上卷 JavaScript和Java的关系就像Carnival和Car的关系一样,八竿子打不着. JavaScript易上手,但由于其本身的特殊性,相比其他语言能真正掌握 ...

  2. 《你不知道的JavaScript》整理(二)——this

    最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函 ...

  3. 《你不知道的JavaScript》整理(一)——作用域、提升与闭包

    最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,里面分析了很多基础性的概念. 可以更全面深入的理解JavaScript深层面的知识点. 一.函数作用域 ...

  4. 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域

    你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...

  5. 你不知道的JavaScript上卷笔记

    你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章   初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...

  6. 从头开始学JavaScript (八)——变量

    原文:从头开始学JavaScript (八)--变量 一.变量分类: 基本类型值:null.undefined.number.string.Boolean: 引用类型值:保存在内存中的对象,如:Obj ...

  7. 【读书笔记】-- 你不知道的JavaScript

    <你不知道的JavaScript>是一个不错的JavaScript系列书,书名可能有些标题党的意思,但实符其名,很多地方会让你有耳目一新的感觉. 1.typeof null === &qu ...

  8. 读书笔记-你不知道的JavaScript(上)

    本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精 ...

  9. 读《你不知道的JavaScript(上卷)》后感-作用域闭包(二)

    github原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们, ...

  10. 你不知道的javaScript上卷(第一章 作用域是什么)

    在写这篇博客时这本书我已经是看过一遍了,为了加深印象和深入学习于是打算做这系列的前端经典书籍导读博文,大家如果觉得这本书讲的好可以自己买来看看,我是比较喜欢看纸质版书的,因为这样才有读书的那种感觉. ...

随机推荐

  1. php-fpm配置笔记

    php-fpm配置不当,导致服务器经常出现502错误,上个学期多次调整都没有解决,网上找来资料,大都是增加max_children,可是我都加到顶了,php-fpm log里面还是有大量的警告: ee ...

  2. centos7 usually use

    firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=192.168.22.103 port port=8 ...

  3. 使用 Travis-CI 的五个理由

    I use the service of travis-ci now for a year. In that time the continuous integration has often poi ...

  4. (转载)Android快速开发偷懒必备,一句话搞定所有ViewGroup的Adapter . 支持自定义ViewGroup

    [置顶] [Android]快速开发偷懒必备,一句话搞定所有ViewGroup的Adapter . 支持自定义ViewGroup 标签: androidAdapter快速开发0耦合 2016-12-1 ...

  5. Navicat for Mysql 关于1130错误,无法正常方法解决的解决办法。

    本人因为失误操作,不小心将mysql 玩崩了.导致一直报1130错误,无法进入. 看了很多网上的帖子,但是那些办法都行不通.最后通过好友的指点,解决了这个问题.   1.停止MySQL服务,执行net ...

  6. 使用BigDecimal完成小数点后的精确位数的四舍五入

    package com.ryan; import java.math.BigDecimal; class MyMath { public static double round(double num ...

  7. SSH 项目中 用Hibernate底层 简单的封装DAO层

    废话不多少了,主要是使用hibernate的查询方法,自己封装了DAO层,供service来方便使用. 首先:必须要继承的 public class CommonDao extends Hiberna ...

  8. UNP学习笔记4——I/O复用:select和poll函数

    1 概述 之间的学习中发现,传统的阻塞式系统调用不仅浪费进程运行时间,而且会带来狠毒问题.因此进程需要有一种预先告知内核的能力,使得内核一旦发现进程指定的一个或者多个I/O条件就绪,它就通知进程.这个 ...

  9. 如何在使用layer.prompt在输入值为空的情况下点击确定继续执行逻辑?

    突然发现在使用LayUI时,用到弹出层layer.prompt时,如果文本框输入值是空的话点击确定没有反应,不能向下执行. 但是我又需要在这种情况下去继续执行判断或逻辑时该怎么做?? 示例:原代码如下 ...

  10. 如何打开DOS控制台及常见DOS命令作用

    如何打开DOS控制台? * A:xp下如何打开DOS控制台?     * a:开始--程序--附件--命令提示符     * b:开始--运行--cmd--回车     * c:win+r--cmd- ...