javascript运算符与表达式

时间:2022-05-28 10:32:27

表达式

表达式是关键字、运算符、变量以及文字的组合,用来生成字符串、数字或对象。一个表达式可以完成计算、处理字符、调用函数、或者验证数据等操作。

表达式的值是表达式运算的结果,常量表达式的值就是常量本身,变量表达式的值则是变量引用的值。

在实际编程中,可以使用运算数和运算符建立复杂的表达式,运算数是一个表达式内的变量和常量,运算符是表达式中用来处理运算数的各种符号。

常量表达式:"skycobra"

变量表达式:example

赋值表达式:stringExample = “小郭”

运算符的优先级

如果表达式中存在多个运算符,那么它们总是按照一定的顺序被执行,表达式中运算符的执行顺序被称为运算符的优先级。

使用运算符()可以改变默认的运算顺序,因为括号运算符的优先级高于其他运算符的优先级。

 赋值操作的优先级非常低,几乎总是最后才被执行

运算符的类型

不同运算符对其处理的运算数存在类型要求,例如不能将两个由非数字字符组成的字符串进行乘法运算。

javascript会在运算过程中,按需要自动转换运算数的类型,例如由数字组成的字符串在进行乘法运算时将自动转换成数字。

运算数的类型不一定与表达式的结果相同,例如比较表达式中的运算数往往不是布尔型数据,而返回结果总是布尔型数据。

根据运算数的个数,可以将运算符分为三种类型:一元运算符、二元运算符和三元运算符。

一元运算符是指只需要一个运算数参与运算的运算符,一元运算符的典型应用是取反运算。!1 !!1

二元运算符需要两个运算数参与运算,javascrpt中的大部分运算符都是二元运算符,比如加法运算符、比较运算符等等。

还支持三元运算符?:,这种运算符比较特殊,它可以将三个表达式合并为一个复杂的表达式。

赋值运算符 (=)

给变量赋值

result = expression

说明

= 运算符和其他运算符一样,除了把值赋给变量外,使用它的表达式还有一个值。这就意味着可以象下面这样把赋值操作连起来写:

j = k = l = 0;

执行完该例子语句后,j、k、和 l 的值都等于零。

因为(=)被定义为一个运算符,所以可以将它运用于更复杂的表达式。如:

(a=b)==0  //先给a赋值b,再检测a的值是否为0.

赋值运算符的结合性是从右到左的,因此可以这样用:

a=b=c=d=100    //给多个变量赋同一个值

加法赋值运算符 (+=)

将变量值与表达式值相加,并将和赋给该变量。

result += expression

加法运算符 (+)

将数字表达式的值加到另一数字表达式上,或连接两个字符串。

result = expression1 + expression2

如果“+”(加号)运算符表达式中一个是字符串,而另一个不是,则另一个会被自动转换为字符串;

如果加号运算符中一个运算数为对象,则这个对象会被转化为可以进行加法运算的数字或可以进行连接运算的字符串,这一转化是通过调用对象的valueof()或tostring()方法来实现的。

加号运算符有将参数转化为数字的功能,如果不能转化为数字则返回NaN

如 var a=”100”;   var b=+a  此时b的值为数字100

+运算符用于数字或字符串时,并不一定就都会转化成字符串进行连接,如:

var a=1+2+”hello”    //结果为3hello

var b=”hello”+1+2    //结果为hello12

产生这种情况的原因是 + 运算符是从左到右进行运算的。

减法赋值运算符 (-=)

从变量值中减去表达式值,并将结果赋给该变量。

result -= expression

说明

使用 -= 运算符与使用下面的语句是等效的:

result = result - expression

减法运算符 (-)

从一个表达式的值中减去另一个表达式的值,只有一个表达式时取其相反数。

语法 1

result = number1 - number2

语法 2

-number

说明

在语法 1 中,- 运算符是算术减法运算符,用来获得两个数值之间的差。在语法 2 中,- 运算符被用作一元取负运算符,用来指出一个表达式的负值。

对于语法 2,和所有一元运算符一样,表达式按照下面的规则来求值:

  • 如果应用于 undefinednull 表达式,则会产生一个运行时错误。
  • 对象被转换为字符串。
  • 如果可能,则字符串被转换为数值。如果不能,则会产生一个运行时错误。
  • Boolean 值被当作数值(如果是 false 则为 0,如果是 true 则为 1)。

该运算符被用来产生数值。 在语法 2 中,如果生成的数值不是零,则 result 与生成的数值颠倒符号后是相等的。如果生成的数值是零,则 result 是零。

如果“-”减法运算符的运算数不是数字,那么系统会自动把它们转化为数字。

也就是说加号运算数会被优先转化为字符串,而减号运算数会被优先转化为数字。以此类推,只能进行数字运算的运算符的运算数都将被转化为数字。(比较运算符也会优先转化为数字进行比较)

递增 (++) 和递减 (--) 运算符

变量值递增一或递减一。

语法 1

result = ++variable
result = --variable
result = variable++

result = variable--

