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. ROS-SLAM-gmapping

    前言:gmapping是最常用和成熟的slam导航算法,gmapping功能包集成了Rao-Blackwellized粒子滤波算法,为开发者隐去了复杂的内部实现. 前提:已下载并编译了相关功能包集,如 ...

  2. JavaScript 获取某个字符的 Unicode 码

    function getUnicode (charCode) { return charCode.charCodeAt(0).toString(16); } 获取的是 UTF-16 编码的值,不足4位 ...

  3. spring使用注解开发

    1.准备工作(1)导入common-annotations.jar(2)导入schema文件 文件名为spring-context-2.5.xsd(3)在xml的beans节点中配置 service层 ...

  4. 算法27-----第N个数字

    1.题目: 在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字. 注意: n 是正数且在32为整形范围内 ( n < 231). ...

  5. pythone 学习笔记(粗略)

    文档目录 概述 安装 基本语法 数据结构 4.1 数字和字符串类型 4.2 元祖 4.3 列表 4.4 字典 流程语句 5.1 分支结构 5.2 逻辑运算符(if) 5.3 循环 5.3.1 for ...

  6. 【HNOI】合唱队

    [HNOI]合唱队 题意 对于一个初始序列,保证两两不同,通过一些变换得到目标序列: 第一个值直接插入空的当前队列 对于从第二个值开始的每个值 如果原序列中 $ a[i] $,若 $ a[i]> ...

  7. html全屏显示

    JavaScript代码: function toggleFullScreen() { if (!document.fullscreenElement && // alternativ ...

  8. Redis字符串(STRING)中BIT相关命令

    上篇文章我们对STRING数据类型中一些基本的命令进行了介绍,但是没有涉及到BIT相关的命令,本文我们就来看看几个和BIT相关的命令. 本文是Redis系列的第四篇文章,了解前面的文章有助于更好的理解 ...

  9. qml与c++混合编程

    QML 与 C++ 混合编程内容:1. QML 扩展2. C++ 与 QML 交互3. 开发时要尽量避免使用的 QML 元素4. demo 讲解5. QML 语法C++ 与 QML 的交互是通过注册 ...

  10. 如何让Jboss的debug在myeclise上运行

    1.在windows下运行jboss的debug.bat 看见监听的端口 2.打开myeclipse 点击选择 ①你要配置的名字(随意) ②myeclipse中选中该项目 ③jboss的启动的ip地址 ...