js 表达式和运算符

来源:互联网 发布:知乎手机版如何写文章 编辑:程序博客网 时间:2024/06/06 01:04

表达式是指能计算出值的任何可用程序单元——wiki
[觉得这句话怪怪的?没事反正一会儿一看就懂]
JavaScript的表达式和运算符都和c语言蜜汁相似

表达式分为1.原始表达式
2.对象和数组的初始化表达式
3.函数定义表达式
4.属性访问表达式
5.调用表达式
6.对象创建表达式
[接下来我们一个个的说]

1.原始表达式
原始表达式是表达式的最小单位,他们不再包含其他表达式
原始表达式 ①常量、直接量 1.数字 123
2.字符串“hello”
3.正则表达式/\d/
②关键字 true、false、null、this
③变量 x
undefined//全局变量,非关键字 与null的区别之一

2.数组,对象的初始化表达式(详细见第六章,第七章)
作用:创建新的数组和对象[ ],{ }

数组初始化表达式是通过一对方括号和其内由逗号隔开的列表构成的

var a=[1,2]var a= new Array(1,2)

数组初始化表达式中的元素初始化表达式也可以是数组初始化表达式(多元数组)

var a=[[1,2,3],[4,5,6],[7,8,9]]

数组直接量中的列表逗号之间的元素可以省略,这是省略的空位会冲值undefined
[1, , ,4] → [1,undefined,undefined,4]

对象初始化表达式是通过一对花括号和其内由逗号隔开的列表构成的

var  o={x:1,y: 2}   var o=new object();     o.x=1;     o.y=2;

可以嵌套
var a={b:{x:1},
c:{y:2}}

3.函数定义表达式
函数表达式定义一个js函数,表达式的值是这个新定义的函数

 var a=function(){...};//将函数表达式赋值给变量 (function(){...})