语法 2

++variable
--variable
variable++

variable--

说明

递增和递减运算符,是修改存在变量中的值的快捷方式。包含其中一个这种运算符的表达式的值,依赖于该运算符是在变量前面还是在变量后面:

var j, k;
k = 2;
j = ++k;

因为递增发生在表达式被求值前,所以值 3 赋给了 j

和下面的例子对照:

var j, k;
k = 2;
j = k++;

在此,因为递增发生在表达式被求值后,所以值 2 赋给了 j。

递增运算符(++),只能运用于变量,如果用在变量前则为前递增运算符,如果用于变量后面则为后递增运算符。前递增运算符会用递增后的值进行计算,而后递增运算符用递增前的值进行运算,如:

var a=1

var b= a++  //此时b的值为1,因为b的值是a递增前的值。但a的值已经为2了,

var a=1

var b=++a  //此时b的值为2,a的值也为2

递减运算符(--)的用法与递增运算符的用法相同

乘法赋值运算符 (*=)

变量值乘以表达式值,并将结果赋给该变量。

result *= expression

说明

使用 *= 运算符和使用下面的语句是等效的:

result = result * expression

乘法运算符 (*)

两个表达式的值相乘。

result = number1*number2

 

除法赋值运算符 (/=)

变量值除以表达式值,并将结果赋给该变量。

result /= expression

说明

使用 /= 运算符和使用下面的语句是等效的:

result = result / expression

除法运算符 (/)

将两个表达式的值相除。

result = number1 / number2

逗号运算符 (,)

顺序执行两个表达式。

expression1, expression2

说明

, 运算符使它两边的表达式以从左到右的顺序被执行,并获得右边表达式的值。, 运算符最普通的用途是在 for 循环的递增表达式中使用。例如:

for (i = 0; i < 10; i++, j++)
{
   k = i + j;
}

每次通过循环的末端时, for 语句只允许单个表达式被执行。, 运算符被用来允许多个表达式被当作单个表达式,从而规避该限制。

取余赋值运算符 (%=)

变量值除以表达式值,并将余数赋给变量。

result %= expression

说明

使用 %= 运算符与使用下面的语句是等效的:

result = result % expression

取余运算符 (%)

一个表达式的值除以另一个表达式的值,返回余数。

result = number1 % number2

说明

取余(或余数)运算符用 number1 除以 number2 (把浮点数四舍五入为整数),然后只返回余数作为 result。例如,在下面的表达式中,A (即 result)等于 5。

A = 19 % 6.7

比较运算符

返回表示比较结果的 Boolean 值。

expression1 comparisonoperator expression2

说明

比较字符串时,JScript 使用字符串表达式的 Unicode 字符值。

下面说明根据 expression1 和 expression2 的类型和值,不同组的运算符是如何作用的:

关系运算符(<、>、<=、>=)

  • 试图将 expression1 和 expression2 都转换为数字。
  • 如果两表达式均为字符串,则按字典序进行字符串比较。
  • 如果其中一个表达式为 NaN,返回 false
  • 负零等于正零。
  • 负无穷小于包括其本身在内的任何数。
  • 正无穷大于包括其本身在内的任何数。

比较运算符如大于、小于等只能对数字或字符串进行比较,不是数字或字符串类型的,将被转化为数字或字符串类型。如果同时存在字符串和数字,则字符串优先转化为数字,如不能转化为数字,则转化为NaN,此时表达式最后结果为false。如果对象可以转化为数字或字符串,则它会被优先转化为数字。如果运算数都不能被转化为数字或字符串,则结果为false。如果运算数中有一个为NaN, 或被转化为了NaN,则表达式的结果总是为false.当比较两个字符串时,是将逐个字符进行比较的,按照的是字符在Unicode编码集中的数字,因此字母的大小写也会对比较结果产生影响。

 

相等运算符 (==、!=)

    - 如果两表达式的类型不同,则试图将它们转换为字符串、数字或 Boolean 量。
    - NaN 与包括其本身在内的任何值都不相等。
    - 负零等于正零。
    - null 与 null 和 undefined 相等。
    - 相同的字符串、数值上相等的数字、相同的对象、相同的 Boolean 值或者(当类型不同时)能被强制转化为上述情况之一,均被认为是相等的。
    - 其他比较均被认为是不相等的。
 

关于(==),要想使等式成立,需满足的条件是:

- 等式两边类型不同,但经过自动转化类型后的值相同,转化时如果有一边为数字,则另一边的非数字类型会优先转化为数字类型;布尔值始终是转化为数字进行比较的,不管等式两边中有没有数字类型,true转化为1,false转化为0。对象也会被转化。

 - null==undefined
    

恒等运算符 (===、!==)

除了不进行类型转换,并且类型必须相同以外,这些运算符与相等运算符的作用是一样的。

关于(===),要想使等式成立,需满足的条件是:

    -       等式两边值相同,类型也相同
    -       如果等式两边是引用类型的变量,如数组、对象、函数,则要保证两边引用的是同一个对象,否则,即使是两个单独的完全相同的对象也不会完全相等。
    - 
    -      等式两边的值都是null或undefined,但如果是NaN就不会相等

