第4章 表达式和运算符
一.原始表达式
1.定义:表达式的最小单位——他们不再包含其他表达式(包含常量或直接值,关键字和变量)
2.this关键字经常在面向对象编程中出现。在一个方法体内,this返回调用这个方法的对象。
二对象和数组的初始化表达式
1.对象和数组初始化表达式可以称作“对象直接量”“数组直接量”。但是和布尔不同,他们不是原始表达式(因为他们包含的成员或元素是子表达式)
2.数组初始化:
var a = [];//空数组
var b = [1+2,3+4];//2个元素的数组
var matrix = [[1,2,3],[4,5,6],[7,8,9]];//表达式可以嵌套
3.数组初始化的列表逗号之间的元素可以省略,这时省略的空位会填充值undefined。
var sparseArray = [1,,,,5];
4.对象初始化:
var p = {x:2.3,y:-1.2};
var q = {};
q.x = 2.3;
q.y = -1.2;//q的属性成员和p一样
——————————————————
js求对象初始化表达式的值得时候,对象表达式都会各自计算一次,并且他们不必包含常数值。
var p = {x:2.3,y:-1.2};
var q = {};
q.x = 2.3;
q.y = -1.2;//q的属性成员和p一样
var side = 1;
var square = {
"upperLeft":{x:p.x,y:p.y},'lowerRight':{x:p.x,y:p.y+side}
};
三.函数定义表达式
1.表达式的值是这个新定义的函数——函数直接量
var square = function (x) {//函数返回传入参数的平方值
return x * x;
}
四.属性访问表达式
1.运算得到一个对象属性或一个数组元素的值,2种形式:
expression.identifier//表达式指定对象,标识符指定需要访问的属性的名称————多使用
expression [expression]//指定要访问的属性的名称或代表要访问数组元素的索引
2.若计算结果是null或undefined,表达式会抛出一个类型错误异常,因为这两个值都不能包含任意属性
3.若对象表达式后跟随一对方括号,则会计算方括号内的表达式的值并将其转换成字符串。不论什么情况,如果命名的属性不存在,则整个属性访问表达式的值为undefined
五.调用表达式
1.定义:一种调用(或执行)函数或方法的语法表示
f(0)//括号内为参数 Math.max(x,y,z) a.sort()
2.步骤:计算函数表达式--计算参数表达式--得到一组参数值---实参的值被依次赋值给形参,这些形参是定义函数时指定的--执行函数体(若函数使用return返回,返回值是整个调用表达式的值。否则表达式的值为undefined)
3.如果表达式是一个属性访问表达式,则这个调用为“方法调用”
方法调用中执行函数体,作为属性访问主题的对象和数组是其调用方法内this的指向。但是不是所有方法的调用表达式都使用全局对象作为this的值
六.对象创建表达式
1.定义:创建一个对象并调用一个函数(这个函数是构造函数)初始化对象的属性。
对象创建表达式和函数调用类似,只在对象创建表达式前多一个new
new Object();
new Point(2,3);
一个对象创建表达式不传任何参数给构造函数,空圆括号可以省略
new Object
new Date;
七.运算符
1.js运算符有算术运算符,比较运算符,逻辑运算符,赋值运算符
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence记录了运算符优先级
2.操作数的个数,大多数是将两个表达式合并成一个稍复杂的表达式,即他们的操作数为2个(如?:)
3.操作数类型和结果类型
就是中的所有值不是真值就是假值,因此对于那些希望操作数是布尔型的操作符而言,他们的操作数可以是任意类型
4.左值:表达式只能出现在赋值运算符的左侧(变量,对象属性,数组)。自定义函数不能有返回左值
5.运算符的副作用
6.运算符优先级
7.运算符的结合性(一元操作符,赋值,三元条件运算符都是从右至左结合)
8.算术表达式(乘*除/加+减-求余%)——将操作数转换为数字再求积商余数和差。所有无法转换成数字的操作数都转换为NaN
如果操作数或转换结果为NaN,则算术运算的结果也是NaN
9.js中所有数字为浮点型。一个整数/整数 也是浮点数(和c语言不同)5/2=2.5
除数为0的结果为正无穷大或负无穷大,而0/0为NaN
10.取余数:第一个操作数除以第二个操作数的余数。结果的符号和第一个操作数一致
5%2=1,-5%2=-1
八.“+”运算符
1.一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始类型
用toString()法法转换
2.在进行对象到原始值的转换后,若其中一个是字符串,则另一个也会转换为字符串,然后进行字符串连接
1+2//加法
"1"+"2"//"12"字符串连接
"1"+2//"12"数字转换为字符串后进行字符串连接
1+{}//"1[object Object]":对象转换为字符串后进行字符串连接
true + true//2 布尔值转字符串后进行字符串连接
2+null//2:null转换为0后做加法
2+undefined//NaN undefined转换为NaN后做加法
3.一元算术运算符
一元加法+
把操作数转换为数字(或NaN),并返回这个转换后的数字。若操作数本身为数字,则直接返回这个数字
一元减法(-)同+
递增++
递减--
注:++x不总和x=x+1一样,“++”不进行字符串连接
x=“1“字符串,则++x的结果为2,而x+1是字符串“11”
4.位运算符
会将NaN,infinity,-infinity转换为0
有&(与),|(或),异或(^),非(~),左移(<<),右移(>>),无符号右移(>>>)
九.关系表达式
关系运算符用于测试两个值之间的关系(=><),根据关系是否存在而返回true或false
1.==和===
!=和!==是上边的取反
若两个操作数类型不同,‘’相等操作符也可能认为他们相等
若一个值为null,另一个undefined则他们相等
若一个是数字,一个字符串,先将字符串转换为数字,然后使用转换后的值比较
若一个为true,则将其转换为1再进行比较(false转换为0)
若一个值是对象,一个数字或字符串,则将对象转换为原始值,再比较。对象通过toString()或valueOf()转换为原始值。
js先尝试使用valueOf(),再使用toString(),除了日期类,日期类只使用toString
其他不同类型之间的比较均不相等
2. “1”==true 这个比较结果true
3.比较运算符
在对象转换为原始值后,若至少一个操作数不是字符串,则两个操作数都将转换为数字进行数值比较。
0和-0是相等的
infinity比其他任何数字都大(除本身),-infinity比其他任何数字都小(除本身)
若其中一个操作数是(或转换后是)NaN,则比较操作符总返回false
注意:字符串比较区分大小写,所有大写ASCII字母都 小于 小写的ASCII字母
如“Zoo” < “aardvark” 返回值为true
String.localCompare()
String.toLowerCase()
String.toUpperCase()
1+2 //3
"1"+"2" //"12"
"1"+2 //字符串链接,2转换为“2”,结果"12"
11<3//false
"11"<"3"//字符串比较 true
"11"<3//数字比较,"11"转换为11,false
"one" < 3 //数字比较,“one”转为NaN false
4. in运算符
作用:希望他的左操作数一个字符串或可以转换为字符串,希望他的右边是一个对象。
若右侧的对象有一个名为左操作数值得属性名,则表达式返回true
5. instanceof运算符
作用:希望左操作数是一个对象,右操作数标识对象的类。
若左侧的对象是右侧类的实例则表达式返回true否则返回false
js中对象的类是通过初始化他们的构造函数来定义因此instanceof的右操作数是一个函数
注意:所有的对象都是object的实例。
instanceof左操作数不是对象,返回false。右操作数不是函数则抛出一个类型错误异常
instanceof如何工作需要先学习“原型链”
十.逻辑表达式
&& , || ,!是对操作数进行布尔算术运算常与关系运算符配合使用
1.&& 全真为真
&&操作数不一定为布尔值(有些值可以做真值和假值,假值有false、null、undefined、0、-0、NaN和“”)
2.||逻辑或(一假 全假)
3.逻辑非(!)
十一.赋值表达式
1. “=” 给变量或属性赋值
j = k = 0;//三个变量初始化0,赋值的结合性从右向左
2. 带操作的赋值运算
十二.表达式计算
1. eval()
var foo = function (a) {
eval(a);
};
foo("return;");
2.全局eval()
十三.其他运算符
1.条件运算符(?:)——三元
x > 0 ? x : - x;
2.typeof运算符(一元,放在单个操作数前面)
(typeof value == "string") ? "'" + value + "'" : value
所有的对象和数组的typeof结果为object不是function
3.delete运算符
作用:删除对象属性或数组元素。delete作删除操作,不是用来返回一个值
4.void运算符(一元运算符)
操作数可以是任意类型
使用 忽略计算结果并返回undefined
在URL中,void让浏览器不必显示表达式的结果。
<a href="javascript:void window.open();">打开一个新窗口</a>
点击之后跳转到新的空白窗口
5.逗号运算符