Skip to content

Latest commit

 

History

History
122 lines (101 loc) · 4.66 KB

操作符&类型转换.md

File metadata and controls

122 lines (101 loc) · 4.66 KB

操作符 & 类型转换

将这两个内容放在一起,是因为操作符在执行过程中会有很多的隐式类型转换出现。


相等操作符

  ECMAScript 提供两组操作符:相等(==)全等(===)

相等和不相等

  相等操作符和不相等操作符都会先 转换操作数,然后再比较他们的相等性。在转换时,遵循下列基本规则:

  • 如果有一个操作数是 布尔值,在比较前将其转换为数值
  • 如果一个操作数是字符串,另一个操作数是数值,则将字符串转换为数值
  • 如果一个操作数是对象,另一个不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则比较
  • null 和 undefined 是相等的
  • 在比较相等性之前,不能将 null 和 undefined 转换为其他任何值
  • 如果有一个操作符是 NaN,则相等操作符返回 false,不相等操作符返回 true;即使两个操作数都是 NaN,也一样
  • 如果两个操作数都是对象,则比较它们是否指向同一个对象

全等和不全等

  比较前不转换操作数,其余和相等没有差别


关系操作符

  关系操作符包括小于(<),大于(>),小于等于(<=),大于等于(>=)。当关系操作符的操作数使用的非数值时,也要进行数据转换。

  • 如果两个操作数都是数值,则进行数值比较
  • 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值
  • 如果一个操作数是数值,将另一个操作数转换为一个数值,进行数值比较
  • 如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按前面的规则比较。如果对象没有valueOf()方法,调用toString()方法,并用得到的结果根据前面的规则比较
  • 如果一个操作数是布尔值,将其转换为数值

乘除操作符

  乘除操作符(*)和(/),计算时会用Number()转型函数将非数值的操作数转换为数值


加号操作符

  • 数字 + 对象, 优先调用对象的 valueOf() ,再调用 toString()
  • 数字 + boolean/null = 数字
  • 数字 + undefined == NaN
  • 字符串 + (任何)== 转为字符串后拼接
var obj1 = {
    a:1,
    b:2,
    toString:function(){
	return "this is a toString function";
    },
    valueOf:function(){
	return "this is a valueOf function";
    }
};
console.log(1+obj1);            //1this is a valueOf function
console.log(1+obj1.valueOf());  //1this is a valueOf function
console.log(1+obj1.toString()); //1this is a toString function

布尔操作符

逻辑与 (&&)

第一个操作数 第二个操作数 返回值
对象 / 第二个操作数
对象 对象 第二个操作数
/ 对象 第一个操作数求值为 true 时返回第二个操作数
null null null
NaN NaN NaN
undefined undefined undefined

逻辑或 (||)

第一个操作数 第二个操作数 返回值
对象 / 第一个操作数
对象 对象 第一个操作数
/ 对象 第一个操作数求值为 false 时返回第二个操作数
null null null
NaN NaN NaN
undefined undefined undefined

Boolean()

转换规则:

数据类型 转换为 true 的值 转换为 false 的值
Boolean true false
String 任何非空字符串 ""
Number 任何非零数字值 0
Object 任何对象 null
Undefined / undefined

Number()

转换规则:

  • Boolean 值:转换为 0 和 1
  • 数字值:简单地传入和返回
  • null:返回 0
  • undefined:返回 NaN
  • 字符串:遵循以下规则
    • 如果字符串中只包含数字(包括符号),转换为十进制数值(会忽略前导 0)
    • 如果字符串包括有效的浮点格式,如 "1.1",则将其转换为对应的浮点数值(忽略前导 0)
    • 如果字符串包含有效的十六进制格式,如 "0xf",则将其转换为大小相同的十进制整数
    • 如果字符串为空,转换为 0
    • 如果字符串包含上述格式外的字符,将其转换为 NaN
  • 对象:调用对象的valueOf()方法,然后按前面的规则转换;如果转换结果为 NaN,再调用对象的toString()方法,然后按前面的规则转换