JavaScript之隐式类型转换

布尔操做符(!、&&、||)

当使用 条件判断语句(if...else) 以及 布尔操做符(!、&&、||) 时,会调用Boolean()进行隐式类型转换编码

  • 转换为false的有:0, null, undefined, NaN, '', false
  • 其他都为true([], {}为true)
![];  //  !Boolean([]);   ------------>    false     
!2;   // false

!null; //  !Boolean(null);   ------------>  true
!undefined;  // true
!0;  // true

if([]) consolo.log('true');   //  if(Boolean([])) ... ----------->  true  

 

乘/除法操做符(*、/)

  • 如有一个操做数为NaN,则结果为NaN
  • 若其中一个操做数不为数字,则调用Number()将其转换为数值
2 * '5';   // 10
2 * '5a';  // 2 * Number('5a')  -------->  2 * NaN  ------------>   NaN

 

加法操做符(+)

  • 如有一个操做数为NaN,结果为NaN
  • 如有一个操做数为字符串,则将另外一个数转换为字符串而后拼接
  • 如有一个操做数为对象,则调用对象的toString方法再执行上一步
// num: 数值操做数   str: 字符串  obj: 对象
num + 非字符串操做数(NaN/undefined/null/false/true) = num + Number(非字符串操做数)
num + str = 'numstr';        // 1 + 2 + '3' = '33'

str + NaN = 'strNaN';        //  '1' + NaN = '1NaN'
str + null = 'strnull';      // '1' + null = '1null'
str + true = 'strture';

obj + num = obj.toString() + num;  // Math + 123 = '[object Math]123'
obj + str = obj.toString() + str;  // Math + '123' = '[object Math]123'

 

减法操做符(-)

  • 若一个操做数为字符串、null、undefined、布尔值,就调用Number()将其转换为数值再运算
  • 若一个操做数为对象则调用该对象valueOf(),没有valueOf()则调用toString()
1 - '2' = -1;
1 - '123a' = NaN; // 1 - Numer('123a')
1 - Math = NaN;   // 1 - Math.valueOf()
1 - true = 0;

 

关系操做符(>、<、>=、<=)

  • 与NaN比较都会返回false
  • 若两个操做数都为字符串,则比较字符串的编码值
  • 如有一个操做数为数值,则对另外一个操做数用Number()转换
  • 如有一个操做数为对象,则调用该对象valueOf(),没有valueOf()则调用toString()
4 > '2';  // true
4 > '2a'; // false
4 > Math; // false
4 > true; // true

'ab' > 'a' // true

 

相等操做符(==、!=)

  • 字符串、布尔类型和数值比较,现将前者用Number()转换为数值
  • 若一个操做数是对象另外一个不是,则调用该对象valueOf(),没有valueOf()则调用toString()
  • 若两个操做数都是对象,则比较它们是否是同一个对象(地址是否相同)
  • null和undefined是相等的
  • null和undefined不会转换成任何值
  • 任何数都不等于NaN,包括NaN本身
// true
123 == '123';
1 == true;
'123' == new String(123);
123 == new String(123);
null == undefined;

// false
null == 0;
2 == true;
new String(123) == new String(123); 

 

全等操做符(===、!==)

全等操做符不会转换操做数spa

123 ===  '123';  // false
null === undefined; // false

 

总结

你能说说下面结果是什么以及缘由吗?code

[] == 0;  // 1.??
{} == 0;  // 2.??
0 == {};  // 3.??
[] == {};  // 4.??
  1. true
  2. true
  3. error: Uncaught SyntaxError: Unexpected token ==
  4. false

根据相等操做符的规定,当一个操做数为对象另外一个不是时,会调用对象的valueOf()对象

[] == 0;  --------->  [].valueOf()  ----->  ''  -----> Number('')  ----> 0

当两个操做数都为对象则会比较它们是否指向同一块区域,而[]和{}是两个独立的对象,因此为false。blog

相关文章
相关标签/搜索