详解JavaScript的表达式与运算符

JavaScript脚本语言描述了一组用于操作数据值的运算符,包括一元运算符,布尔运算符,算术运算符,关系运算符,三元运算符,位运算符和赋值运算符。
       表达式是JavaScript语言的一个“短语”,包含变量名(或字面量)和运算符。最简单的表达式时字面量或变量名。当然也有合并简单的表达式来创建复杂的表达式。
一、一元运算符
(1)递增++和递减--

var box1=100;
++box1;//相当于box=box+1
document.write("box1="+box1+"<br/>");//输出box1=101
var box2=100;
--box2;//相当于box=box2-1
document.write("box2="+box2);//输出box2=99 

前置和后置的区别

var box=100;
var age=++box;//box先累加1为101,再赋值给age为101
var height=box++;//box先赋值给height为101,box再累加为102
document.write("age="+age+"<br/>");//输出age=101
document.write("height="+height+"<br/>");//输出height=101
document.write("box="+box);//输出box=102,原因是box经过了两次累加,所以是102

在没有赋值操作,前置和后置是一样的。但在赋值操作时,如果递增或递减运算符前置,那么前置的运算符会先累加或累减再赋值,如果是后置运算符则先赋值再累加或累减。
(2)加和减运算符
用于取正或取负运算,也有把数字字符串转换为数值形式的功能。

var box = "20";
document.write(typeof box+"<br/>"); //输出string
var age=-box;
document.write(age+"<br/>");//输出-20
document.write(typeof age); //输出number 

二、算术运算符
       JavaScript语言中规定了五种算术运算符,即+,-,*,/和%(取余)。如果在算术运算符的值不是数值,那么它会先使用Number()转型函数将其转换为数值(隐式转换)。

var box=100+"100";
document.write("box="+box+"<br/>");//输出100100
document.write(typeof box);//输出string 

这是为什么呢?JavaScript语言中的做算术运算时,只要其中一个是字符串,那么结果就会转换为字符串。相当于字符串连接符,不能再算作是加法算术运算符。

var box="100"-10;
document.write("box="+box+"<br/>");//输出90
var age=5/4;
document.write("age="+age+"<br/>");//输出1.25
var height=("你的年龄是:"+(10+10));//括号强制优先级
document.write(height);//输出你的年龄是:20

取余

var box=10%3;
document.write("box="+box);//输出1

三、关系运算符
       用于进行比较的运算符称作为关系运算符:<(小于),>(大于),<=(小于等于),>=(大于等于),==(相对),!=(不等),===(恒等或全等),!==(不全等或不恒等)。关系运算符大多数返回的是一个布尔值。
       和其他运算符一样,当关系运算符操作非数值时要遵循以下规则:
       1两个操作符都是数值,则数值比较
       2两个操作数都是字符串,则比较两个字符串对应的字符编码值
       3两个操作数有一个是数值,则将另一个转换为数值,在进行数值比较
       4两个操作数有一个是对象,则先调用value()方法或toString()方法,再用结果比较。

var box1=3>2;
document.write(box1+"<br/>");//输出true
var box2="3">22;
document.write(box2+"<br/>");//输出false
var box3="3">"22";
document.write(box3+"<br/>");//输出true
var box4="a">"B";//a为97,B为66
document.write(box4+"<br/>");//输出true
var box5= "Blue"<"alpha";//Blue的第一个字母是B,alpha的第一个字母是a,a为97,B为66
document.write(box5) //输出true

在相等和不等的比较上,如果操作数是非数值,则遵循以下规则:
       1一个操作数是布尔值,则比较之前将其转换为数值,false转成0,true转成1。
       2一个操作数是字符串,则比较之前将其转成为数值再比较。
       3一个操作数是对象,则先调用value()方法或toString()方法再比较。
       4不需要任何转换的情况下,null和undefined是相等的
       5一个操作数是NaN,则==返回false,!=返回true,并且NaN和自身不等
       6两个操作数都是对象,则比较它们是否是同一个对象,如果都指向同一个对象,则返回true,否则返回false
       7在全等和全不等的判断上,比如值和类型都相等,才返回true,否则返回fasle。

