JavaScript权威指南(第六版)-第4章 表达式和运算符

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

猜你喜欢

转载自blog.csdn.net/weixin_41056807/article/details/82596558