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运算符
逗号运算符