表达式是Javascript中的一个短语,Javascript解释器计算结果。程序中最简单的表达式是变量。变量名也是一个简单表达式,它的值是赋值给变量的值。



复杂表达式是由简单表达式组成的,例如数组访问表达式由表示数组、方括号和整数表达式的表达式组成,它们组成的新表达式的结果是数组特定位置的元素值。

一个数字调用表达式由一个函数对象的表达式和0个多参数表达式组成。

这一章(Ben Wen)将解释所有Javascript操作符,它还解释了不涉及操作符(如访问数组元素和函数调用)的表达式,它们的语法和编程风格非常类似于C语言。

1。元素的表达

最简单的表达式是原始表达式,原始表达式是表达式的最小单位——它们不包含其他表达式。Javascript中的原始表达式包含常量或直接量。关键字和变量。

直接量是直接出现在程序中的常量值:

复制代码代码如下所示:

1.23直接数字信号

hello

/ / / /模式的正则表达式的文字



Javascript中的一些保留字构成了原来的表达式。

复制代码代码如下所示:

真的/布尔值:真的

假/假

返回一个值:空的

此返回当前对象



通过学习第三章,不同于其他关键字,这不是常量,他在程序的不同部分返回不同的值。这个关键字经常出现在面向对象编程中,它返回网格方法的对象。

最后,第三种原始表达式是变量。

复制代码代码如下所示:

返回变量i i/i的值

返回和和的值。

未定义的是一个全局变量,null是不同的,它不是关键字。



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

对象和数组的初始化是一个新创建的对象和数组,它有时也被称为该对象的直接量和数组直接量。然而,不像布尔直接量,原来他们都没有表情,因为他们的成员或元素包含的子表达式。

数组的初始化表达式语法非常简单,我们开始

数组的初始化表达式由一组圆括号和一个由逗号分隔的列表组成,而初始化结果是一个新创建的数组。数组的元素是逗号分隔表达式的值。

