JS类型转换

Clloz · · 233次浏览 ·

前言

JS是弱类型动态语言,不同类型的数据也能进行运算,那么掌握不同数据类型进行运算时的规则就非常重要了。

逻辑运算

逻辑非

不进行任何运算的单一操作数可用逻辑非来倒推

  • 如果操作数是一个对象,返回 false
  • 如果操作数是一个空字符串,返回 true
  • 如果操作数是一个非空字符串,返回 false
  • 如果操作数是0,返回 true
  • 如果操作数是任意非0数值(包括 Infinity ),返回 false
  • 如果操作数是 null,返回 true
  • 如果操作数是 NaN,发挥 true
  • 如果操作数是 undefined,返回 true
alert(!false);     //true
alert(!"blue");    //false
alert(!0);         //true
alert(!NaN);       //true
alert(!"");        //true
alert(!12345);     //false

逻辑非操作符也可以用于将一个值转换为与其对应的布尔值,同时使用两个逻辑非操作符实际上就会模拟 Boolean() 转型函数的行为。

逻辑与

  • 如果第一个操作数是对象,则返回第二个操作数;
  • 如果第二个操作数是对象,则石油在第一个操作数的求职结果为 true 的情况下才会返回该对象;
  • 如果两个操作数都是对象,则返回第二个操作数;
  • 如果第一个操作数是 null,则返回 null
  • 如果第一个操作数是 NaN,则返回 NaN
  • 如果第一个操作数是 undefined,则返回 undefined
  • 逻辑与的操作,只要第一个操作数能转换为 false那么第二个操作数不会计算。
/* error */
var a = true;
var result= (a && b);       //变量b没有声明,并且a为true,所以解释器会继续对b求值而导致报错
alert(result)

/* success */
var a = false;
var result= (a && b);       //变量虽然b没有声明,但是a为false,解释器不会对b求值
alert(result)

逻辑或

逻辑或和逻辑与相似。

算数运算符

乘法

  • 如果两个操作数都是数值,执行常规的乘法计算,如果成绩超过了 ECMAScript 数值的表示范围,返回 Infinity-Infinity
  • 如果有一个操作数是 NaN,则结果是 NaN
  • 如果是 Infinity0 相乘,则结果是 NaN
  • 如果是 Infinity 与非0数值相乘,则结果是 Infinity-Infinity,取决于有符号操作数的符号;
  • 如果是 InfinityInfinity 相乘,则结果是 Infinity
  • 如果有一个擦作书不是数值,则在后台调用 Number() 将其转换为数值,然后在应用上面的规则。

除法

除法的处理方式与乘法类似,有两点不同:

  • 如果是零被零除,结果是 NaN
  • 如果是非零的优先数被零除,则结果是 Infinity-Infinity,取决于有符号操作数的符号;

加法

  • 如果有一个操作数是 NaN,则结果是 NaN
  • 如果是 InfinityInfinity,则结果是 Infinity
  • 如果是 -Infinity-Infinity,结果是 -Infinity
  • 如果是 Infinity-Infinity,结果是 NaN
  • 如果是 +0+0,结果是+0
  • 如果是 -0-0,结果是 -0
  • 如果是 +0-0,结果是 +0
  • 如果两个操作数都是字符串,则将第二个操作数与第一个操作数凭借起来;
  • 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后在将两个字符串拼接起来;
  • 如果有一个操作数是对象、数值、布尔值则调用他们的 toString() 方法取得相应的字符串值,对于 undefinednull,则调用 String() 函数转化为字符串。
var result = 5 + 5;
console.log(result);  //10

var result = 5 + '5';
console.log(result);  //55

var a = function () {
  console.log(1);
}
var b = 1;
console.log(a + b);   //function () {console.log(1);}1

var a = true;
var b = 1;
console.log(a + b);   //2

var a = false;
var b = 1;
console.log(a + b);   //1

减法

减法的处理方式和加法类似,只是字符串、布尔值、nullundefined的处理方式不同:

  • 如果有一个操作数是字符串、布尔值、nullundefined,则现在后台调用 Number() 函数将其转换为数值,然后再根据上面加法类似的规则进行减法计算,如果转换的结果是 NaN 则计算结果就是 NaN
  • 如果有一个操作数是对象,则调用对象的 valueOf() 方法来取得表示该对象的数值。如果得到的值是 NaN 则剑法的结果就是 NaN。如果对象没有 valueOf() 方法,则调用其 toString() 方法并将得到的字符串转换为数值。
var a = function () {
    console.log(1);
}
var b = 1;
console.log(a - b);   //NaN

var a = true;
var b = 1;
console.log(a - b);   //0

var a = false;
var b = 1;
console.log(a - b);   //-1

var a = undefined;
var b = 1;
console.log(a - b);   //NaN

var a = null;
var b = 1;
console.log(a - b);   //-1

var a = {
    name: "clloz",
    age: 26
}
b = 1;
console.log(a - b);  //NaN

注意在算术运算中null被转化为0undefined被转化为NaN

关系操作符

大于、小于、小于等于和大于等于

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

javascript中使用关系操作符比较两个字符串的时候会出现一些反直觉的现象,比如 '23' < '3' 会返回 true,具体的比较规则是按位比较两个字符串对应位置的字符编码值,比如比较 appleBooka 的字符编码值为 97B 的字符编码值为 66,所以就是 'apple'>'Book' ,如果第一位相同那么就比较第二位以此类推。

javascript使用的 unicode 字符集,所以字符编码值就是字符在 unicode 字符集中的位置,我们可以用 charCodeAt() 方法查看在 UTF-16 中的位置,返回 0~655355 中的数字。

相等操作符 == 和不相等操作符 !=

先转换再比较

  • 如果有一个操作符是布尔值,在比较之前将其转换为数字;
  • 如果一个操作数是字符串,另一个是数值,先将字符串转换为数值再比较;
  • 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
  • nullundefined 是相等的
  • 比较相等性之前,不能将 null 或者 undefined 转换为其他值;
  • 只要有一个而操作数是 NaN,相等操作符就返回 false,不等操作就返回 true
  • 如果两个操作数都是对象,则比较他们是不是同一个对象,当两个引用指向同一个对象,则返回 true,否则返回 false
  1. 全等和不全等

比较规则和相等不相等操作符相同,只是不会进行转换再比较。

由于相等和不相等操作符存在类型转换问题,可能会出现一些意料之外的结果,以及为了保持数据类型的一致性,尽量使用全等和不全等操作符。

条件判断

if 语句是我们最常使用的语句,而if语句的条件判断就是个表达式,可能是我们上面遇到的任何一种情况,对于表达式的结果 ECMAScript 会自动调用 Boolean() 转换成布尔值。

总结

js 的数据类型转换非常灵活,我们不用严格的限制变量的数据类型,但是js 有些类型转换并不十分合理,甚至有些数据类型的转换是非常奇怪的,所以我们在写代码的过程中要注意这些点,尽量使用全等和不全等,以及掌握各种数据类型转换的情况是非常重要的。


Clloz

人生をやり直す

发表评论

电子邮件地址不会被公开。 必填项已用*标注

我不是机器人*

EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00