var box1='2'==2;
document.write(box1+"<br/>");//输出true,比较的只是数值
var box2={}=={};
document.write(box2+"<br/>");//输出false,因为比较的是它们的地址,每个新创建对象的引用地址都不同。
var box3=null==undefined;
document.write(box3+"<br/>");//输出true,因为均为空数值
var box4='2'===2;
document.write(box4+"<br/>");//输出false,两个操作数的数据类型不相等
var box5=null===undefined;
document.write(box5);//输出false,两个操作数的数据类型不相等

四逻辑运算符
       JavaScript语言中的逻辑运算符通常作用于布尔值的操作,一般和关系运算符配合使用,有三个逻辑运算符:&&(逻辑与),||(逻辑或)和!(逻辑非)。
       (1)&&表示两边都必须是true,才返回true。
       如果两边的操作数有一个操作数不是布尔值的情况下,与运算就不一定返回布尔值,此时遵循下面的规则:
       1第一个操作数是对象,则返回第二个操作数
       2第二操作数是对象,则第一个操作数返回true,才返回第二个操作数,否则返回false
       3一个操作数是null,则返回null
       4一个操作数是undefined,则返回undefined
       5如果一个运算数是对象,另一个是 Boolean 值,返回该对象
      逻辑与运算符属于短路操作,如果有第一个操作数返回的是false,第二个不管是true还是false都返回false。

var box1={}&&(5>4);
document.write(box1+"<br/>");//输出true
var box2=(5>4)&
document.write(box2+"<br/>");//输出[object Object]
var box3=(3>4)&
document.write(box3);//输出false

(2)||表示两边有一个是true,就返回true。
      如果两边的操作数有一个操作数不是布尔值的情况下,与运算就不一定返回布尔值,此时遵循下面的规则:
      1第一个操作数是对象,则返回第一个个操作数
      2第一个操作数的求值结果为fasle,则返回第二个操作数
      3两个操作数都是对象,则返回第一个操作数
      4两个操作数都是null,则返回null
      5两个操作数都是undefined,则返回undefined
      6两个操作数都是NaN,则返回NaN
      逻辑或运算符也属于短路操作,如果有第一个操作数返回的是true,第二个不管是true还是false都返回true。

var box1={}||(5>4);
document.write(box1+"<br/>");//输出[object Object]
var box2=(5>4)||{};
document.write(box2+"<br/>");//输出true
var box3=(3>4)||{};
document.write(box3);//输出[object Object]

(3)!逻辑非运算符可以作用与任何值,无论这个值是什么数据类型,这个运算符都会返回一个布尔值,它的流程是:先将这个值转换成布尔值,然后取反,规则如下:
      1操作数是一个对象,返回false
      2操作数是一个空字符串,返回true
      3操作数是一个非空字符串,返回false
      4操作数是数值0,返回true
      5操作数是任意非0数值,返回false
      6操作数是null,返回true
      7操作数是NaN,返回true
      8操作数是undefined,返回true

var box=!{};
document.write(box);//输出false

五、位运算符
      JavaScript语言中包括了七种位运算符:~(位非),&(位与),|(位或),^(位异或),<<(左移),>>(有符右移号),>>>(无符号右移)
       (1)位非(~)运算把运算数转换成32位数字,然后把二进制数转换成它的二进制反码,最后把二进制数转换成浮点数。实质上是对数字求负,然后减去1即为所得值。

var box=~25;
document.write(box);//输出-26

(2)位与(&)运算直接对数字的二进制形式进行运算,然后对上下同一位置的两个数位进行与运算,只有两个数位都为1时才得出1,其余的均为0.

var box=25&3;
document.write(box);//输出1

(3)位或(|)运算也是直接对数字的二进制形式进行计算,然后对上下同一位置的两个数位进行或运算,只右两个数位都为0时才得出0,其余的均为1.

var box=25|3;
document.write(box);//输出27 