{一个空数组;空白的{以数组表示,没有任何元素。

{ 1 + + 2 + 4 }。数组中有两个元素,前3个,第二个是7。

数组初始化表达式中的元素初始化表达式可以是数组初始化表达式,也就是说表达式可以嵌套。

复制代码代码如下所示:

VaR垫= { {1,2,3},{ } { } } 4、5、6、7、8、9;



数组中直接列表中的元素之间的元素可以省略,空间将填充未定义的:

复制代码代码如下所示:

var = { 1,},5 }



4个元素是在未定义的直接量的结尾处的逗号。当未创建具有未定义值的新元素时,数组。

对象初始化表达式与数组初始化表达式非常相似,但方括号由括号代替,每个单词表达式包含一个属性名和一个非冒号作为前缀。

复制代码代码如下所示:

对象属性的两个成员:var 2.1:3

var;{ /空对象

q.x = 2.1;q.y = 3;的 / / Q属性成员为P一样



对象的直接数量也可以嵌套,例如

复制代码代码如下所示:

VaR,= {左:{ x 2,y 3 },

右:x:4,y:5 }



当Javascript计算对象的初始化表达式的值,分别计算表达式的对象,他们不需要包含常量值:他们可以是任何Javascript表达式。同样,在对象直接量的属性的名称可以是一个字符串,而不是一个标识符。(这是非常有用的当线只能用保留字或一些非法标识符的属性的名称)。

复制代码代码如下所示:

var侧= 1;

VaR的平方= {左):{ x:P.,Y:p.y },

权利:{ x:P. +侧,Y:p.y +侧} }



第六十七章还将讨论对象和数组的初始化表达式。

三.函数表达式

函数定义的表达式定义了一个Javascript函数,表达式的值是这个新定义的函数,函数定义的表达式可以函数直接量,函数表达式可毕竟叫函数直接量、对象初始化表达式,也称为对象直接量。一个典型的函数定义表达式包含关键字的功能,其次是一对圆括号,括号内,并用逗号分隔的列表。该列表包含0个或多个标识符(参数名称)。

函数(x){返回x×};

函数定义表达式还可以包含函数的名称。函数也可以由函数语句来定义,而不是函数表达式。更多的内容将在第八章中描述。

4。属性访问表达式

属性访问表达式计算属性的访问一个对象或数组element.javascript定义了两个方法的价值。

复制代码代码如下所示:

表达。鉴别符

表达式{ }



第一个表达式是一个表达式,后面是一个周期和标识符。表达式指定对象,标识符指定要访问的属性。

第二章是方括号的使用,方括号是表达式(此方法适用于对象和数组),第二个表达式指定要访问的属性的明传或要访问的数组元素的索引。

复制代码代码如下所示:

的OX / / = > 1表达O X属性

该o.y.z / / = > 3表达o.y Z属性

Ox1的对象O的x属性

1个表达式的元素为4,索引为1。

{ 2{1{ 6,表达式为{ 2 },元素为1

0×1的x属性:表达式{ 0 }



无论哪种形式的财产是用来访问的一种表达,在表达。和{)会首先计算。如果结果是空的或未定义,表达式将抛出类型错误的因为这两个值不包含任何属性。如果操作结果是一个对象或数组,Javascript会将它转换为一个对象(3章6节)

虽然写作。标识符是简单的,重要的是要注意,这种方法只适用于属性名称,你想访问是合法的标识符。你需要知道要访问的属性的名称。如果属性名是一个保留字,或者包含空间和标点符号,这是一个数(数组),然后把写作必须使用。当属性名称是由运营商而不是固定值,得到的值,它必须用方括号。(6章,2, 1节)

5。运输的表达

调用(调用Javascript中的表达)表达的是一个叫语法表示(或执行)的函数或方法。它从一个功能性的表达,它指的是函数的调用,函数表达式如下一对圆括号,括号是一个列表,以逗号分隔的参数的参数。可以有0个或一个以上的。

f(0)是一个函数表达式:0是一个参数表达式。

math.max(x,y,z) / / math.max是函数;X,Y,和Z参数

A.sort() / / a.sort()是一个函数,它没有参数。

当表达式被要求进行评估时,首先计算函数表达式,然后计算参数表达式,得到一组参数值。如果函数表达式的值不是可调用对象,则抛出类型错误异常。然后,参数的值依次分配给参数。这些参数是在函数被定义时定义的。接下来,函数体被执行。如果函数使用返回语句返回值,那么返回值是整个调用表达式的值。否则,调用表达式的值称为未定义值。函数调用。在第八章中详细描述了操作的细节,包括参数表达式的数量和函数定义中的参数个数。

任何调用表达式在括号和左括号之前都包含一对表达式。如果表达式是一个属性访问表达式,这叫叫的方法invication。当函数体是一个方法调用执行,对象和数组访问的主题作为一个属性是其调用的方法在这一点。这一特征使函数(其对象名称的方法)可以在面向对象的编程范式称其宿主对象(将在第九章更多相关内容)。

6。对象创建表达式

对象创建表达式(对象创建表达式)创建一个对象并调用函数(构造函数)来初始化对象的属性。对象创建表达式非常类似于函数调用表达式,但只有一个关键字new:对象创建表达式之前。

新对象()

新点(2,3)

如果对象创建表达式不需要向构造函数导入任何参数,则可以省略括号。9章将解释构造函数的更多细节。

新的对象

新的起点



7。运营商概况

Javascript中的运算符用于表表达式、比较表达式、逻辑表达式、赋值表达式等。

请注意,大多数运营商的标点符号表示,如删除和建议。它们都是重要的运算符符号或运算符,运算符与规则运算符相同,它们的语法非常简洁和全面。

下标运算符的优先级是有序的,前面的运算符优先级高于运算符的运算符优先级,由水平华丰分隔的运算符具有不同的优先级。

一是经营者的相关性。

l从左到右或R(从右到左)

标题n的列表表示操作数的数目。

表示预期操作数的类型和运算符的结果类型(在 符号之后)





操作人员
操作

n
类型


+ +
增量前/后
R

语句数



Anterior与后路复位
R

语句数




R

NUM NUM


+
转换为数字
R

NUM NUM


~
点点滴滴
R

整数int



逻辑非
R

布尔布尔


删除
删除属性
R

语句-布尔


类型
检测操作类型
R

任何- Str


无效
返回未定义的值
R

任何未定义


*,%,%
除法的余数
l

努姆到努姆


+,—
增加、减少
l

努姆到努姆


+
字符串连接
l

STR



左移
l

int,int到int



右移位
l

int,int到int


> > >
无符号右移


l


int,int到int


>。
比较数字顺序
l

努姆、努姆为bool


>。
比较字母表中的顺序
l

STR,STR为bool


实例
测试对象类
l

obj,功能为bool



存在测试属性吗
l

STR,obj为bool


= =
判断是平等的
l

任何、任何布尔


!=
不平等的判断
l

任何、任何布尔


= = =
判断身份
l

任何、任何布尔


!= =
非同一性判断
l

任何、任何布尔



一点一点地
l

int,int到int


^
异或
l

int,int到int


|
通过位置或
l

int,int到int



逻辑和
l

任何,任何


| |
逻辑或
l

任何,任何



条件运算符
R

Bool,任何,任何


=
变量赋值或对象属性赋值
R

Lval,任何




**

| ^ > > > > = = =

操作和分配
R

Lval,任何





忽略第一个操作数,

返回第二个操作数。

l

任何,任何





i操作数的数目。

运算符可以按操作数的数目来分类。

Javascript中的大多数操作符都是两个元素操作符,它们将两个表达式合并成一个稍微复杂的表达式。

Javascript还支持一些单元素运算符,它们将一个表达式转换成另一个稍微复杂的表达式。表达式x中的 运算符是一个单元素运算符。

Javascript支持三元素操作符:条件操作符:它将三个表达式组合成表达式。

II。操作数类型和结果类型

有些操作符可以用于任何数据类型,但仍然希望它们操作指定类型的数据。

三是左值

表中的赋值运算符和其他一些运营商希望他们的类型语句的操作数,左值是一个古老的名词,它意味着表达只能出现在赋值运算符的左边。在Javascript、变量、对象属性或数组元素是一个左值,ECMAscript规范允许的范围内的内置函数返回左值,但不能定义函数返回一个左值。

的四优先。操作人员

在上表中,运营商进行排序,从高到低的优先级和一组在每个水平分区运营商具有相同优先级的运算符的优先级,是一种控制操作的执行顺序优先的高执行(桌面)的经营者总是高于低优先级(表的底部)算子。

请看下面的表达式

w = x * y * z;

乘法运算符*比加法+具有更高的优先级,所以首先执行乘法运算,因为赋值运算符=具有最低优先级,所以赋值是在右边表达式计算结果之后完成的。

运算符的优先级可以用括号括起来。

w =(x + y)* z;

需要注意的是,属性访问表达式和调用表达式的优先级高于表中的所有运算符。

Typeof我的。功能{X}(Y)

虽然类型是最高优先级的操作符,类型也执行后两属性访问和调用的函数。

事实上,如果您真的不确定您使用的运算符优先级,最简单的方法是使用括号强制执行操作顺序。一些重要的规则需要记住:乘法和除法都比加法和减法要高,赋值的优先级很低,通常是最后一次。

对iiiiii组合。运营商

在这个表中,标题为A的列解释了操作符的结核,L指的是左到右的组合,r是左到右的组合,结节指定了具有相同优先级的多个运算符表达式中的运算顺序。

例如,减法操作的基础是从左到右的组合执行。

复制代码代码如下所示:

w = x - y - Z



像这样的代码:

复制代码代码如下所示:

w =((x - y)z)



另一方面,以下表达式:

复制代码代码如下所示:

x=y;

w = x = y = z;

q = AB:cd;



它和这个代码是一样的

复制代码代码如下所示:

x=(y);

w =(x =(y = z));

q = AB(CD:(EF:G))



因为一元运算符、赋值和三元素条件运算符具有从右到左的组合。

iiiiiii。操作顺序

运营商指定的顺序分配公式运算优先级和结合,但不指定在单词expressions.javascript计算运算顺序总是严格计算表达式中从左到右的顺序,例如:

在表达W = x + y * z,w表达将首先计算,则X,Y,和Z的计算,然后对Y和Z的值相乘,和x的值增加,其表达。最后,W是指变量或属性。加括号的表情变化之间的关系和乘法,任务。但从左到右的顺序不会改变。

8。算术表达式

本节介绍算术运算的运算符,操作数的算术运算。乘法、除法和减法运算符非常简单。加法运算是一个单独的部分,因为加法运算符可以操作字符串的连接,它的类型转换有点特殊。

基本的算术运算符*,/,%,+,-,除了+之外,其他运营商也特别简单,只在必要的时候,运营商被转换成数字,然后产品商,剩余(弹性模量)和区别。所有的操作不能被转换成数字将转换为NaN值。如果操作数(或转换的结果)是NaN值、算术运算也是南

运营商/二操作数除以第一个操作数,如果你使用的编程语言,区分整数和浮点数之间。当一个整数除以一个整数,期望的结果是一个整数。在Javascript中所有的数字都是浮点型,和分裂的结果,也是浮点操作型。例如,5 / 2的结果是2.5,不是2。操作的结果与除数0是正无穷大和负无穷大,0 / 0的结果为NaN。这些计算都是错的。

运算符%是第一个操作数到第二个操作数的模型,换句话说,第一个操作数除以第二个操作鼠标的余数。结果的符号与第一个操作鼠标(分隔)符号一致。例如,5%个2的结果是1,5% - 2是1。

剩余运算符的操作数通常是整数,但它们也适用于浮点数,6.5%的结果是0.2。(0.1999999999999997)。(2.1)

我+运算符

这两个元素加法运算符+可以添加两个数字,也可以做字符串连接操作:

复制代码代码如下所示:

1 + 2 3

hello++,

1+212



当两个操作数都是数字或字符串时,结果是明显的。但是,对于其他情况,则需要执行某些必要类型的转换。运算符的行为取决于类型转换的结果:

如果一个操作数是一个对象,该对象将关注对象的转换规则为原班值的原始值(参见3节、8节、3节)。日期执行转换对象的toString()方法,和其他对象执行转换通过值()方法。如果值()方法返回一个值,因为大多数对象不可用的值()的方法,他们将通过ToString进行捕捉和交换()方法

在将对象转换为原始值之后,如果操作鼠标中的一个是字符串,则其他操作数也将转换为字符串。然后执行字符串连接。

否则,两个操作数将转换为数字(或南),然后添加。

下面是一些例子

复制代码代码如下所示:

1 + 2 3加

1+212连接字符串

在字符串连接字符串中添加1 + 212

1{ { 1 {对象对象}:对象被转换为连接字符串的字符串。

将2个布尔值转换为数字加法。

将2 + NULL 2 = NULL添加到0

添加2 +未定义的



最后,我们要特别注意它,当加运算与字符串一起使用时,应考虑加法对运算顺序的影响,即运算结果取决于运算符的操作顺序,如

复制代码代码如下所示:

1 + 2 + 3进行BmIce / / = >

1 +(2 + BmIce)= > 12bmice



II。一元运算符

一元运算符作用于单个操作数,并产生新的价值。在Javascript,一元运算符具有高优先级和右结合。本节描述一元运算符(+,-,+ +和-),必要时,他们将被转换为数字的操作。需要注意的是+一元运算和二元算子,

一个元素

单元素加法器将操作数转换为数字(或南),并在转换后返回数字。如果操作数本身是一个数字,则直接返回数字。

一元减法—

当符号是一个单元素运算符时,它根据需要将操作数转换为数字,然后更改操作结果的符号。

增量+ +

增量++运算符对操作数(+ 1)操作,操作一个左值(变量、数组元素或属性),操作者将操作数的数量。数量则增加了1,而增值1后被重新分配给一个变量,数组元素,或者一个对象的属性。

它取决于操作数位置上的返回值增加+操作。

当运算符在操作数之前,称为预递增运算符,它增量地计算操作数的数目并返回计算值。

当操作员的操作数,则称之为后增量(后增加)算子,并将操作数,但返回到增值的增量computation.as

var i = 1,j + i/i和j均为2。

var i = 1,j = i +;;i是2,j是1。

注意,它们的意图是+ x,x + x + 1的总和是完全相同的,从不使用字符串运算符+连接操作,它将操作数转换为1。如果x是一个1 + x的字符串,结果是数字2,而x + 1是字符串11

递减和增量操作是相同的,它将操作数转换为数组,然后将其减为1。

三位运算符

位运算符可以在较低的水平,用数表示的二进制数据进行点位操作。虽然他们不是传统的纯数学运算,他们也分为算术运算符,因为他们的行为对数值型操作和返回的数据。这些运营商在Javascript中是不常见的。(这里是不是由百度机制的详细描述)

9。关系表达式

本节描述Javascript关系操作符,关系操作符用于测试两个值之间的关系(属性,小于或等于…),根据是否有关系并返回真与假。表达式总是返回一个布尔值,通常是在while语句或for语句(第五章)中使用关系表达式来控制程序的执行流。

接下来的几节将讲述等式和不等式,比较运算符,和其他的两个其他关系在Javascript和实例

i相等和不等运算符

=和=运算符用于比较两个值是相等的,两个运算符允许任何类型的运算符。否则,返回false也被称为严格相等运算符(有时称为标识运算符)。它用于检测两个操作数是否严格相等,=运算符=相等运算符,用于检测两个操作数相等,这里的定义相等,允许类型转换。

您应该理解操作符之间的区别(赋值、等价、相同),并在编程中小心使用,为了减少混淆,应该调用得到赋值,或者等于等于。

=和!运算符规则,逆运算符是非布尔运算符,,!我们将!=,!=不等于,不是严格相等

Javascript的对象比较的参考比较,没有比较的对象的值,等于本身,但这不等于人与对象。如果两个对象具有相同的属性,该属性的名称和值,他们仍然是不平等的,相应的位置的数组元素都是平等的,两个数组是不平等的。

严格的等号运算符 计算操作数第一值,然后比较这两个值,比较过程没有任何类型转换。

如果两个值类型不希望相同,则它们不相等。

如果两个值都是null或未定义的,则它们不相等。

如果这两个值都是布尔真或假,它们是相等的。

如果其中一个值是南,或者两个值是南,它们是不相等的,并且南值和其他值都不相等,包括它自己的值。

如果这两个值是数值相等的,它们是相等的。如果一个值是0,一个值是0,那么它们是相等的。

如果这两个值是字符串,在相应的16位数字(参阅3章2节)是完全平等的,他们都是平等的。如果他们的长度或内容不同的是,他们是不相等的。两个字符串可以作为相同的显示字符,但不具有编码16位值,Javascript和Unicode不标准的转换,使字符串比较=和= =运算符的结果是不平等的,string.localecompare第三部分()提供了另一种方式来比较字符串。

如果两个引用值指向相同的对象、数组或函数,则它们相等。如果指向不同的对象,则它们是不相等的,尽管这两个对象具有完全相同的属性。

相等运算符和恒等运算符相似,但相等运算符不严格.如果两个数字不是同一类型,则等效运算符将尝试进行某种类型的转换,然后比较它。

如果两种运算类型相同,则与前一等效运算符的比较规则相同,如果严格相等,则比较结果相等,如果它们不严格相等,则比较结果不相等。

如果两种不同类型的操作,它们会认为相等运算符==等于:

如果一个类型是null,一个是未定义的,那么它们是相等的。

如果一个值是一个数字,另一个是字符串,则字符串首先被转换为一个数字,然后转换的值用于比较它。

如果某个值为true,则将其转换为1,然后进行比较,如果某个值为false,则将其转换为0比较。

如果一个值是一个对象的值是一个数字或字符串,然后3章的转换规则,8部分和3部分是用来改变对象的原始值,然后比较的对象转换为原始值的toString()方法或valueOf()方法,在Javascript语言的第一次尝试使用价值核心的内置类(),然后尝试使用toString(),随着日期类的异常,Date类只能转换的toString()。那些不在Javascript语言的核心都是由在实施中定义的方法转换为原始值。

其他类型的比较不相等。

这里是一个小例子,等于判断。

1=真的

这个表达式的结果是真实的,这表明一个完全不同的价值比较的结果是相等的。布尔值true首先被转换成数字1,然后进行比较,然后串1也将被转换成数字1,因为这两个数字的值同样,这样的结果是真的。

II。比较运算符

小于(<)

如果第一个操作数小于第二个操作数,则操作的结果为true,否则为false。

小于或等于(<)

大于(>)

大于或等于(>)

…(不详细介绍意思)

比较运算符的操作数可以是任意类型。但是,只有数字和字符串可以实际执行比较运算符,所以那些不是数字和字符串的操作数将被转换为类型。类型转换的规则如下所示:

如果操作数是一个对象,则根据3节8、第3节、节锁,将转换规则描述为原始值。如果值()返回一个初始值,然后使用原来的值。否则,使用toString()转换结果比较。

转换到原始值后,如果两个操作数都是字符串,则两个字符串将按字母顺序进行比较。这里提到的字母顺序是构成两个字符串的16位Unicode字符的索引顺序。

在对象转换为原来的值,如果至少一个操作数不是一个字符串,然后将两个操作数的数量相比是数字0和0是相等的,在该墙的任何数量的其他数大(除该本身),而该是比任何数(除本身。)如果一个操作数(或转换后)是楠,然后比较总是返回false

对于数字和字符串运算符,加运算符和比较运算符的行为是不同的。前者更喜欢字符串,如果它的一个操作数是字符串,则需要字符串连接操作。只有当两个操作数是字符串时,比较运算符才更青睐数字。

复制代码代码如下所示:

1 + 2,加3,结果是3。

1 + 2字符串连接,结果为12

1 + 2 2连接字符串,转换为2

11 < 3 /数字,结果为真

11< 3字符串比较,结果是正确的

11 < 3数字/ 11,11,结果是真的

一个< 3 / /数字,一转换为南,结果是虚警



要注意的最后一件事是,运营商不依靠等价算子和严格的操作规则平等比较操作符时是平等的。相反,在小于或等于运算符的简单且不大于操作等于操作。只有一个例外,当数操作数(折算后)是南,4比较操作将返回假。

Iii.in operator

运算符希望它的左操作数是一个字符串或可以转换成字符串,并且期望它的右边是一个对象。如果右边的对象有一个名为左操作值的属性名,那么表达式返回为true。

复制代码代码如下所示:

var点{ { {

X:1,

Y:1

定义对象

点=中的x 该对象有一个名为x的属性。

点false中的z被命名为z的属性。

说明点 / / = >真实对象继承toString方法

var数据= { 7, 8, 8 }

数据真数组中的0包含0

1在数据中,真正的数字转换为字符串

3在数据 / / = > FASE没有索引3



iiii.instanceof算子

这是经营者要左操作符是一个对象,和右操作数表示的对象的类。如果左边的对象是类的实例,该表达式返回true;返回假。第九章将描述。Javascript对象的类的构造函数初始化定义。这样,instanceof右操作数应该是一个函数,例如:

复制代码代码如下所示:

新的(日期);

D是日期; / /真正的计算结果,D(日期)创建

D是对象/ /真实的计算结果,所有的对象实例的对象

D是数 / /计算结果为false,D是不是一个数字对象

var a = {1,2,3} / /文字数组创建数组

一个是阵真 / /计算结果为数组

所有数组的实例对象 / /真实的对象

一个正则表达式 / /假实例数组不是一个正则表达式



需要注意的是,所有的对象实例的对象很重要。当一个对象是类的一个实例,通过实例的磁盘,也叫做父类(基类)的检测。如果对是左边的对象不是一个对象,是返回FALSE。如果正确的操作是不是一个函数,该类错误的异常被抛出。

为了理解instanceof运算符的作品,首先要了解原型链和原型链Javascript的继承机制,这将在6章,2节和2节。

为了计算O是F的表达式,Javascript f.prototyoe等第一个计算,查询,如果在原型链中找到,那么F是O(或F类)的实例,然后返回真。另一方面,假

10。逻辑表达式

逻辑运算符

一、逻辑和

操作符可以从三个不同的层次理解,最简单的是一层理解,当操作数是布尔值,两个布尔布尔运算和(或)运算时,只有第一个操作数和第二个操作数返回true时才为真。如果一个操作数是false。它返回false。

用于连接两个关系表达式。

x = 0 = 0;;在x和y中只有0,它返回true。

关系总是返回true或false,所以使用时,它返回true或false,关系运算符的优先级比(和| |)要高,因此这样的表达式可以写没有括号加。

操作数不一定是布尔值。回想起来,一些值可以被视为真正的价值观和错误的价值观。(在3, 3节中,虚假的价值观是:假空定义0-0南和理解第二层是可能执行布尔和(或)真值和错误值的操作。如果两个操作数真正的价值,那么真正的返回值;否则,至少一个操作数是一个虚假的价值。在Javascript,当任何布尔值是用于表达的语句将把它作为一个真值或错误值,所以它并不总是返回true和false,这没多大关系。

需要注意的是,上面提到的操作符返回true和false值,但它并没有说明真正值或false值是什么。因此,我们将进一步讨论第三个层次的理解。经营者首先计算左操作数的值在表达式的左边第一个计算,如果结果为false,则整个表达式的结果是false值,以便仅返回左操作的价值,而不是业务上右边数的计算。

复制代码代码如下所示:

var { { { {

X:1

};

var = null;

O OX; / / = > 1:1:0是真值,那么返回值是OX

/ / = P P.零:P是一个错误的值,所以它不返回,和P.计算



这对于理解不能计算正确操作数的情况非常重要。在上面的代码中,变量p的值是null,如果P.x计算,它将抛出一个异常错误。因此,P.只计算如果P是一个真值(null或未定义)。

行为有时称为短路),我们经常看到许多代码使用这一行的条件执行代码。

复制代码代码如下所示:

如果(a = b)(停止);只能停止(传输)

(= = b)(停止); / /同上。



总的来说,这是非常谨慎的正确表达式有副作用(分配,递增,递减,和函数调用表达式)。因为副作用这些表达式的执行取决于左鼠标操作的结果。

虽然我们可以根据第二级和第三级的理解来执行一些复杂的表达式运算,但在大多数情况下,我们只使用布尔运算来计算真值和假值。

II。(逻辑或| |)

| | 操作符的两个操作数的布尔和(或)操作。如果其中一个是真的,真正的价值回归,和两个操作数是错误的价值观,和假值返回。

虽然| |经营者大多只做简单的逻辑或(OR)操作,等等,也有一些更复杂的行为,它首先计算第一个操作数的值,即首先计算表达式的左侧,如果结果是真的,则返回真值,否则,再计算二值。

同样的,正确的操作数应该包含一些副作用。除非显式使用右侧有副作用的表达式,否则不能计算右侧的表达式。

这个操作符最常用的方法是从一组表达式中选择第一个真值表达式。

复制代码代码如下所示:

/ /如果max_width的定义,然后用它直接指定一个值的选择对象找到max_width

如果未定义它,则是使用常量的写模。

Var Max = max_width preferences.max_windth | | | | 500;



这种用法通常是函数的函数,用于提供参数的默认值。

复制代码代码如下所示:

属性的成功复制到p,并返回到p。

函数拷贝(o,p){

P = P | | { }; / /如果参数P不引入任何对象,创建一个新的对象使用。

主体逻辑功能



逻辑非(!)

!运算符是一元运算符,它放在单个操作数之前,其目的是反转操作数的布尔值。

!总是返回true和false,并且可以通过使用两个逻辑非操作来获得一个值的布尔值!x,参考文献第三,第第八节第二部分)

您具有高度优先权,并且与操作数紧密结合,如果您想要p q,则需要括号!(p q)下列代码:

复制代码代码如下所示:

!(P,Q)= P Q | |!!

!(P Q | |)= Q!P!



这两个表达式总是为p和q的任意值设置的。

11。赋值表达式

Javascript使用 操作符将变量或属性赋值给一个值,例如:

复制代码代码如下所示:

i=0个变量将被设置为0。

OX = 1 / / O对象属性x设置为1



我希望=操作符的左操作数是一个左值:变量或对象的属性(或数组),它可以在任何类型的任意值的正确运行。赋值表达式的值是右操作数的值,赋值表达式的副作用是,右操作数值赋给左边的变量或对象的属性。这样,变量的属性和对象的后续引用将获得价值。

虽然赋值表达式的值非常简单,但有时可以看到一些复杂表达式包含赋值表达式:

复制代码代码如下所示:

(a = b = 0)



如果是的话,应该清楚地知道和 差异!应该指出,=非常低的优先级。当一个句子在一个较长的表达式中使用时,必须添加括号以确保正确的操作顺序。

赋值运算符的组合是从右到左。也就是说,在一个表达式中有多个赋值操作符,操作的顺序也是从右到左。因此,可以通过以下方式分配多个变量。

复制代码代码如下所示:

I = 0;0初始化三个变量



分配作业的操作:

除了常规的赋值操作之外,Javascript还支持其他赋值操作符。这些操作符将赋值操作连接到其他操作符。提供更有效的计算方法。例如,++运算符是加法运算符和赋值的实现,下面的表达式:

salaes_tax总=;

等价于以下表达式

总=总+ salaes_tax

运算符+可以应用于一个数字或字符串,如果操作是数字的,它将执行加法和赋值操作;如果一个字符串,他执行连接字符串和赋值。

这种类型的操作符也包含在之前

运算符示例相当于

a = b = a = a + b

A = B = = A-B

*



一% = a =一% b

<

>

> >

a = b = a = ab

| =一个| = B =一个| B

A = B = A = B

在大多数情况下,表达式是

OP = b

这里的OP代表一个运算符,相当于

a运算放大器

在第一行中,表达式a被计算过一次,在第二行中,表达式a被计算了两次。

只有当A包含有副作用的表达式,比如函数调用和赋值操作时,它们才是等价的。

复制代码代码如下所示:

数据{ ++ } = 2;

数据{数据+ { } + } * 2



12。表达式的计算

像许多解释性的语言,Javascript也可以解释由Javascript源代码串运行并生成value.javascript完成这项工作通过全局函数eval()。

eval(3 + 2) / / = > 5

在源代码的字符串动态判断是一个强大的语言特性,它几乎不需要运用到实践中。如果你使用eval(),你应该仔细考虑一下。

以下价格降低eval(),并用它严格的方式介绍了两。从代码优化的角度来看,这两种方法对原始代码的影响最小。

I.eval(eval()是一个函数,但由于它一直被视为一个算子。)

eval()只有一个参数,如果传入的参数不是一个字符串,它返回的参数直接。如果参数是一个字符串,它将编译为Javascript字符串(解析),并把语法错误(查询)如果编译失败。如果编译成功,它开始执行代码并返回最后一个表达式或语句中的值的字符串。If the last expression has no statement or value, it will return to undefined at last.If a string throws an exception, this exception passes the call to eval ()

关于显示最重要的()是使用可变范围的环境来称呼它,即它寻找变量的值和本地代码范围定义新的变量和函数和代码的操作。如果一个函数定义了一个局部变量,然后调用eval(X),它返回局部变量的值。如果它调用eval(x = 1),它将改变局部变量的值。如果函数调用eval(var y = 3;),宣布一个新的局部变量,y在同一这样,一个函数可以用下面的代码声明一个局部功能:

eval(函数f(x){ return 1;} );

如果eval()是前级代码调用。当然,它作为一个全局变量和全局函数。

II。全球eval()

eval()改变了局部变量的能力,这是一个大问题,Javascript优化器。然而,作为一种权宜之计,Javascript征收未优化eval(),行功能。但是当脚本定义的别名,使用一个名字来称呼它,如何在Javascript解释器的工作吗它简化了Javascript解释器,ecmascipt3标准规定,不允许任何翻译的别名给eval()。如果eval()调用另一个别名,这evalerror抛出异常。

事实上,大多数的实现都不做。当调用eval()的一个别名,以它的字符串作为顶层的全局代码,执行代码可以定义全局变量和全局函数,执行的代码可以定义全局变量和全局函数,或赋值给全局变量然而,在主函数的局部变量不能被修改或修改,所以这并不影响函数内的代码优化。

ecmascript5反对使用evalerror和规范的行为()。直接评价,当使用不合格等名称来调用eval()函数,它在它的上下文范围的一个分支。其他间接调用使用全局函数的上下文范围。你可以不读,写,和定义的地方变量和函数。下面有一个例子代码:

复制代码代码如下所示:

无功geval = eval; / /使用别名调用eval的全球评估

var全局

y全局;这两个全局变量

功能(F){ / /功能在当地eval执行

本地变量

eval(x = 'changed;); / / EVAL直接改变局部变量

返回本地变量后返回

}

函数(G){ / /这个函数执行的全球评估

定义本地变量

Geval(Y = 'changed;); / /间接改变局部变量的值

返回y并没有改变本地变量。

}

console.log(F)、(x); / /改变局部变量,局部输出改变了全球

console.log(G),(Y); / /更改全局变量、局部globalchanged输出



13。其他运营商。

Javascript支持多种其他操作符。

条件运算符(:)

条件运算符是Javascript中唯一的三个元素运算符。操作符通常写,这个操作符有三个操作数,在操作数之前的第二个中的第一个操作数和。在第三个操作数之后,

x 0;x;

一个条件操作符的操作数可以是任何类型。第一个操作数是一个布尔值,如果这是真的,那么第二操作数将被计算并返回结果,如果第一个值的操作数是一个错误的价值观,第三个操作数将被计算,返回计算的结果之一。第二个和第三个操作数都是计算的,它是不可能同时做这两件事。事实上,使用if语句也能达到同样的效果(5.4.1),和运营商只提供一种形式的缩写。这是一个典型的使用场景:确定一个变量定义。如果定义了,就使用它。如果没有定义,则使用默认值。

复制代码代码如下所示:

grett =hello+(用户名用户名:三);



下面的代码是等价的,但上面的代码更简洁。

复制代码代码如下所示:

grett =你好;

如果(用户名)

grett =用户名;

其他的

grett + 三



Ii.typeof()操作符

Typeof是一个单一的运营商,摆在面前的一个操作数,操作数可以是任何类型,并且返回值表示一个字符串的操作类型。

复制代码代码如下所示:

X型X __

未定义的__ 未定义

空__对象

真假__布尔

任何数量或南__

任何字符串串__

任何功能__功能

任何的内容对象(非功能性)__对象

从其执行的字符串__编译任何宿主对象,但不是定义布尔数字符串



类型最常见的用法是用这样的表情

(typeof值= =字符串)+价值+价值;

typeof运算符也是开关语句(5.4.3)是非常有用的,类型的操作可以在括号内。这使得类型看起来像一个函数的名字,不是一个关键词。

Typeof(我)



iii.delete算子

删除是一个原始运算符,用于删除对象的属性或数组的元素。如赋值、增加、减少运算符。删除也有副作用。它用于删除操作。它不用于返回值。

复制代码代码如下所示:

var { { { {

X:1,

Y:2

}

删除OX;

O中的x;

var = { 1, 2, 3 };

删除一个{ 2 };数组删除中的最后一个元素

2在false 2中;数组中的元素不存在。

a.length; / / = > 3,注意数组长度没有改变,虽然最后一排的元素删除,但删除操作留下了一个洞。事实上,数组的长度是不能修改的,所以一个长度仍为3



需要注意的是,删除或删除数组元素不仅设置未定义的值,而且属性在删除属性时不存在。关于删除删除,仍有一些严格的模式。需要学习的人自己也会做一些实验。下面是一些例子。

复制代码代码如下所示:

var:x:1,y:2 };

删除OX; / /删除一个对象的属性,返回true

类OX; / /返回的属性不存在,不确定

删除OX; / /删除属性不存在,返回true;

删除o;不能被var关键字删除以声明变量,返回false

删除1; / /参数不是一个左值。

这个= x = 1;定义一个属性到全局,没有var的使用。

删除X;尝试删除它,在非严格模式下返回true。

在严格模式下,下一次抛出,然后使用删除此代替

X; / /运行时出错,没有定义的X



6章和第三节也对删除进行了探讨。

的iii.void算子。

虚函数是一元运算符,操作数在操作数出现之前可以是任意类型。这个操作符不常用:操作数将像往常一样计算,但忽略运算结果,返回到未定义。由于空值忽略了操作数的值,当操作数有副作用时使用空程序更为有意义。

使用客户端URL的副作用最常用的表达式。在URL和空白中,允许浏览器不显示表达式中表达式的结果。

复制代码代码如下所示:

新的



Iiii。逗号运算符。

逗号运算符是一个双元素运算符,它的操作数可以是任意类型。它首先计算左操作数,然后计算正确的操作数。

复制代码代码如下所示:

i=0,j=1,k=2;



它基本上相当于下面的代码

i = 0;j=1;k=2;

会计总是左边的表达式,但计算结果却被忽略了。也就是说,只有左表达式有副作用,然后使用逗号操作使代码更加开放。逗号运算符最常见的场景是for循环,通常有多个循环变量。

复制代码代码如下所示:

for for循环中的第一个逗号是var语句的一部分。

逗号是逗号操作符

它将在语句(for循环)中为(两个表达式)

对于(var i = 0,j=10;i < j;i + +,j -);

console.log(i+j);