​​​​​​​第四章:表达式和运算符

表达式概述        

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

原始表达式

        最简单的表达式是“原始表达式”, 原始表达式是表达式的最小的单位--它们不包含其
他表达式 javascript中的原始表达式包含常量或直接量、关键字和变量
        直接量 是直接在程序中出现的常数值。它们看起来像:
1.23 //数字直接量
"hello" //字符串直接量
/pattern/ //正则表达式直接量
        javascript中的一些保留字构成了原始表达式:
true //布尔值:真
false //假
null //返回一个值:空
this //返回"当前"对象
        和其它关键字不同,this并不是一个常量,他在程序的不同地方返回的值也不相同。this关键字经常在面向对象编程中出现。 在一个方法体内,this返回调用这个方法的对象
        最后,第三种原始表达式是变量:
i //返回变量i的值
sum //返回sum的值
undefined //是全局变量,和null不同,它不是一个关键字

对象和数组的初始化表达式

        对象和数组初始化表达式实际上是一个新创建的对象和数组 ,这些初始化的表达式有时候叫做“ 对象直接量 ”和“ 数组直接量 ”。然而和布尔直接量不同,他们不是原始表达式,因为他们所包含的成员或者元素都是子表达式。
        数组的初始化表达式是通过一对方括号和其内由逗号隔开的列表构成的,初始化结果是一个新创建的数组。数组的元素是逗号分隔表达式的值
[]         //一个空数组;[]内留空即表示该数组没有任何元素
[1+2,3+4]  //有两个元素的数组,第一个3,第二个是7
        数组初始化表达式中的元素初始化表达式可以是数组初始化表达式。也就是说表达式是
可以嵌套的:
var mat = [[1,2,3],[4,5,6],[7,8,9]];
        数组直接量中列表之间的元素可以省略,空位就会填充undefined,同时,数组直接量
的结尾处留下逗号,这时不会创建一个新的值为undefined的元素。
        对象初始化表达式 和数组初始化表达式非常相似,只是方括号被花括号代替。且每个子
表达式都包含一个属性名和一个冒号作为前缀:
var p = { x: 2.1, y: -3 } //一个拥有两个属性成员的对象
var q = {}; //空对象
q.x = 2.1; q.y = -3; //q的属性成员和p的一样

        对象直接量也可以嵌套。

函数定义表达式

        函数定义表达式定义一个javascript函数。 表达式的值是这个新定义的函数 。从某种意义上讲,函数定义表达式可以称为” 函数直接量 “,毕竟对象初始化表达式也称为“ 对象直接量 ”。 一个典型的函数定义表达式包含关键字function,其后是一对圆括号,括号以内是 逗号分隔的列表,列表包含0或多个标识符(参数名),然后再跟随花括号包裹的 javascript代码段(函数体)。
var square = function(x){
     return x*x
};

        函数定义表达式同样可以包含函数的名字。函数也可以通过函数语句来定义,而不是函数表达式。

属性访问表达式

        属性访问表达式运算得到一个对象属性或者一个数组元素的值 。javascript为属性访问定义了两种方法。
        expression . indentifier
        expression [ expression ]
        第一种写法是一个表达式后跟随一个句点和标识符。表达式指定对象,标识符则指定要访问的属性名称。
        第二种写法是使用方括号,方括号内是一个表达式(这种方法适用于对象和数组)。第二个表达式指定要访问的属性的名称或者代表要访问数组元素的索引。
var o = {x : 1, y : {z : 3}};
var a = [o, 4, [5, 6]];
o.x          //=>1:表达式o的x属性o.y.z //=>3: 表达式o.y的z属性
o.["x"]      //=>1:对象o的x属性
a[1]         //=>4:表达式a索引为1的元素
a[2]["1"]    //=>6:表达式a[2]中索引为1的元素
a[0].x       //=>1: 表达式a[0]的x属性

调用表达式

        javascript中的调用表达式(invocation expression)是一种调用(或者执行)函数或方法的语法表示。它以一个函数表达式开始,这个函数表达式指代了要调用的函数。函数表达式后跟随一对圆括号,括号内是一个以逗号隔开的参数列表。参数可以有0个也可以有多个。