(4)位异或(^)也是直接对二进制形式进行运算。当只有一个数位存放的是1时,它才返回1。其余的返回0。也就是两个数位相同时返回0,不同时返回1.

var box=25^3;
document.write(box);//输出26 

(5)左移运算也是对二进制数进行操作,相等于第一个操作数乘以(2的左移位数次幂)的积。

var box=25<<3;
document.write(box);//25左移3位相当于25乘以(2的3次幂),因此输出200 

(6)有符号右移运算也是对二进制数进行操作,相等于第一个操作数除以(2的右移位数次幂)的商。

var box=24>>2;
document.write(box);//输出6

(7)无符号右移运算也是对二进制数进行操作,对于正数,与有符号右移是相同的结果,但是对于负数,就会所不同。

六、赋值运算符
      赋值运算符包括:=(),+=(),-=(),*=(),/=(),%=(),<<=(),>>=(),>>>=()。

var box=100;
box+=100;//相当于box=box+100
document.write("box="+box);//输出box=200

七、其他运算符
1)、字符串运算符:“+”,它的作用是将两个字符串想加。规则:只要有一个字符串即可。

var box=100+"10"';
document.write("box="+box);//输出100100 

2)、逗号运算符,可以在一条语句中执行多个操作

var box=100,age=200,height=300;
document.write("box="+box);//输出box=100 

3)、三元操作符:

var box=(3>4)?"对":"错";
document.write(box);//输出错

如果想更详细的了解ECMAScript运算符的知识,可以访问JavaScript高级教程中的ECMASscript一元运算符这个系列中有详细的运算符教程。对于JS的运算符来说,我们可以对比着C++,C#和Java来学,这个还是相当的容易的。

