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(‘错’);结果为对。