你不知道的javascript之运算符

2023-11-01

学过c,php这些语言的同学在学习javascript时候可能会有一些困扰,因为javascript中的||、&&和c或者是php中有很大的差别。因为在javascript中返回的类型并不是布尔值,他返回的而是两个操作值中之一,例如一下例子:

var a = 12;
var b = "qwer";
var c = null;

a||b;  //12;
a&&b;  //qwer
c||b;  //qwer
c&&b;  null

看了上面的例子相信大家都应该明白了把。||和&&首先对第一个操作数进行判断,如果其不是布尔值,先会进行强制类型转换,然后在执行条件判断。可以总结为两点:

  • 对于||来说,如果第一个数为真,那么返回第一个数,反之则为第二个数。
  • 而对于&&来说,如果第一个数为真,那么返回第二个数,反之则为第一个数。

上述中,c&&b,c为null,为假值,所以返回为第一个数,为null。

换一个角度来说就是这样:

a||b    相当于      a?a:b
a&&b    相当于      a?b:a

下面是一个常用的例子,相信大家都用过

function come(a,b){
    a = a|| "hello";
    b = b|| "world";
}
come(); //"hellow world"
come("happy","newyear");//"happy newyear"

a = a||”hello”检查变量a是否赋值,如果还未赋值,就给定一个默认值“hello”。

还有一种模式,在开发过程中不常见,但是在压缩工具中常见。

function come (){
    console.log(a);
}
var a = 12;
a&&come();//12

而在日常开发中比较常用的确是

if(a){
    come();
}

但是相比,a&&come()更加简洁。

可能你会问为什么在javascript中返回的是值而不是布尔值,那为什么还有a&&(b||c)这样的式子成立呢,因为在javascript中在这些判断式中会执行隐式强制转化。例如

var a = 12;
var b = null;
var c = "hello";
if(a&&(b||c)){
    console.log('yeah');
}

这里a&&(b||c)的结果实际上是“hello”,然后由if将”hello”强转化为布尔值,所以最后结果为true。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

你不知道的javascript之运算符 的相关文章

