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. UICollectionView的注册

    UICollectionView的dataSource中的item的注册 itme的注册和tableview中cell的创建是不同的 cell的创建是在cell中 而itme的注册是在viewDidL ...

  2. Flask-上传文件和访问上传的文件

     1.1.上传文件和访问上传的文件 upload_file_demo.py from flask import Flask,request,render_template import os from ...

  3. docker初安装的血泪史

    最近docker很火,不管是朋友圈内还是公司内聊天都离不开docker,于是对docker产生了极大的好奇心,凭着一颗程序猿的好奇心开始了docker的安装血泪史. 首先我有一台从公司退役的本本x22 ...

  4. pyCrypto python 3.5--转

    原文地址:https://gxnotes.com/article/198426.html 问题描述 我发现一些PyCrypto安装程序为Python 3.3和3.4,但没有任何Python 3.5. ...

  5. Redis运维时需要注意的参数

    1: 内存 Memory used_memory:859192 数据结构的空间 used_memory_rss:7634944 实占空间 mem_fragmentation_ratio:8.89 前2 ...

  6. 关于优化for循环的注意的事项

    for循环注意事项: 1.for循环内部尽量少做数据库查询之类的IO代价大的操作 2.尽量控制for循环的次数,不多做无用功 3.能一次加载在内存中的,就不要通过循环来多次查询数据库,除非数据量过大. ...

  7. 03《UML大战需求分析》之三

    学习了活动图之后,我又学习了流程分析工具之二的状态机图.看上去状态机图和活动图很类似,我也很容易从活动图的角度来理解状态机图.但是学习之后,发现两种图是两种完全不同的分析角度.活动图在流程分析时是玩你 ...

  8. php5 中魔术方法函数有哪几个

    魔术函数:9.3 构造函数:__construct() 9.3.1 实例化对象时被调用. 9.3.2 在类中,构造函数是用来初始化对象的,利用构造函数,可以操作对象,并改变它的值. 9.3.3 当__ ...

  9. 2、使用Python3爬取美女图片-网站中的妹子自拍一栏

    代码还有待优化,不过目的已经达到了 1.先执行如下代码: #!/usr/bin/env python #-*- coding: utf-8 -*- import urllib import reque ...

  10. 集成spring boot + mysql + docker实战

    前言 网上找过很多文章,关于通过docker构建mysql容器并将应用容器和docker容器关联起来的文章不多.本文将给出具体的范例.此处为项目的源码 前置条件 该教程要求在宿主机上配置了: dock ...