判断

javascript中的三目运算符用作判断时,基本语法为: expression ? sentence1 : sentence2 
当expression的值为真时执行sentence1,否则执行 sentence2, 请看代码

   var b = 1,
c = 1
a = 2;
a >= 2 ? b++ : b--;
b // 2
a < 2 ? c++ : c--;
c // 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

从上面代码中,我们暂时会认为三目运算符相当于if + else(下面再详聊)

   if(expression){
sentence1;
} else {
sentence2;
}
  • 1
  • 2
  • 3
  • 4
  • 5

当expression为真,即expression不为undefined,NaN,0,null的时候执行sentence1,否则执行sentence2。 
既然这样的功能和if相同,为什么还要使用它?首先,在逻辑多次判断的时候,三目运算符逻辑更简洁:

   expression1 ? sentence1 :
expression2 ? sentence2 :
expression3 ? sentence3 :
...
  • 1
  • 2
  • 3
  • 4

只要任意一个expressionN的判断为真,那么sentenceN立即执行,这个判断结束,后面的任何判断不再执行。而如果我们写成if-else

   if(expression1){
sentence1;
} else if(expression2){
sentence2;
} else if(expression3){
sentence3;
} ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这样书写逻辑看起来比较心累,所以在jquery和zepto源码中,我们会大量看到三目运算符的应用。

赋值

另一个经典的应用场景在于赋值,var param = expression ? value1 : value2,这个相信大家经常用到

   var b,
c = 1;
var a = b ? 2 : 1;
a // 1
var a = c > 0 ? 2 : 1
a // 2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

再谈判断

有一天写了这样的代码

  function xx(){
var a = 1,
b = 3;
a < b ? return false : ''
}
  • 1
  • 2
  • 3
  • 4
  • 5

居然报错了! 为什么报错,我们会仔细看一下上面的多个判断

   expression1 ? sentence1 :
expression2 ? sentence2 :
expression3 ? sentence3 :
...
  • 1
  • 2
  • 3
  • 4

只要有一个expressionN成立,就马上跳出。原因是什么呢? 我们可以猜想是因为三目运算符return了sentenceN,所以判断立即跳出。赋值的用法也一样,之所以报错的原因是

   if(expression){
return (return 2);
}
  • 1
  • 2
  • 3

这样的写法肯定报错了。那么如果我们对上面的解释有疑问,我们可以用这样的代码来证明:

   var a = 1,
b = 2;
var c = b > 1 ? a++ : 0;
c // 1
  • 1
  • 2
  • 3
  • 4

c为什么是1,因为n++是在执行完表达式后再加1,如果return a++,先return 再加1,所以这里的c等于1

js中的三目运算符详解的更多相关文章

  1. JS中this关键字详解

    本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 阅读此文章,还需要心平气和的阅读完,相信一定会有所收获,我也会不定期的发布,分享一些文章,共同学习 首先,必须搞清楚在JS里面,函数 ...

  2. JS 中 this 关键字详解

    本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 首先,必须搞清楚在JS里面,函数的几种调用方式: 普通函数调用 作为方法来调用 作为构造函数来调用 使用apply/call方法来调 ...

  3. Bom和Dom编程以及js中prototype的详解

    一.Bom编程: 1.事件练习: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  4. JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解

      前  言 JRedu 学过程序语言的都知道,我们的程序语言进化是从"面向机器".到"面向过程".再到"面向对象"一步步的发展而来.类似于 ...

  5. JS中navigator对象详解

    <code class="language-html"><!doctype html> <html> <head> <meta ...

  6. js中Date()对象详解

    var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???? ...

  7. js中的逻辑运算符详解(||、&&、!)

    视频地址:https://www.bilibili.com/video/BV1Y7411K7zz?p=1 一直以来都没弄清楚js中的逻辑运算符是怎么回事 , 一直都以为他们的用法和java一样 , 今 ...

  8. Java中的三目运算符 详解

    对于有些选择分支结构,可以使用简单的条件运算符来代替. 如: if(a<b)    min=a;else    min=b; 可以用下面的条件运算符来处理 min=(a<b)?a:b; 其 ...

  9. js中window对象详解以及页面跳转

    1.window.top.window.location = "index.asp"; 2.window.top.location.href="index.asp&quo ...

随机推荐

  1. java+超大文件上传与下载

    ​这里先说下spring mvc 遇到的坑,就是如果文件上传时,后端这样写public String file1(HttpServletRequest request),根据request拿到的东西是 ...

  2. learning express step(一)

    first : create new project then install express package : npm install express --savenpm WARN saveErr ...

  3. 【概率论】4-1:随机变量的期望(The Expectation of a Random Variable Part I)

    title: [概率论]4-1:随机变量的期望(The Expectation of a Random Variable Part I) categories: - Mathematic - Prob ...

  4. c++ 实现等待5s

    #include <stdio.h> /* puts, printf */ #include <time.h> /* time_t, struct tm, time, loca ...

  5. 通过sqlserver用户操作远程服务器

    USE masterGORECONFIGURE --先执行一次刷新,处理上次的配置GOEXEC sp_configure 'show advanced options',1 --启用xp_cmdshe ...

  6. mongodb的安装及使用

    1.MongoDB安装 安装包下载地址: https://www.mongodb.com/download-center/community 启动数据库:进入到mongd所在的bin目录,执行mong ...

  7. java获取远程图片分辨率

    package com.haiyisoft.hyoaPc; import java.awt.image.BufferedImage;import java.io.IOException;import ...

  8. 前端中关于HTML标签的属性for的理解

    First:<label>的说明:1.<label>标签为input元素定义标注(标识)2.label元素不会像用户呈现任何特殊的效果,仅作为显示扩展:不过,它为鼠标用户改进了 ...

  9. PAT 甲级 1030 Travel Plan (30 分)(dijstra,较简单,但要注意是从0到n-1)

    1030 Travel Plan (30 分)   A traveler's map gives the distances between cities along the highways, to ...

  10. Django setting 常用配置

    setting.py           这个文件包含了所有有关这个Django项目的配置信息,均大写:   TEMPLATE_DIRS , DATABASE_NAME , 等. 最重要的设置是 RO ...