随机推荐

  • python matplotlib.pyplot画图设置刻度

    https jingyan baidu com article 7e44095324e4062fc1e2ef76 html
  • Scheme 介绍

    最近一直在看 sicp 这本书 准备写点读书笔记 这篇当作是对 Scheme 语言的介绍 毕竟全书是用这门语言写的 下面是我对书中使用的 mit scheme 的一些理解 我没有正统学习过函数式或类 Lisp 语言 只有一些我自己在做这本书
  • Vision Transformer综述 总篇

    Vision Transformer综述 1 Transformer简介 2 Transformer组成 2 1 Self Attention Multi Head Attention 多头注意力 2 2 Transformer的其他关键概
  • Python时间序列统计模型自回归预测网络流量

    预测过程包括预测时间序列的未来值 或者通过仅基于其过去行为 自回归 对序列进行建模 或者通过使用其他外部变量来进行建模 本文档描述了如何使用机器学习和统计模型来预测访问网站的流量 使用自 2020 年 7 月 1 日起 查看网站的每日访问历
  • 五子棋AI算法简易实现(一)

    基础篇 1 胜负判定 五子棋的胜负判定的条件是其中一方下棋以后 横线 竖线 右上斜线或者右下斜线任一方向出现五子相连 即可判定获胜 此处用递归方法即可实现 var is win false var ModuleWinnerCheck che
  • 单链表的插入操作(全)

    1 在指定位序插入数据第一步 主要执行操作 查找 先查找所要插入位置的前一个元素 具体方法 根据链表的特点 每一个节点都需要一个数据域和指针域 所以只需从头节点遍历到所要插入数据的的前一个节点即可 后面的showList函数也用的这种方法第
  • SqlServer2019—解决SQL Server 无法连接127.0.0.1的问题

    1 打开SQL Server 2019配置管理器 2 SQL Servere 网络配置 启用 Named Pipes 和 TCP IP 3 修改TCP IP协议 右键选择属性 IP地址 具体如下图所示 4 重启SQL Server服务
  • C语言输出菱形

    C语言输出菱形 菱形 include
  • 栈的顺序表示

    栈底是表头 栈顶是表尾 只能在表尾插入和删除 栈的第一个元素放在下标为0的位置 虽然top指向栈顶元素 但为了方便 指向栈顶元素之上 即下一个元素的位置 stacksize栈的大小 用来表示我们当前分配的数组 我们用数组来存储栈 能存储多少
  • 聊聊什么是架构,你理解对了吗?

    什么是架构 软件有架构 建筑也有架构 它们有什么相同点和不同点 下面咱们就介绍一下 容易混淆的几个概念 一 系统与子系统 系统 泛指由一群有关联的个体组成 根据某种规则运作 能完成个别元件不能单独完成的工作的群体 它的意思是 总体 整体 或
  • C++中的单例模式

    单例模式也称为单件模式 单子模式 可能是使用最广泛的设计模式 其意图是保证一个类仅有一个实例 并提供一个访问它的全局访问点 该实例被所有程序模块共享 有很多地方需要这样的功能模块 如系统的日志输出 GUI应用必须是单鼠标 MODEM的联接需
  • 转载 ---kafka集群消费之ConsumerRecord类

    java lang Object继承 org apache kafka clients consumer ConsumerRecord
  • 次表面散射

    技术博客 https github com Li ZhuoHang Subsurface scattering 基于屏幕空间模糊的次表面散射 SSSSS 效果展示 原模型 开启镜面表面反射 float PHBeckmann float nd
  • Qt中定义全局变量方法

    在使用qt编程时经常要使用到全局变量 全局变量该如何去定义和初始化呢 有两种方式 第一种使用extern 关键字 global h extern int a global cpp static int a 1 myfile cpp incl
  • ..\OBJ\Template.axf: Error: L6218E: Undefined symbol FSMC_NORSRAMCmd (referred from lcd.o).

    面对这个问题 假如环境配置和一般代码上不出错出现的问题的话 那就是缺了下面这两个文件 剩下的我就继续一步一步操作 进行 下去 步骤1 步骤2 用直接右击FWLIB 中第三个选项Add Existing Files 步骤3 在FWLIB中找s
  • Web服务器群集:使用Haproxy搭建Web集群

    目录 一 理论 1 Haproxy集群 2 常见的web集群调度器 3 三种web集群调度器的区别 4 下载安装 二 部署Haproxy集群 1 部署 2 重新定义Haproxy集群的日志 三 实验 1 部署Haproxy集群 四 问题 1
  • 新手linux安装vasp_史上最简单的VASP安装教程-非虚拟机

    本文是针对vasp初学者的安装教程编译器以及VASP都已编译号直接解压到系统中即可用 故不用配置其它的库文件以及环境 本教程适用于任意平台安装centos7的服务器以及pc机 若在其它linux发行版本中安装请咨询小编 一 VASP安装需要
  • SecureCRT 5.0菜单栏消失

    今天遇到一个怪问题 SecureCRT的菜单栏突然没了 郁闷了很长时间 回头想想好像是在最小化的时候选了个什么 顺着这个思路 终于发现最小化窗口 在任务栏上的最小化的程序上点右键 呵呵 看到了 Always On Top Save Sett
  • Keil IAR - Cortex M3 调试问题及解决方法(1)

    看到一篇文章 转载如下 其实不光是STM32 其它芯片甚至其它的IDE 都可参考 STM32调试过程中常见的问题及解决方法 一 在 Debug选项卡 下设置好仿真器的类型后 下载程序时却提示 No ULINK Device found 解决
  • 你不知道的javascript之运算符

    学过c php这些语言的同学在学习javascript时候可能会有一些困扰 因为javascript中的 和c或者是php中有很大的差别 因为在javascript中返回的类型并不是布尔值 他返回的而是两个操作值中之一 例如一下例子 var