f(0)             //f是一个函数表达式:0是一个参数
Math.max(x,y,z)  //Math.max是一个函数;x,y和z是参数
a.sort()         //a.sort()是一个函数,它没有参数

        任何一个调用表达式都包含一对圆括号和左圆括号之前的表达式如果这个表达式是一个属性访问表达式,那么这个调用叫做“方法调用”(method invication)。在方法调用中执行函数体的时候,作为属性访问主体的对象和数组便是其调用方法内this的指向。这种特性使得在面向对象编程的范例中,函数(其OO名称为“方法”)可调用其宿主对象。

对象创建表达式

        对象创建表达式(object creation expression)创建一个对象并调用一个函数(构造函数)来初始化对象的属性 。对象创建表达式和函数调用表达式非常类似,只是对象创建表达式之前多了一个关键字 new :
new Object()
new Point(2, 3)

        如果对象创建表达式不需要传入任何参数给构造函数的话,那么这对圆括号是可以省略掉的。

运算符概述

        javascript中的运算符用于 算术表达式、   比较表达式、   逻辑表达式 赋值表达式 等,如下表所示:按照运算符的优先级来排序,前边的运算符优先级高于后边的运算符优先级。被水平分割线隔开的运算符具有不同的优先级。
        A表示运算符的结合性,L从左至右或者R(从右至左)
        标题N的列表表示操作数的个数。
        ”类型“列表示期望的操作数的类型,以及运算符的结果类型(在"→"符号之后)
运算符操作AN类型
++前/后增量R1lval → num
--前/后减量R1lval → num
-求反R1num → num
+转换为数字R1num → num
按位求反R1int → int
!逻辑非R1bool → bool
delete删除属性R1lval → bool
typeof检测操作类型R1any → str
void返回undefined值R1any → undef
*    /    %乘    除    取余L2num , num → num
+    -加    减L2num , num → num
+字符串连接L2str , str → str
<<左移位L2int , int → int
>>右移位L2int , int → int
>>>无符号右移L2int , int → int
<    <=    >    >=比较数字顺序L2num , num → bool
<    <=    >    >=比较在字母中的顺序L2str , str → bool
instanceof测试对象类L2obj , func → bool
in测试属性是否存在L2str , obj → bool
==判断相等L2any , any → bool
!=判断不等L2any , any → bool
===判断恒等L2any , any → bool
!==判断非恒等L2any , any → bool
&按位与L2int , int → int
^按位异或L2int , int → int
按位或L2int , int → int
&&逻辑与L2any , any → any
||逻辑或L2any , any → any
?:条件运算符R3bool , any , any → any
=变量赋值或对象属性赋值R2lval , any → any

*=    /=    %=    +=    -=    &=

^=    |=    <<=    >>=    >>>=

运算且赋值R2lval , any → any
,忽略第一个操作数,返回第二个操作数L2any , any → any

lvalue (左值):表达式只能出现在赋值运算符的左侧。

算术表达式

        基本的算术运算符是+、-、*、/ % ­ 。除了 + 加法,其它的运算符特别简单,只是在必要的时候操作符转化为数字而已,然后求积、商、余(模)和差。 所有那些无法转换为数字的操作都将转换为NaN 。如果操作数(或者转换结果)是 NaN 值,算术运算结果也是NaN。
        在javascript 中所有的数字都是浮点数型的,除法运算的结果也是浮点型。比如 5/2 结果是2.5 ,而不是 2 。除数为 0 的运算结果为正无穷大或负无穷大。而 0/0 的结果是 NaN 。所有这些运算均不会报错。
        运算符“%” 计算的是第一个操作数对第二个操作数的模,换句话说,就是第一个操作数除以第二个操作数的余数。取余运算符的操作数通常都是整数,但也适用于浮点数。
        6.5%2.1结果是 0.2

“+”运算符

        二元加法运算符“+” 可以对两个数字做加法,也可以做字符串连接操作 :