4.属性访问表达式
两种语法`

var o={x:1,y:2};     o.x;     o["x"];var a=[1,2,3];        a[1];

o.x看起来更方便,但是如果属性名称是一个保留字或者包含空格和标点符号,或者是
数字(对于数组来说),必须使用方括号的写法。

5.调用表达式
作用:调用一种(或执行)函数或方法

function a(){  alert(1);  }a();//执行函数Math.max(a,b,c)//调用函数

6.对象创建表达式(详见第九章)
作用:创建一个对象并调用一个函数(构造函数)初始化新对象的属性。

var a=new object();           var a=new a(2,3);           function girlFriend(){              var girlFriend  =  new Object();                 girlFriend.height=170;                 girlFriend.weight=90;                 return girlFriend;}           var  mygirlfriend=new girlFriend();mygirlfriend.height ;mygirlfriend.name="rin";mygirlfriend.name

如果一个对象创建表达式不需要传入任何参数的话,那么括号可以省略。
var a=new object(); var a=new object;
运算符
Js中的运算符用于算数表达式,比较表达式,逻辑表达式,赋值表达式等
JavaScript的运算符(p66)

按操作数的个数分为一元,二元,三元运算符这里写图片描述
Js运算符通常会根据需要对操作数进行类型转换
隐式转换https://www.cnblogs.com/chenmeng0818/p/5954215.html
“3”*”5” // 15 字符串→数值

运算符优先级
这里写图片描述

运算符的结合性
P66的表中标题为A的列说明了运算符的结合性。
L从左至右结合,运算的执行从左至右
R从右至左结合,运算的执行从右至左
[举两个例子就ok啦]

A=x-y-z →A=(x-y)-z        //从左至右a=b=c=d →a=(b=(c=d))     //从右至左

一元操作符,赋值和三元条件运算符都具有从右至左的结合性

-++a →   -(++a)Q=a?b:c?d:e?f:g →Q=a?b:(c?d:(e?f:g))

算术表达式
“+”运算符
当两个操作都是数字或者字符串时,计算结果显而易见。然而有些情况下,要进行必要的类型转换,运算符的行为以来于类型转换的结果。

1+1            //2"1"+"1"         //11 字符串拼接"1"+1           //11 数字转为字符串true+true        //2:布尔值转换为数字后做加法2+null           //2:null转换为0后做加法2+undefined     //NaN:undefined转化为NaN作加法

( ̄▽ ̄)~* 运算结果依赖于运算符的运算顺序

1+2+"helloWorld"     //3helloWorld1+(2+"helloWorld"//12helloWorld

“+”“-”正负(一元运算符)
操作数转换为数字或者NaN

+1     //1-true   //-1-undefined  //NaN

“++”“–”
a++
++a
A: a=5; b=++a; // 相当于a=a+1;b=a; 结果是a=6,b=6
B: a=5; b=a++; // 相当于b=a;a=a+1; 结果是a=6,b=5
所以书上有:
(1) 如果用前缀运算符对一个变量增1(减1),则在将该变量增1(减1)后,用新值在表达式中进行其他的运算。
(2) 如果用后缀运算符对一个变量增1(减1),则用该变量的原值在表达式中进行其他的运算后,再将该变量增1(减1)。

关系表达式
相等和不等运算符
== //相等 允许类型转换
=== //严格相等 检测两个数是否严格相等 没有任何的类型转换
具体规则(p75)
1==true //true
1===true //false

null===null //true
undefined===undefined //true

NaN和其他任何值都不相等的,包括它本身
NaN===NaN //false
通过x!==x来判断x是否为NaN,只有x为NaN时,表达式为true
-undefined !==-undefined //true

比较运算符
“> < >= <=”
比较操作符的操作数可能是任意类型。然而,只有数字和字符串才能真正执行比较操作。
那些不是数字和字符串的操作数都将进行类型转换。

转换规则
·对象转化成数字的时候会调用valueOf()方法, 如果该方法返回值非原始值, 那么回调用该对象的toString(), 把toString的返回值转化成数字, 如果toString()返回值还是非原始值,使用toString()的转换结果进行比较操作
·在对象转换为原始值后,若两个数都是字符串,那么依照字母表的顺序对两个字符串进行比较,字母表值组成这个字符串的16位Unicode字符的索引顺序(❤大写的ASCII码都小于小写的)
·在对象转换为原始值后,若至少有一个操作数不是字符串,那么两个操作数都将转换为数字进行比较。0和-0相等,Infinity大于任何数除了本身,-Infinity小于任何数除了本身。若其中一个数为NaN,那么比较操作符总返回false

11<3            //false"11"<"3"    //字符串的比较,true"11"<3        //数字的比较,false"one"<3       //数字的比较,one转换为NaN,false 

in运算符
in 运算符确定对象中是否有名为 property 的属性。它还确定属性是否为对象的原型链的一部分。

var a={x:1,y:1}"x" in a             //true"z" in a             //false"toString" in a  //true对象继承了toString方法Instanceof 运算符 instanceof 就是判断一个实例是否属于某种类型。function Foo(){} var foo = new Foo(); foo instanceof Foo    //true

instanceof 可以在继承关系中用来判断一个实例是否属于它的父类型

function Foo(){} var foo = new Foo(); foo instanceof Object   //true

逻辑表达式
逻辑与(&&)
两边条件都为true时,结果才为true;
如果有一个为false,结果就为false;
当第一个条件为false时,就不再判断后面的条件

逻辑与(||)
只要有一个条件为true时,结果就为true;
当两个条件都为false时,结果才为false;
当一个条件为true时,后面的条件不再判断;

逻辑非(!)
当条件为false时,结果为true;反之亦然。

其他运算符
条件运算符(?:)
2>1?Yes:no

typeof运算符
作用:返回一个用于标识表达式的数据类型的字符串。这里写图片描述
delete运算符
作用:删除

var a={x:1,y:1};delete a.x;"x"in a  //falsevar a=[1,2,3];delete a[2];2 in a;   //falsea.length  //3   数组长度并没有改变,尽管上一行代码删除了这个元素,但事实上没有修a数组的长度仍然为3(留下了一个洞)

void运算符
也是不经常用的运算符
void是一元运算符,它出现在操作数之前,操作数可以是任意类型,操作数会照常计算,但忽略计算结果并返回undefined。由于void会忽略操作数的值,因此在操作数具有副作用的时候使用void来让程序更具语义
(人话:不管是什么,就只管返回undefined)
void 0 //undefined

【作用一】替代undefined

  由于undefined并不是一个关键字,其在IE8-浏览器中会被重写,在高版本函数作用域中也会被重写;所以可以用void 0 来替换undefined

【作用二】客户端URL

  这个运算符最常用在客户端URL——javascript:URL中,在URL中可以写带有副作用的表达式,而void则让浏览器不必显示这个表达式的计算结果。例如,经常在HTML代码中的<a>标签里使用void运算符

【作用三】阻止默认事件

阻止默认事件的方式是给事件置返回值false

<a href="#" onclick="f();return false;">文字</a><a href="javascript:void(f())">文字</a>

逗号运算符
少见

var a=(1,2,3); 

逗号运算符的常见用法是在for循环的增量表达式中使用

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

在每次通过循环的结尾时,for语句只允许单个表达式被执行。逗号运算符允许将多个表达式视为单个表达式,因此这两个变量都递增。

原创粉丝点击