Js表达式和运算符

2018.10.15 星期一 10:11




# 运算符
赋值运算符(Assignment operators)
比较运算符(Comparison operators)
算数运算符(Arithmetic operators)
位运算符(Bitwise operators)
逻辑运算符(Logical operators)
字符串运算符(String operators)
条件(三元)运算符(Conditional operator)
逗号运算符(Comma operator)
一元运算符(Unary operators)
关系运算符(Relational operator)

JavaScript 拥有二元和一元运算符, 和一个特殊的三元运算符(条件运算符)。
## 逗号运算符(Comma operator)
## 一元操作符
### delete
删除一个对象或一个对象的属性或者一个数组中某一个键值
你能使用 delete 删除各种各样的隐式声明, 但是被var声明的除外。
$PS: var, let以及const创建的不可设置的属性不能被delete操作删除
如果 delete 操作成功,属性或者元素会变成 undefined。如果 delete可行会返回true,如果不成功返回false。

##### 删除数组元素
删除数组中的元素时,数组的长度是不变的,例如删除a[3], a[4],a[4]和a[3] 仍然存在变成了undefined。

delete 删除数组中的一个元素,这个元素就不在数组中了。例如,trees[3]被删除,trees[3] 仍然可寻址并返回undefined。
如果想让数组中存在一个元素但是是undefined值,使用undefined关键字而不是delete操作. 如下: trees[3]分配一个undefined,但是这个数组元素仍然存在:
1
2
3
4
5
6
7
8
9
10
11
12
13
// ### 不会被执行
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
delete trees[3];
if (3 in trees) {
// 不会被执行
}

// ### 会被执行
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
trees[3] = undefined; // trees[3]=null
if (3 in trees) {
// this gets executed(会被执行)
}


### typeof
$PS: 用typeof操作符来确定是哪种基本类型,typeof是一个操作符,而不是一个函数,因此typeof后面的圆括号可有可无,用instanceof操作符来确定是哪种引用类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 对于关键词 true 和 null, typeof 操作符将会返回如下结果:   
typeof true; // returns "boolean"
typeof null; // returns "object"

// 对于预定义的对象,typeof 操作符将会返回如下结果:
typeof Date; // returns "function"
typeof Function; // returns "function"
typeof Math; // returns "object"
typeof Option; // returns "function"
typeof String; // returns "function"

// $PS
var theDay = new Date(1995, 12, 17);
theDay instanceof Date // true
2 instanceof Math // Uncaught TypeError: Right-hand side of 'instanceof' is not callable
Number(2) instanceof Math // Uncaught TypeError: Right-hand side of 'instanceof' is not callable

function f(){}
typeof f.prototype // "object"


### void
void (expression) 或者void expression
表明一个运算没有返回值。expression是javaScript表达式,括号中的表达式是一个可选项,当然使用该方式是一种好的形式。

你可以使用void运算符指明一个超文本链接。该表达式是有效的,但是并不会在当前文档中进行加载。

1
2
3
4
<!-- 如下创建了一个超链接文本,当用户单击该文本时,不会有任何效果。 -->
<a href="javascript:void(0)">Click here to do nothing</a>
<!-- 下面的代码创建了一个超链接,当用户单击它时,提交一个表单。 -->
<a href="javascript:void(document.form.submit())">Click here to submit</a>


## 关系操作符
关系操作符对操作数进行比较,根据比较结果真或假,返回相应的布尔值。
### in
in操作符,如果所指定的属性确实存在于所指定的对象中,则会返回true,
### instanceof
如果所判别的对象确实是所指定的类型,则返回true
当你需要确认一个对象在运行时的类型时,可使用instanceof. 例如,需要 catch 异常时,你可以针对抛出异常的类型,来做不同的异常处理。
1
2
3
4
var theDay = new Date(1995, 12, 17);
if (theDay instanceof Date) {
// statements to execute
}


### 运算符优先级
member> call / create instance> … logical-or> conditional>assignment>comma
即:. []> () new > ... > && >|| > ?: > =,+=,*=,<<=,|= > ,



# 表达式
每一个合法的表达式都能计算成某个值,但从概念上讲,有两种类型的表达式:有副作用的(比如赋值)和单纯计算求值的。

JavaScript有以下表达式类型:
算数: 得出一个数字, 例如 3.14159. (通常使用 arithmetic operators.) 字符串: 得出一个字符串, 例如, “Fred” 或 “234”. (通常使用 string operators.)
逻辑值: 得出true或者false. (经常涉及到 logical operators.) 基本表达式: javascript中基本的关键字和一般表达式。
* 左值表达式: 分配给左值。

## 基本表达式
### this
this关键字被用于指代当前的对象,通常,this指代的是方法中正在被调用的对象。


分组操作符
分组操作符()控制了表达式中计算的优先级.

## 左值表达式
左值可以作为赋值的目标。
### new
创建一个自定义类型或者是预置类型的对象实例

super 关键字
可以用来调用一个对象父类的函数,它在用来调用一个类的父类的构造函数时非常有用,比如:

扩展语句
扩展语句符允许一个表达式在原地展开, 当需要多个参数 (比如函数调用时) 或者多个值(比如字面量数组) 。


11:01

优先级

运算符优先级
1-20

运算符的优先级

从左到右算起
1.()圆括号的优先级最大

  1. 一元运算符 ++ 、 –( ++a 优先级小于 a++ )、 ! 、+… 、-…
  2. 算术运算符 *(幂) 、 、 / 、 %(取余) 、 + 、 -
  3. 移位运算符 <<(按位左移)、>>(按位右移)、>>>(无符号右移)

  4. 比较运算符 < 、 <= 、 > 、 >= 、 == 、 != 、=== 、!==

  5. 位运算符 & (按位与) 、^ (按位异或) 、| (按位或)

  6. 逻辑运算符 &&(逻辑与)、|| (逻辑或)

  7. 三元运算符

  8. 赋值运算符 =、 += 、-= 、*= 、/= 、%=

  9. 展开运算符 …

  10. 逗号运算符 ,

其他

左/右结合运算

左结合运算:对于优先级别相同的运算符,一般情况下,总是按照从左到右的顺序,这叫做运算符的左结合
右结合运算:少数运算符的运算顺序是按照从右向左的顺序来计算的;
最主要的是:1、赋值运算符(=);2、三目运算符(?:)

1
2
3
4
5
w = x = y = z;
q = a ? b : c ? d : e ? f : g;
// 等价于
w = (x = (y = z));
q = a ? b : (c ? d : (e ? f : g));

knowledge is no pay,reward is kindness
0%