JavaScript 之 特殊运算符
==, 两边值类型不同的时候,要先进行类型转换,再比较。
===,不做类型转换,类型不同的一定不等。
2、如果两个都是数值,并且是同一个值,那么[相等];(!例外)的是,如果其中至少一个是NaN,那么[不相等]。(判断一个值是否是NaN,只能用isNaN()来判断)
3、如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
4、如果两个值都是true,或者都是false,那么[相等]。
5、如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
6、如果两个值都是null,或者都是undefined,那么[相等]。
二、==
2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
b、如果一个是字符串,一个是数值,把 " 字符串转换成数值 "再进行比较。
c、如果任一值是 true,把它转换成" 1 "再比较;如果任一值是 false,把它转换成" 0 "再比较。
d、如果一个是对象,另一个是数值或字符串,把对象转换成" 基础类型的值再比较 "。对象转换成基础类型,利用它的toString或者valueOf方法。js核心内置类,会尝试valueOf先于toString;例外的是Date,Date利用的是toString转换。非js核心的对象,在此不做说明。
e、任何其他组合,都[不相等]。
"1" == true 类型不等,true会先转换成数值 1,现在变成 "1" == 1,再把"1"转换成 1,比较 1 == 1, 相等。
= 赋值运算符
== 等于
=== 严格等于
例: var a = 3; var b = "3";
a==b 返回 true
a===b 返回 false
因为a,b的类型不一样 ,===用来进行严格的比较判断
简而言之就是“==”只要求值相等。“===”要求值和类型都相等。
三、&& 运算符
从对其它语言的了解,表达的意思就是把多个逻辑条件连接起来确定真假,如果连接的条件有一个为假,则返回假。 其实JS里的&&运算符也是这个意思。在JS里,任何类型的值都可以转换成逻辑布尔值 如:
对象 → true
非空字符串 → true
非0数字 → true
true → true
"" → false
null → false
undefined → false
false → false
NaN → false
0 → false
例如:
var a1 = "aa";
var a2 = "bb";
var a3 = "cc";
var aa = a1 && a2 && a3; //3个条件连接起来判断真假,都为真 则返回最后一个值。
alert(aa); //返回a3
下面解析
(1)如果3个条件都为真, 则返回第三个值。
(2)如果3个条件都为假, 则返回第一个值, 由于短路算法, 从左到右发现第一个值为假,第二个值和第三个值都会被忽略。
(3)如果只是其中一个为假, 则返回假的那个值, 根据短路算法,后面的值被忽略.
上面的逻辑其实表达的意思如下:
if(!a1) a1没有意义 返回a1
alert(a1);
else if(!a2) a2也没有意义 返回a2
alert(a2);
else if(!a3) a3也没有意义 返回a3
alert(a3);
else
alert(a3); //都有意义 返回 最后一个a3
四、|| 运算符
理解了前面的&&运算符,它表达的意思是,如果要使表达式有意义,从左到右只要发现有一个有意义则整个表达式都有意义,并返回这个有意义的值,如果都是没意义的值,则返回最后那个值。
var a1 = null;
var a2 = NaN;
var a3 = undefined;
var aa = a1 || a2 || a3;
alert(aa); //返回" undefined "
下面解析
(1)如果其中3个条件都是真,则返回第一个为真的值, 根据短路算法, 第二个值和第三个值都会被忽略,因为第一个值已经决定了结果。
(2)如果只有其中一个为真, 则返回为真的那个值. 后面的条件都将忽略。
(3)如果都为假,返回最后一个假的值。
var aa = a1 && a2 && a3;
如果用if来表示如下:
if(a1)
alert(a1);
else
{
if(a2)
{
alert(a2);
}
else
alert(a3);
}
JS中经常用|| 运算符来做逻辑判断。 如:
var a = false;
var b = [1,2,3];
var aa = a || b //如果第一个值没有意义就返回第二个, 否则返回第一个
表达的意思如下:
if(a == null)
alert(b);
else
alert(a);
其等价于c#里的:
string a == null ? b : a
再区别一下如下的代码:
var a = undefined;
var b =[1,2,3];
var c = (a==undefined) && b //如果a没有初始化,则用b来代替
var d = a || b // 如果a等于false,则用b来代替
alert(c); //返回1,2,3
alert(d); //返回1,2,3
最后总结一下, && 和|| 运算符的区别:
(1)两者都是计算连接条件的真假, 最后来确定值, 都是从false开始测试的。
(2)对于 && 如果第一个值是false 则整个表达式都是false 并返回第一个值,后面的条件都将忽略。
(3)对于 || 如果第一个值是false 则它会继续看后面的条件是否为真,直到找到真值就立即返回,如果到最后也没找到真值,则返回最后一个值。
JavaScript 之 特殊运算符的更多相关文章
- (转)JavaScript中的运算符优先级
JavaScript中的运算符优先级是一套规则.该规则在计算表达式时控制运算符执行的顺序.具有较高优先级的运算符先于较低优先级的运算符执行.例如,乘法的执行先于加法. 下表按从最高到最低的优先级列出J ...
- JavaScript基础——使用运算符
JavaScript运算符允许你改变一个变量的值.你已经熟悉了用于赋值给变量的=运算符.JavaScript提供了几种不同的运算符,它们可以划分为两大类:算数运算符和赋值运算符. 1.算数运算符 你可 ...
- JavaScript中“typeof”运算符与“instanceof”运算符的差异
在JavaScript中,运算符“typeof”和“instanceof”都可以用来判断数据的类型,那么这两个运算符有什么不同之处呢? 差异一:使用方式不同. 最明显的差异就是这两个运算符的使用方式了 ...
- JavaScript中的运算符种类及其规则介绍
JavaScript中的运算符有很多,主要分为算术运算符,等同全同运算符,比较运算符,字符串运算符,逻辑运算符,赋值运算符等.这些运算符都有一些属于自己的运算规则,下面就为大家介绍一下JavaScri ...
- JavaScript 基本语法 -- 运算符的优先级
在所有的运算里,都是有运算顺序的.小时候学四则运算的时候,我们都知道这么一个规则:先乘除后加减,有括号要先算括号! 同样的,在JavaScript里面,运算符也是有相应的优先级的.其优先级如下表所示, ...
- JavaScript中逗号运算符
JavaScript中逗号运算符(,)是顺序执行两个表达式.使用方法: expression1, expression2 其中expression1是任何表达式. expression2是任何表达式. ...
- JavaScript学习系列7 -- JavaScript中的运算符
今天,我们来说一说JavaScript中的运算符,首先我们来讲一讲 一元运算符 JavaScript中的一元运算符有以下几种 1. delete delete 运算符主要用于删除对以前定义的对象属性或 ...
- 【废弃中】JavaScript 式与运算符
创建: 2017/09/25 更新: 2019/01/14 修改标题 [JavaScript 式与运算符] -> [JavaScript 式与主要Object的方法] 更新: 2019/02/ ...
- JavaScript按位运算符~
1. JavaScript按位运算符 Bit operators work on 32 bits numbers. 2. JavaScript按位运算符~ 值得注意的是,在JavaScript中,~5 ...
- JavaScript权威设计--JavaScript表达式与运算符,语句(简要学习笔记六)
1.delete是一元操作符,用来删除对象属性或者元素. var a={ x:1, y:2 } delete a.x; //删除x属性 “x”in a //false:a对象中已经不存在x属性 ale ...
随机推荐
- RTSP交互过程
步骤一: 发送:OPTIONS rtsp://127.0.0.1/172.30.31.225:8000:HIK-DS8000HC:0:1:admin:hs123456:av_stream RTSP/1 ...
- Ajax-验证码
function validateCode(){ var code=document.getElementById("code").value; var spanObj=docum ...
- 图解vim常用命令
VI 即 Visual Interface,可视化接口,VIM是VI的增强版 (improved),两张图总结vim常用命令. 图片来自 https://www.cnblogs.com/yangjig ...
- javascript小记-作用域
一.全局作用域 全局作用域的变量不论在什么时候都可以直接引用,而不必通过全局对象:满足以下条件的变量属于全局作用域:1.在最外层定义的变量2.全局对象的属性3.任何地方隐式定义的变量(未定义直接赋值的 ...
- [置顶] Spring的自动装配
采用构造函数注入,以及setter方法注入都需要写大量的XML配置文件,这时可以采用另一种方式,就是自动装,由Spring来给我们自动装配我们的Bean. Spring提供了四种自动装配类型 1:By ...
- ecshop功能目录
右上 开店向导 1设置商店的一些基本信息 商店的名字.地址.配送方式.支付方式等 2给商店添加一些商品 商品的名称.数量.分类.品牌.价格.描述等 3恭喜您,您的网店可以使用了!下面是一些常用功能的链 ...
- 预装Windows 8系统机型如何进行一键恢复
http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_20131119141246845.html
- matlab进行地图仪的绘制
% 绘制地球仪,并标出我们的位置 cla reset; load topo; [x,y,z] = sphere();%45是画出来的球面的经纬分面数 s = surface(x,y,z,'FaceCo ...
- Android Activity的四种LaunchMode!!!
本文转自: http://marshal.easymorse.com/archives/2950. 写的非常好,分享给大家!!! 在多Activity开发中,有可能是自己应用之间的Activity跳转 ...
- 解决eclipse安装maven的问题:Unable to update index for central|http://repo1.maven.org/maven2
问题产生如下:因为单位使用了过滤,访问Internet时,超过10M的内容就拒绝.因为maven插件在初始时,需要下载Maven的index文件,这个文件比较大,有38M多,下载不成功.所以造成使用M ...