权威指南学习心得之运算符和表达式

1、数组

数组直接量中的列表逗号之间的元素可以忽略,这是省略的空位自动填充值undefined,元素列表结尾处可以留下单个逗号,这时并不会创建一个新的值undefined

2、操作符

属性访问和函数调用排在最高级

一元操作符、赋值、三元条件运算符都具有从右到左的结合特性。

+ 加法运算符的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,则另外一个操作数也转换为字符串,加法将进行字符串的连接操作。如果两个操作数都不是类字符串,那么将进行算术加法运算

1、如果其中一个操作数为对象,则对象会遵循对象到原始值的转换规则转换为原始类值:日期对象通过toString()方法进行转换,其他对象则通过valueOf()方法进行转换(如果valueOf能返回一个原始值的话),由于多数对象不具有可用的valueOf方法,因此它们通过toString()方法进行转换。

2、在进行对象到原始值的转换后,如果其中一个操作数是字符串的话,则另一个操作数也转换为字符串,然后进行字符串连接

3、否则两个操作数都进行数字转换(或者NaN),然后进行加法操作

1+2 //3

"1"+"2" //"12"

1+"2" //"12"

1+{} //"1[object object]"

true+true //2

2+null //2,null转化为0 

2+undefined //NaN undefined转化为NaN后相加

== 相等 可以进行类型转换 对象只能等于对象本身,与其他任何对象不相等

===严格相等 不进行类型转换 

1、如果两个类型不相同,则它们不相等

2、如果两个值都是null或者都是undefined,则它们不相等

3、如果两个值都是false或者true,则它们相等

4、如果一个值为NaN,或者两个值都是NaN,则它们不相等,NaN与其他任何值都不相等,包括它自身,可以通过x!==x来判断NaN,只有x为NaN值,这个表达式的值才为true

5、如果两个数都是数字且数值相等,则它们相等,如果一个为0,两一个为-0,则它们相等

6、如果两个值都为字符串,且所含的对应位上的16位数完全相等,则它们相等,如果它们的长度或内容不同,则它们不相等,可以通过String.localeCompare()提供了另外一种比较字符串的方法

7、如果两个引用值指向同一对象,数组或者函数,则它们是相等的,否则不相等

三、==的比较

1、如果两个数的类型相等,则和上面的严格相等的比较规则一样,如果严格相等,则它们相等,如果严格不相等,则它们不相等

2、如果两个操作数类型不相等

如果一个是null,另外一个是undefined,则它们相等

如果一个操作数是数字,另外一个是字符串,先将字符串转换为数字,再进行比较

如果一直操作数为true,则将其转换为1再比较,如果一个操作数为false,则将其转化为0再比较

如果一个值为对象,两个一个值为数字或者字符串,则用转换规则将对象转换为原始值,然后再进行比较,javascript内置对象将尝试用valueOf,在尝试用toString,除了日期类,日期类只用toString转换

"1"==true//true

比较运算符

1、如果操作数为对象,则按照转换规则转换为原始值:如果valueOf返回一个原始值,则直接使用这个原始值,否者使用toString的转换结果进行比较

2、在对象转换为原始值后,如果两个操作数都是字符串,则依照字母表的顺序进行比较

3,在转换为原始值后,如果至少一个操作数不是字符串,那么两个数都转换为数字进行比较,0与-0是相等的,Infinity比任何数都要大(除了本身),-Infinity比任何数都要小(除了本身),如果一个操作数是NaN,那总是返回false

+偏爱字符串,如果其中一个操作数是字符串的话,则进行字符串连接操作,而比较运算符偏爱数字,只有两个操作数都是字符串的话,才进行字符串比较

11<3 //false

"11"<"3" //true

"11"<3 //false

"one"<3 //one转换为NaN,返回false

in 运算符

in运算符希望它的左操作数是一个字符串或者可以转换为字符串,希望它的右操作数是一个对象,如果右侧的对象用一个名为左操作数值的属性名,则返回true

var point={x:1,y:2};
console.log("x" in point);//true
console.log("z" in point);//false
console.log("toString" in point); //true

var data=[7,8,9];

console.log("0" in data); //true
console.log(1 in data); //true
console.log(3 in data); //false

instanceof 运算符

希望左操作数是对象,右操作数是函数,如果左边是不是对象,则返回false,如果右边不是函数,则抛出错误

如果左边的对象是右边类的实例,则返回true,否则返回false

var d=new Date();

console.log(d instanceof Date);//true
console.log(d instanceof Object);//true
console.log(d instanceof Number);//false

var a=[1,2,3];

console.log(a instanceof Array);//true
console.log(a instanceof Object);//true
console.log(a instanceof RegExp);//false

所有的对象都是Object的实例,当通过instanceof判断一个对象是否是一个类的实例,这个判断也包含对父类的检测。如果对象的原型链包含右边类,则返回true

逻辑运算符

&&

假值:false null 0 -0 undefined "" NaN,其余的值包括对象都是真值

运算符首先计算&&左侧的表达式,如果计算结果是假值,那么整个表达式的结果一定也是假值,因此&&这时简单的返回左操作数的值,而并不会对右操作数进行计算。当左操作数是真值时,&&运算符将计算有操作数的值并将其返回作为整个表达式的计算结果

var o={x:1};
var p=null;
console.log(o&&o.x);//1  o是真值,返回o.x
console.log(p&&p.x);//null p是假值,直接返回,而不去计算p.x

||

首先会计算第一个操作数的值,就是说首先计算左侧的表达式,如果计算结果为真值,那么返回这个真值,否则再计算第二个操作数的值,并返回这个表达式的结果。

主要用来在一组备选值中选出真值

var p=p||{};

首先将操作数转换为布尔值,然后求反,所以它总是返回true或者false,可以通过两次非运算符得到一个值的布尔值:!!x.

三元运算符

可以是任意类型;第一操作数当作布尔值,如果是真值,那么将计算第二个操作数,并返回计算结果;否则第一个操作数是假值,那么将计算第三个操作数,并返回计算结果

typeof 返回操作类型的字符串

delete运算符

var o={x:1,y:2};
delete o.x;

"x" in o; //false


var a=[7,8,9];
delete a[2];//删除数组元素
console.log(2 in a);//false
console.log(a.length);//3
console.log(a[2]);//undefined

delete 希望他的操作数是一个左值,如果它不是左值,,那么delete将不进行任何操作同时返回true,否则,delete将试图删除这个指定的左值,如果删除成功,delete将返回true,然而并不是所有

的属性都可以删除,一些内置核心和客户端属性是不能删除的,用户通过var语句声明的变量不能删除,同样,通过function语句定义的函数和函数参数也不能删除

左值:变量或者对象属性

原文地址:https://www.cnblogs.com/yhf286/p/5036183.html