以上就是关于JavaScript的表达式与运算符的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • javascript表达式和运算符详解

    一.js表达式 定义:表达式是指能计算出值得任何可用程序单元.  --wiki 表达式是js一种短语,可是js解释器用来产生一个值.  --js<权威指南> 1.原始表达式. 常量/直接量: 3.14/ "test" 等 关键字: null,this,true,false 等 变量: i,k,j 等 复合表达式:原始表达式和原始表达式之间用运算符连接可以组成一个复合表达式. 例如: 10 * 20 这就是一个复合表达式 2.(数组.对象的)初始化表达式. 例如: [1,2]

  • js利用与或运算符优先级实现if else条件判断表达式

    复制代码 代码如下: <script type="text/javascript"> /******************************************************************* 利用运算符优先级实现ifelse表达式 result = expression1 && expression2 当且仅当两个表达式的值都等于 True 时, result 才是 True. 如果任一表达式的值等于 False, 则 res

  • Javascript核心读书有感之表达式和运算符

    表达式是javascript中的一个短语,javascript解释器会将其计算出一个结果.程序中常用量是最简单的一类表达式就是变量.变量名也是一种简单的表达式,它的值就是赋值给变量的值. 复杂的表达式是由简单的表达式组成的.比如数组访问表达式是由一个表示数组的表达式,方括号.一个整数表达式构成.它们所组成新的表达式运算结果是该数组特定位置的元素值.同样的函 数调用表达式由一个表示函数对象的表达式和0个多个参数表达式构成.将简单表达式组成复杂表达式最常用的方法就是运算符. 本章(本文)将讲解所有j

  • 详解JavaScript的表达式与运算符

    JavaScript脚本语言描述了一组用于操作数据值的运算符,包括一元运算符,布尔运算符,算术运算符,关系运算符,三元运算符,位运算符和赋值运算符.        表达式是JavaScript语言的一个"短语",包含变量名(或字面量)和运算符.最简单的表达式时字面量或变量名.当然也有合并简单的表达式来创建复杂的表达式. 一.一元运算符 (1)递增++和递减-- var box1=100; ++box1;//相当于box=box+1 document.write("box1=&

  • 详解JavaScript中的Object.is()与"==="运算符总结

    三重相等运算符 === 严格检查2个值是否相同: 1 === 1; // => true 1 === '1'; // => false 1 === true; // => false 但是,ES2015规范引入了 Object.is(),其行为与严格的相等运算符几乎相同: Object.is(1, 1); // => true Object.is(1, '1'); // => false Object.is(1, true); // => false 主要问题是:什么时

  • 详解JavaScript中的链式调用

    链模式 链模式是一种链式调用的方式,准确来说不属于通常定义的设计模式范畴,但链式调用是一种非常有用的代码构建技巧. 描述 链式调用在JavaScript语言中很常见,如jQuery.Promise等,都是使用的链式调用,当我们在调用同一对象多次其属性或方法的时候,我们需要多次书写对象进行.或()操作,链式调用是一种简化此过程的一种编码方式,使代码简洁.易读. 链式调用通常有以下几种实现方式,但是本质上相似,都是通过返回对象供之后进行调用. this的作用域链,jQuery的实现方式,通常链式调用

  • 详解JavaScript基于面向对象之创建对象(2)

    接着上文<详解JavaScript基于面向对象之创建对象(1)>继续学习. 4.原型方式        我们创建的每个函数都有一个通过prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法.逻辑上可以这么理解:prototypt通过条用构造函数而创建的那个对象的原型对象.使用原型的好处就是可以让所有对象实例共享它所包含的属性和方法.也就是说,不必在构造函数中定义对象信息,而是直接将这些信息添加到原型中.        原型方式利用了对象的pr

  • 详解JavaScript基于面向对象之继承

    一.面相对象继承机制       这个实例使用UML很好的解释了继承机制.       说明继承机制最简单的方式是,利用一个经典的例子就是几何形状.实际上,几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形.矩形和五边形都是多边形的一种,具有不同数量的边.正方形是矩形的一种,所有的边等长.这就构成了一种完美的继承关系,很好的解释了面向对象的继承机制.        在这个例子中,形状是椭圆形和多边形的基类(通常我们也可以叫它父类,所有类都由

  • 详解Javascript中prototype属性(推荐)

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不是基于'类的',而是通过构造函数(constructor)和原型链(prototype chains)实现的.但是在ES6中提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类.基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能

  • 详解JavaScript基本类型和引用类型

    一.值的类型        早在介绍JS的数据类型的时候就提到过基本类型和引用类型,不过在说两种类型之前,我们先来了解一下变量的值的类型.在ECMAScript中,变量可以存在两种类型的值,即原始值和引用值. (1)原始值        存储在栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. (2)引用值        存储在堆中的对象,也就是说,存储在变量处的值是一个指针,指向存储对象的内存处.        为变量赋值时,ECMAScript的解释程序必须判断该值是原始类型,还

  • js对象实例详解(JavaScript对象深度剖析,深度理解js对象)

    这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕. 平时发的文章基本都是开发中遇到的问题和对最佳解决方案的探讨,终于忍不住要写一篇基础概念类的文章了. 本文探讨以下问题,在座的朋友各取所需,欢迎批评指正: 1.创建对象 2.__proto__与prototype 3.继承与原型链 4.对象的深度克隆 5.一些Object的方法与需要注意的点 6.ES6新增特性 下面反复提到实例对象和原型对象,通过构造函数 new

  • 详解Javascript中new()到底做了些什么?

    前言 和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 new 来产生对象? 本文将带你一起来探索 javascript 中 new 的奥秘... 要创建 Person 的新实例,必须使用 new 操作符. 以这种方式调用构造函数实际上会经历以下 4个步骤: (1) 创建一个新对象: (2) 将构造函数的作用域赋给新对象(因此 this 就指向了

  • 详解javascript void(0)

    void关键字介绍 首先,void关键字是javascript当中非常重要的关键字,该操作符指定要计算或运行一个表达式,但是不返回值. 语法格式: void func() void(func()) 实例1 当点击超级链接时,什么都不发生 <!-- 1.当用户链接时,void(0)计算为0,用户点击不会发生任何效果 --> <a href="javascript:void(0);" rel="external nofollow" rel="

随机推荐