javascript学习笔记——表达式和运算符

表达式类别:

原始表达式

常量、变量和关键字,是表达式的最小单位。

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

[1+2,3+2]数组初始化表达式中还会有子表达式;{x:1,y:1}对象初始化表达式。

函数定义表达式

var a = function(){}

属性访问表达式

expression[expression] expression.identifier两种形式。

这种方式首先会计算[和.之前的expression,如果计算为null和undifined那么就会抛出类型错误异常。

虽然identifier方法较为简单,但是只能使用在合格标识符中,并且要知道具体的属性名称。括号方法必须使用在保留字符或者含有标点符号或者数字中。

调用表达式

a(),里面可以传入参数

对象创建表达式

new a(),假如不传参数也可以不写括号。

运算符:

操作数个数、操作数类型、结果类型、运算符优先级、运算符结合性、运算顺序。

算术表达式:

“+”运算符

在+运算符中,假如其中一个操作数有字符串,则另外一个操作数也会转换成字符串;假如一个操作数是对象,则会根据对象转换成原始值的方式进行转换(日期类型通过toString进行转换,其他通过valueOf进行转换,大部分对象没有valueOf方法,所以会通过toString方法进行转换),假如转换之类的类型是字符串,则会进行字符串相加方法;否则进行数组相加或者NaN。

位运算符

& | ~ ^ << >> >>>

一元运算符

++a a++ --a a--

符号在变量前面则先进行操作符操作再赋值,符号在变量后面先赋值再进行操作符操作。

关系表达式:

等号和不等运算符

== != === !==

==和!=比较的时候会进行一些类型的转换,假如比较的常量是不同类型的,那会先进行类型转换,假如一方是字符串另一方是数字,则会把字符串转换成数字进行比较;假如一方是布尔值一方是数字,则会把布尔值转换成数字进行比较,对象也是一样。最终都转换成数字进行比较,所以这是不严格的等号运算符。

===和!==是严格运算符,它不会进行类型的转换,不同类型那就不相等;两个引用比较要指向同一个对象才想等;两个null或者undifined进行比较不相等;NaN和任何数比较都不相等,和自身比较也不相等;两个字符串比较,16位数完全相等才相等,假如他们长度或者内容不同,则不相等。

比较运算符

< > <= >=

在比较运算符中,只会比较数字和字符串,其它类型需要通过类型转换再来比较

假如操作数中有一个操作数不是字符串,则两个操作数都要转换成数字进行比较

字符串比较是通过字符数值来比较的,大写字母的数值小于小写字母

比较运算符和加号运算符之间的区别是,比较运算符更青睐于数字,若有一个操作数不是字符串,则两个操作数都会转换成数字进行比较;而加号运算符更加青睐于字符串,若一个操作数是字符串,则两个操作数都会转换成字符串相加的,只有在两个操作数都是数字的情况下才会用数字加法。

in运算符

in运算符的作用是判断左值是否为右值的属性名

string in object

左值要是string类型,若不是则进行类型转换。

instanceof

instanceof是判断左值是否为右值的实例

实例 instanceof 对象

如果instanceof的左操作数不是一个对象的话返回false,假如右操作数不是一个函数的话会抛出类型错误的异常。

逻辑运算符

&& || !

null undifined "" 0 -0 NaN false都是假值。

在&&中,首先会运算左值,若是左边的表达式为false,那么直接返回左值,右值不会计算,若是左值为true,那么右值将会继续计算。

在||中,首先会运算左值,若是左边的表达式为true,那么直接返回左值,右值不会继续计算,若是左值为false,那么继续计算右值。

赋值表达式

带操作的赋值表达式 =+ -= *= /= %= <<= >>= >>>= &= |= ^=

表达式计算

eval() 在所调用的局部范围内可以进行获取,修改和定义局部变量

eval() 全局变量,在全局中复制给一个全局变量,这个全局变量在局部变量中可以获取修改和定义全局变量,但是不能对局部变量进行读写和定义。

其他运算符

条件运算符 ?:

条件判断?true:false

typeof运算符

判断左边的值是什么类型

undifined object number string function boolean 六种类型

delete运算符

delete可以删除对象属性和数组元素

当数组元素被删除的时候,length不会变小,留下一个洞undifined,可以通过in运算符来查看属性是否还存在

但是delete不可以删除内置核心对象和客户端属性,不可以删除通过var定义的变量以及用function来定义的函数和参数。

在严格模式中delete是非法的,会抛出语法错误异常。

void运算符

逗号运算符