1+2                         //=> 3
"hello" + " " + "there"     // =>"hello there"
"1"+"2"                     //=>"12"

        当两个操作数都是数字或都是字符串的时候,计算结果是显而易见的。然而对于其他情况来说,则要进行一些必要的类型转换。并且运算符的行为依赖于类型的转换的结果。从技术上来讲,加法操作符的行为表现为:如果一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始类值。日期对象通过toString()方法执行转换,其他对象则通过valueOf()方法执行转换(如果 valueOf()方法返回一个原始值的话)。由于多数对象都不具备可用的valueOf()方法,因此他们会通过toString()方法来执行转换。

        在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换为字符串。然后进行字符串连接。否则,两个操作数都将转换为数字(或者NaN),然后进行加法操作。

1 + 2         //=>3 :加法
"1" + "2"     //=>"12" :字符串连接
"1" + 2       //=>"12":数字转换为字符串后进行字符串连接
1 + {}        //=>"1[object object]":对象转换为字符串后进行字符串连接
true + true   //=>2:布尔值转换为数字后做加法
2 + null      //=>2:null转换为0后做加法
2 + undefined //=>NaN:undefined转换为NaN做加法

一元运算符

        一元运算符作用于一个单独的操作数。并产生一个新值。在javascript中, 一元运算符具有很高的优先级 ,而且都是右结合。这里讲述一元运算符(+,-,++和--),必要时,他们会将操作数转换为数字。需要注意的的是+和-是一元运算符,也是二元运算符、
        一元加法+
        一元加法运算符把操作数转换为数字(或者NaN),并且返回这个转换后的数字。如果
操作数本身就是数字,则直接返回这个数字。
        一元减法-
        当-号做一元运算符时,它会根据需要把操作数转换为数字,然后改变运算结果的符
号。
        递增++
        递增“++”运算符对其操作数进行增量(+1)的操作,操作数是一个左值(变量、数组元素或者对象属性)。运算符将操作数转换为数字,然后给数字加1、并将加1后的数值重新赋值给变量、数组元素或者对象属性。递增++ 运算返回值依赖它对操作数的位置。
        当操作符在操作数之前,称为“ 前增量 ”(pre-increment)运算符,它对操作数进行增量计算,并返回计算后的值。当操作符在操作数之后,称为" 后增量 "(post-increment)运算符,它对操作数进行
增量计算,但返回未做增量计算的(unincremented)值。如
var i = 1,j = ++i   //i和j的值都是2
var i = 1,j = i++;  //i是2,j是1

        递减和递增的操作方式是同样的,它把操作数转换为数字,然后减1,并将计算后的值重新赋值给操作数。

算数运算符

        算术运算符用于执行两个变量或值的运算。 赋值 y = 5 , 以下表格说明算术运算符的使用:
运算符描述例子y值x值
+加法x = y + 2;57
-减法x = y - 2;53
*乘法x = y * 2;510
/除法x = y / 2;52.5
%余数x = y % 2;51
++自增

x = ++y;

x = y++;

6

6

6

5

--自减

x = --y;

x = y--;

4

4

4

5

   赋值运算符     

        赋值运算符用于给 JavaScript 变量赋值。 给定 x=10 和 y=5,下面的表格解释了赋值运算符:

运算符例子实例x值
=x = y;x = y;5
+=x += y;x = x + y;15
-=x -= y;x = x - y;5
*=x *= y;x = x * y;50
/=x /= y;x = x / y;2
%=x %= y;x = x % y;0

+ 运算符, += 运算符

         + 运算符, += 运算符可用于连接字符串。 给定 text1 = "Good ", text2 = "Morning", 及 text3 = "", 下面的表格解释了字符串运算符的使用:

运算符例子txt1text2text3
+text3 = text1 + test2;"Good""Morning""GoodMorning"
+=text1 += text2;"GoodMorning""Morning"

比较运算符

         比较运算符用于逻辑语句的判断,从而确定给定的两个值或变量是否相等。 给定 x=5, 下表展示了比较运算符的使用:

运算符描述比较结果
==等于

x == 8;

x == 5;

false

true