条件(三目)运算符 (?:)

根据条件执行两个语句中的其中一个。

test ?语句:语句2

参数

test

任何Boolean 表达式。

语句1

当 test 是 true 时执行的语句。可以是复合语句

语句2

当 test 是 false 时执行的语句。可以是复合语句。

说明

?: 运算符是 if...else 语句的快捷方式。它通常被用作较大表达式的一部分,而在此处使用 if...else 语句是不协调的。例如:

var now = new Date();
var greeting = "Good" + ((now.getHours() > 17) ? " evening." : " day.");

在该例子中,如果是 6pm 以后,则创建一个包含 "Good evening." 的字符串。使用 if...else 语句的等效代码如下:

var now = new Date();
var greeting = "Good";
if (now.getHours() > 17)
   greeting += " evening.";else   greeting += " day.";

delete 运算符

从对象中删除一个属性,或从数组中删除一个元素。

delete expression

expression 参数是一个有效的 JScript 表达式,通常是一个属性名或数组元素。

说明

如果 expression 的结果是一个对象,且在 expression 中指定的属性存在,而该对象又不允许它被删除,则返回 false

在所有其他情况下,返回 true

delete是一个一元运算符,用来删除运算数指定的对象属性、数组元素或变量,如果删除成功返回true,删除失败则返回false。并不是所有的属性和变量都可以删除,比如用var声明的变量就不能删除,内部的核心属性和客户端的属性也不能删除。要注意的是,用delete删除一个不存在的属性时(或者说它的运算数不是属性、数组元素或变量时),将返回true。

delete影响的只是属性或变量名,并不会删除属性或变量引用的对象(如果该属性或变量是一个引用类型时)

 

 in 运算符

测试对象中是否存在该属性。

result = propertyinobject

参数

result

必选项。任意变量

property

必选项。相当于字符串表达式的一个表达式。

object

必选项。任意对象。

说明

in 操作检查对象中是否有名为 property 的属性。也可以检查对象的原型,以便知道该属性是否为原型链的一部分

in运算符要求其左边的运算数是一个字符串或者可以被转化为字符串,右边的运算数是一个对象或数组,如果左边的值是右边对象的一个属性名,则返回true.

new 运算符

创建一个新对象。

new constructor[(arguments)]

参数

constructor

必选项。对象的构造函数。如果构造函数没有参数,则可以省略圆括号。

arguments

可选项。任意传递给新对象构造函数的参数。

说明

new 运算符执行下面的任务:

  • 创建一个没有成员的对象。
  • 为那个对象调用构造函数,传递一个指针给新创建的对象作为 this 指针。
  • 然后构造函数根据传递给它的参数初始化该对象。

示例

下面这些是有效的 new 运算符的用法例子。

my_object = new Object;
my_array = new Array();
my_date = new Date("Jan 5 1996");

typeof 运算符

返回一个用来表示表达式的数据类型的字符串。

typeof[()expression[]] ;

expression 参数是需要查找类型信息的任意表达式

说明

typeof 运算符把类型信息当作字符串返回。typeof 返回值有六种可能: "number," "string," "boolean," "object," "function," 和 "undefined."

typeof 语法中的圆括号是可选项。

typeof 也是一个运算符,用于返回运算数的类型,typeof也可以用括号把运算数括起来。typeof对对象和数组返回的都是object,因此它只在用来区分对象和原始数据类型时才有用。

instanceof 运算符

返回一个 Boolean 值,指出对象是否是特定的一个实例。

result = object instanceof class

说明

如果 objectclass 的一个实例,则 instanceof 运算符返回

true。如果 object 不是指定类的一个实例,或者 objectnull,则返回 false

示例

下面的例子举例说明了 instanceof 运算符的用法。

function objTest(obj){
   var i, t, s = "";   //
创建变量。
   t = new Array();   // 创建一个数组。
   t["Date"] = Date;   // 填充数组。
   t["Object"] = Object;   
t["Array"] = Array;
      
for (i in t)
{         
if (obj instanceof t[i])   //
检查 obj 的类。
     {
         s += "obj is an instance of " + i + "\n";         
}
else{            
s += "obj is not an instance of " + i + "\n";
         
}
   
}
   
return(s);   //
返回字符串。
} var obj = new Date();response.write(objTest(obj));

intanceof运算符要求其左边的运算数是一个对象,右边的运算数是对象类的名字,如果运算符左边的对象是右边类的一个实例,则返回true。在js中,对象类是由构造函数定义的,所以右边的运算数应该是一个构造函数的名字。注意,js中所有对象都是Object类的实例。

void 运算符

避免表达式返回值。

void expression

expression 参数是任意有效的 JScript 表达式

说明

void 运算符对表达式求值,并返回 undefined。在希望求表达式的值,但又不希望脚本的剩余部分看见这个结果时,该运算符最有用。