JavaScript运算符和类型转换

216 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

JavaScript运算符和类型转换


前言

运算符分 :算数运算符,逻辑运算符,比较运算符,位运算符,赋值运算符,三目运算符。

在表达式中,运算过程中会自动产生的数据转换,其中又分显性类型转换和隐性类型转换,隐性类型转换用的是显性类型的方法。

先明白显性类型转换,再分析每个运算符中的隐性类型转换。


一、显性类型转换

1.Number()方法: undefined为NaN,字母也为NaN,数字加字母也为NaN false为0,true为1,null为0,负数和正数一样不变-1为-1。

var a = Number(undefined); //NaN
var a = Number("1a"); //NaN
var a = Number(false); //0
var a = Number(true); //1
var a = Number(null); //0
var a = Number("1"); //1

2.parseInt()方法: 例:

var demo = "10";
var num = parseInt(demo ,16);
console.log(typeof(num) + ":" + num);

答案显示 number: 16 var num = parseInt(demo ,radix); //radix 是基底的意思 radix 写成 16,系统会认为是以 16 进制为基底, 10(一零)是 16 进制的一零,是 以 16 进制为基底,把他转成为 10 进制的数字(就是 16),上面是以目标进制为基底, 转换成十进制(radix 范围是 2-36)

3.parseFloat()方法: 例

var demo = "100.2abc";
var num = parseFloat (demo);
console.log(typeof(num) + ":" + num);

答案显示 number: 100.2 parseFloat 从数字类开始看,看到除了第一个点以外的非数字类为截止,返回前面的。 数

4.toString()方法: 注意:undefined 和 null 不能用 toString toString(radix)还有转换进制作用。 例

var demo = 123;
var num = demo.toString(8);
console.log(typeof(num) + ":" + num);

答案 173,把 123 转成为八进制 这里的 radix 意思是以十进制为基底,转换成目标进制

5.String()方法: String(mix)转换成字符串,写什么都成了字符串,undefined和null也可以。

二、运算符与隐性类型转换

隐式类型转换内部隐式调用的是显示的方法

隐式类型转换包括 isNaN () ,++,--, +/-(一元正负),+,*,% ,,&&,|| ,!, <,>,<= ,>= ,== ,!=

1. isNaN()方法console.log(isNaN("abc"); //答案 true。会调用 number,先把“abc” 放 number 里面转换,通过 number 的转换再和 NaN 比对,如果相等就是 true

console.log(isNaN(null); //答案 false,在 number 里面放 null 是 0,不是 NaN

console.log(isNaN(undefined); //答案 true

2. ++/--(加加减减) +/-(一元正负) ++/--放a前面就是先加或减1再运算,放后面就是运算完加或减1。 例 var a = “123”; a ++; 答案 124,++这个符号放到这里,还没运算之前,先把前面的 a 转换成 number 的 123 例 var a = “abc”; a ++; 答案 NaN

var a =+"abc";console.log(a + ":" + typeof(a)); 答案 NaN:number。尽管转换不成数字,也会转换成数字类型,因为里面隐式的调用 了一个 number

3. + +隐式类型会转换成 string,当加号两侧有一个是字符串,就用调用 string,把两个都 变成字符串

4. *与% 两边先转换成number,再运算。 例 var a = "a" *1; console.log(a + ":" + typeof(a)); 答案 NaN :number,先是 number(“a”)的结果乘以 number(1)的结果,最后是 NaN*1, 还是 NaN,但是数据类型是 number

5. && || ! (&&) 只有前后两个条件都为true时整体才为true,遇到假就返回,前面都为真,最后一个不管是什么都返回。 例 var a = 1 && 1 && 8; //答案 8,先看第一个是否为真,为真再看第二个,到最后一个直接返回结果。

所以做表达式时第一个条件为false时会发生短路逻辑。就是不会执行第二个表达式。 例:1 > 3 && console.log(1);这个后面的表达式不会执行

中途如果遇到 false,那就返回 false 的值 例 var a =1 + 1 && 1 – 1&&2;document.write(a); //答案 0

( || ) 遇到真就返回,前面都为假,最后一个不管是什么都返回 中途如果遇到 true,那就返回 true 的值

与或非,都是有类型转换的,不过是返回的是表达式的值,不是隐士类型转换的值,

6、 < > <= >= == != 判断是一个类型转换的值(判断每个表达式的布尔值) (1)有数字相比较的,就会隐士类型转换成数字类型 5>4<3返回true,前面的5>4为true,true转换为1再和后面比。 4>"2",返回true。 如果字符串这边转换为NaN,任何判断都为false。

(2)如果两边都是字符串的比较,则不会发生隐性类型转换比的是 ASCII 码。

(3)undefined与unll 不大于0不小于0不等于0,但它们两相等。NaN是唯一的一个不等于自己的。

7. 不发生类型转换的运算符===,!== 两边要绝对相等。绝对不等。

其它运算符

1.位运算符: 先将数据转为2进制进行运算,运算结束后再将结果转回10进制

     & 按位与,上下两位都是1,结果为1,否则为0 
      | 按位或,上下两位有一个1则结果为1
     ^ 按位异或,上下两位不同为1,相同为0
     >> 按位右移,删除末尾的位数(原基础上除以2再取整)
     << 按位左移,在末尾补0(原基础上乘以2)

2.赋值运算符 var a = a + 1; 可简化: var a += 1;

3.三目运算符 格式:条件表达式 ? 表达式1 : 表达式2 如果条件表达式为true,执行表达式1 如果条件表达式为false,执行表达式2

例:2 > 1 ? console.log('对') : console.log('错');结果为对。