===值及类型均相等(恒等于)

x === "5";

x === 5;

false

true

!=不等于x != 8;true
!==值与类型均不等(不恒等于)

x !== "5";

x !== 5;

true

false

>大于x > 8;false
<小于x < 8;true
>=大于或等于x >= 8;false
<=小于或等于x <= 8;true

 条件运算符

​​​​​​​        条件运算符用于基于条件的赋值运算。 给定 age = 19, 下表演示了条件运算符的运算:

语法例子
变量 = (条件)? 值1 : 值2;voteable = (age < 18) ? "未成年" : "成年"

 逻辑运算符

         逻辑运算符用来确定变量或值之间的逻辑关系。 给定 x=6 and y=3, 以下实例演示了逻辑运算符的使用:

运算符描述例子
&&(x < 10 && y > 1)为true
||(x == 5 || y == 5)为false
!!(x == y) 为true

位运算符

​​​​​​​         位运算符工作于32位的数字上,任何数字操作都将转换为32位,结果会转换为 JavaScript 数 字。

运算符描述例子类似于结果十进制
&ANDx = 5 & 10101 & 000100011
|ORx = 5 | 10101 | 000101015
~取反x = ~5~01011010-6
^异或x = 5 ^ 10101 ^ 000101004
<<左移x = 5 << 10101 << 1101010
>>右移x = 5 >> 10101 >> 100102

in运算符

        in运算符希望它的左操作数是一个字符串或者可以转换为字符串,希望它的右侧是一个对象 。如果右侧的对象拥有一个名为左操作数值的属性名,那么表达式返回true。例如:
//定义一个对象
var point = {
x: 1,
y: 1
} 
"x" in point //=>true 对象有一个名为x的属性
"z" in point //=>false 对象无名为z的属性
"toString" in point // =>true 对象继承了toString方法

var data = [7, 8, 8];
"0" in data //=>true 数组包含0(下标?)
1 in data //=>true 数字转换为字符串(这里有点没搞懂,难道是看的下标?)
3 in data //=>fase 没有索引为3的元素

instanceof运算符

        instanceof运算符希望左操作数为一个对象,右操作数标识对象的类。 如果左侧的对象 是右侧类的实例,则表达式返回true,否则返回false 。javascript对象的类是通过初始化他们的构造函数的来定义的。这样的话, instanceof的右操作数应当是一个函数 。比如:
var d = new Date(); //构造一个新对象
d instanceof Date; //true, d是Date() 创建的
d instanceof Object //true ,所有的对象都是Object的实例
d instanceof Number //false,d不是一个Number对象
var a = [1,2,3] //数组直接量创建数组
a instanceof Array //true a为数组
a instanceof Object //true 所有的数组都是对象
a instanceof RegExp //fasle 数组不是正则表达式
        需要注意的是,所有对象都是Object的实例 。当通过instanceof判断一个对象是否为一个类的实例的时候,这个判断也叫“ 父类 ”(superclass)的检测, 如果instanceof的左侧操作对象不是对象的话,instanceof返回false。如果右侧操作不是函数,则抛出类型错误的异常

eval()

        eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行 。如果参数是一个表达式,eval() 函数将执行表达式。如果参数是Javascript语句,eval()将执行 Javascript 语句。
eval("x = 12,y = 2; x * y")

typeof

        该操作符来检测变量的数据类型。
typeof "John"     // 返回 string
typeof 3.14       // 返回 number
typeof false      // 返回 boolean
typeof [1,2,3,4]  // 返回 object
typeof {name:'John', age:34} // 返回 object

delete

        delete是一元操作符,它用来 删除对象的属性或者数组的元素
var o = {
x: 1,
y: 2
}
delete o.x;
"x" in o;   //=>false

var a = [1, 2, 3];
delete a[2]; // 删除数组中最后一个元素
2 in a; //=> false 元素2已经在数组中不存在了
a.length;     //=>3,注意,数组长度并没有改变,尽管上一行删除了这个元素,
             //但删除操作留下了一个位置。实际上并没有修改数组的长度,因此a的长度仍然为3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值