有这么一种常见的语句:

var a = a || 4;

那赋值语句中的“&&”操作符和"||"操作符是什么意思?如何知道这两个逻辑操作符两旁的数据哪个会被赋值到等号左边的变量里面?其实,会被赋值到等号左边的变量里面的一定是起决定性因素的那个变量。其实这就是if...else的变种,要么a=a,要么a=4。虽然没那么直接,不过也省了不少代码。

什么是起决定性因素的变量?

我们知道,两个bool型变量a和b进行与操作,只有a和b的值都为true时,返回结果才为true,只要有一个变量值为false,返回结果就为false。看下这个语句:

c = a && b

所以,把上面这个语句的Boolean()方法去掉,把a和b换成任意类型的变量,结果就很明显了。假设a为true,那么此时还无法决定c为true还是false,要看b的值才能决定,所以此时b是决定性因素;假设a为false,那么此时已经可以确定c为false,不用考虑b的值了,所以此时a是决定性因素。

或操作的原理和与操作类似,这里不再说明。

现在看下文章开头提到的那个语句,意思就是说如果a已经赋值(假设a是不为0的数),那么a的值不变,否则a=4。再往细了说,就是如果a已经赋值,那么Boolean(a)=true,或操作符右边的数就不看了,等式左边的a就等于右边的a;如果a没有复制,由于a已经声明,那么等式右边的a=undefined,Boolean(a)= false,这时看操作符右边,不管操作符右边的Bool值为什么,现在等式左边的a就等于这个数了。

需要注意的是, 如果一个变量为声明,打印这个变量时,系统会报错;如果声明了一个变量但没有复制,打印这个变量时,系统会打印出‘undefined’这个字符串。因此,在与/或操作中,如果起决定性因素的那个变量没有声明,那么系统是会报错的。

实际应用中,或操作符会更常用些。一般用于插件替换原始值(参见Swiper.js),或者是DOM操作,例如:

var length = length || $list.length

  

如果这个语句会执行多次,那么从第二次开始,每次执行这个语句时,就不会再去遍历这个数组的长度了,因为长度已经存在length变量里面了。


Javascript赋值语句中的“&&”操作符和"||"操作符的更多相关文章

  1. 【JavaScript】JavaScript赋值语句中的逻辑与&&和逻辑或||

    在其他语言中,我们往往看到逻辑符号出现在判断语句当中,如 if(a||b){} 但在一些js相关的面试题或者书中,我们有时会看到逻辑与&&和逻辑或||符号出现在赋值语句或者返回语句中, ...

  2. 第一百节,JavaScript表达式中的运算符

    JavaScript表达式中的运算符 学习要点: 1.什么是表达式 2.一元运算符 3.算术运算符 4.关系运算符 5.逻辑运算符 6.*位运算符 7.赋值运算符 8.其他运算符 9.运算符优先级 E ...

  3. JavaScript 语言中的 this

    JavaScript 语言中的 this 由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式.JavaSc ...

  4. javascript数组中数字和非数字下标的区别(转)

    http://blog.csdn.net/qq_27461663/article/details/52014911 考完试后闲来无事,想起好多天没写js了,于是打算实践一下最近看到的一些好玩的点子.结 ...

  5. javascript变量中基本类型和引用类型的详解解读

    前言: Javascript语言中的变量和其他语言的变量有很大区别,javascript松散类型的本质,决定了它只是在特定时间时间保存特定值得名字而已.由于不存在定义某个变量必须保存何种数据类型值的规 ...

  6. JS规则 我或你都可以 (逻辑或操作符)||逻辑或操作符,相当于生活中的“或者”,当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”

    我或你都可以 (逻辑或操作符) "||"逻辑或操作符,相当于生活中的"或者",当两个条件中有任一个条件满足,"逻辑或"的运算结果就为&quo ...

  7. JavaScript jQuery 中定义数组与操作及jquery数组操作

    首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...

  8. JavaScript文件中调用AngularJS内部方法或改变$scope变量

    需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过controll ...

  9. C++中复制构造函数与重载赋值操作符总结

    前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符 ...

随机推荐

  1. Mike and Feet(CF 547B)

    Mike and Feet time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  2. [置顶] Android开发之Thread类分析

    在我们Linux系统中创建线程函数为:pthread_create(),在Android中我们为线程封装了一个类Thread,实际调用的还是pthread_create() 当我们想创建线程的时候,只 ...

  3. ibatis提示Unable to load embedded resource from assembly "Entity.Ce_SQL.xml,Entity".

    原本以为是xml文件配置错误,尝试无果,最终原因未将xml文件的生成操作选择为嵌入的资源.很无语!

  4. MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页

    这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第三篇:排序.筛选 ...

  5. 长乐集训2012.7.11 happy(指针技巧的运用)

    题1  Noip的快乐 (happy.pas/c/cpp) [问题描述] 终于到了一年一度的Noip比赛了,多么令人期待和兴奋的一天!其实,人们最高兴的还不是遇见老朋友,而是结交新朋友.可是结交新的朋 ...

  6. c#中的对象

      字段,属性,方法     对象初始化过程 如果没有继承,顺序如下: 静态变量 静态构造函数 非静态变量 非静态构造函数   如果类有基类,那么基类和子类的初始化顺序如下: 继承类静态成员变量初始化 ...

  7. [转]影响Cache的几个HTTP头信息

    原文地址:http://hi.baidu.com/feilala_fly/item/f79eca08fbf389026c9048a7 Http的Cache机制总共有4个组成部分: Cache-Cont ...

  8. MongoDB学习(翻译6)

    接上篇.... 字段或属性层次的序列化选项 有许多种让你控制序列化的方式,上一节通过约定方法来控制序列化,你也可以通过代码配置或者成员映射或者使用特性来控制你的序列化,下面说道的序列化的各个方面,我们 ...

  9. EasyUI 1.3.6 DateBox添加清空按钮

    EasyUI 1.3.6 DateBox添加清空按钮 效果如图: EasyUI datebox是没有清空按钮的,可通过如下方法加入: 打开jquery.easyui.min.js看到这样如此乱的代码, ...

  10. (Sql Server)数据的拆分和合并

    (Sql Server)数据的拆分和合并 背景: 今天遇到了数据合并和拆分的问题,尝试了几种写法.但大致可分为两类:一.原始写法.二.Sql Server 2005之后支持的写法.第一种写法复杂而且效 ...