表达式概述
表达式是javascript中的一个短语,javascript解释器会将其计算出一个结果。程序中的常量是最简单的一类表达式。变量名也是一种简单的表达式,它的值就是赋值给变量的值。复杂的表达式是由简单的表达式组成的。比如数组访问表达式是由一个表示数组的表达式,方括号、一个整数表达式构成。它们所组成新的表达式运算结果是该数组特定位置的元素值。同样的,函数调用表达式由一个表示函数对象的表达式和0个多个参数表达式构成。将简单表达式组成复杂表达式最常用的方法就是使用运算符。
原始表达式
1.23 //数字直接量
"hello" //字符串直接量
/pattern/ //正则表达式直接量
true //布尔值:真
false //假
null //返回一个值:空
this //返回"当前"对象
i //返回变量i的值
sum //返回sum的值
undefined //是全局变量,和null不同,它不是一个关键字
对象和数组的初始化表达式
[] //一个空数组;[]内留空即表示该数组没有任何元素
[1+2,3+4] //有两个元素的数组,第一个3,第二个是7
var mat = [[1,2,3],[4,5,6],[7,8,9]];
var p = { x: 2.1, y: -3 } //一个拥有两个属性成员的对象
var q = {}; //空对象
q.x = 2.1; q.y = -3; //q的属性成员和p的一样
对象直接量也可以嵌套。
函数定义表达式
var square = function(x){
return x*x
};
函数定义表达式同样可以包含函数的名字。函数也可以通过函数语句来定义,而不是函数表达式。
属性访问表达式
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属性
调用表达式
f(0) //f是一个函数表达式:0是一个参数
Math.max(x,y,z) //Math.max是一个函数;x,y和z是参数
a.sort() //a.sort()是一个函数,它没有参数
任何一个调用表达式都包含一对圆括号和左圆括号之前的表达式,如果这个表达式是一个属性访问表达式,那么这个调用叫做“方法调用”(method invication)。在方法调用中执行函数体的时候,作为属性访问主体的对象和数组便是其调用方法内this的指向。这种特性使得在面向对象编程的范例中,函数(其OO名称为“方法”)可调用其宿主对象。
对象创建表达式
new Object()
new Point(2, 3)
如果对象创建表达式不需要传入任何参数给构造函数的话,那么这对圆括号是可以省略掉的。
运算符概述
运算符 | 操作 | A | N | 类型 |
---|---|---|---|---|
++ | 前/后增量 | R | 1 | lval → num |
-- | 前/后减量 | R | 1 | lval → num |
- | 求反 | R | 1 | num → num |
+ | 转换为数字 | R | 1 | num → num |
~ | 按位求反 | R | 1 | int → int |
! | 逻辑非 | R | 1 | bool → bool |
delete | 删除属性 | R | 1 | lval → bool |
typeof | 检测操作类型 | R | 1 | any → str |
void | 返回undefined值 | R | 1 | any → undef |
* / % | 乘 除 取余 | L | 2 | num , num → num |
+ - | 加 减 | L | 2 | num , num → num |
+ | 字符串连接 | L | 2 | str , str → str |
<< | 左移位 | L | 2 | int , int → int |
>> | 右移位 | L | 2 | int , int → int |
>>> | 无符号右移 | L | 2 | int , int → int |
< <= > >= | 比较数字顺序 | L | 2 | num , num → bool |
< <= > >= | 比较在字母中的顺序 | L | 2 | str , str → bool |
instanceof | 测试对象类 | L | 2 | obj , func → bool |
in | 测试属性是否存在 | L | 2 | str , obj → bool |
== | 判断相等 | L | 2 | any , any → bool |
!= | 判断不等 | L | 2 | any , any → bool |
=== | 判断恒等 | L | 2 | any , any → bool |
!== | 判断非恒等 | L | 2 | any , any → bool |
& | 按位与 | L | 2 | int , int → int |
^ | 按位异或 | L | 2 | int , int → int |
| | 按位或 | L | 2 | int , int → int |
&& | 逻辑与 | L | 2 | any , any → any |
|| | 逻辑或 | L | 2 | any , any → any |
?: | 条件运算符 | R | 3 | bool , any , any → any |
= | 变量赋值或对象属性赋值 | R | 2 | lval , any → any |
*= /= %= += -= &= ^= |= <<= >>= >>>= | 运算且赋值 | R | 2 | lval , any → any |
, | 忽略第一个操作数,返回第二个操作数 | L | 2 | any , any → any |
算术表达式
“+”运算符
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做加法
一元运算符
var i = 1,j = ++i //i和j的值都是2
var i = 1,j = i++; //i是2,j是1
递减和递增的操作方式是同样的,它把操作数转换为数字,然后减1,并将计算后的值重新赋值给操作数。
算数运算符
运算符 | 描述 | 例子 | y值 | x值 |
---|---|---|---|---|
+ | 加法 | x = y + 2; | 5 | 7 |
- | 减法 | x = y - 2; | 5 | 3 |
* | 乘法 | x = y * 2; | 5 | 10 |
/ | 除法 | x = y / 2; | 5 | 2.5 |
% | 余数 | x = y % 2; | 5 | 1 |
++ | 自增 | 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 = "", 下面的表格解释了字符串运算符的使用:
运算符 | 例子 | txt1 | text2 | text3 |
---|---|---|---|---|
+ | 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 数 字。
运算符 | 描述 | 例子 | 类似于 | 结果 | 十进制 |
---|---|---|---|---|---|
& | AND | x = 5 & 1 | 0101 & 0001 | 0001 | 1 |
| | OR | x = 5 | 1 | 0101 | 0001 | 0101 | 5 |
~ | 取反 | x = ~5 | ~0101 | 1010 | -6 |
^ | 异或 | x = 5 ^ 1 | 0101 ^ 0001 | 0100 | 4 |
<< | 左移 | x = 5 << 1 | 0101 << 1 | 1010 | 10 |
>> | 右移 | x = 5 >> 1 | 0101 >> 1 | 0010 | 2 |
in运算符
//定义一个对象
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运算符
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 数组不是正则表达式
eval()
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
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