Day2:js数据类型、运算、三目
一、数据类型转换
分类如下:
1、隐式转换:程序自动转换数据类型
(1)数字+字符串:数字转换为字符串
console.log(10+'个人的旅行'); // 10个人的旅行
(2)数字+布尔值:true转换为1,false转换0
console.log(10+true); //11
(3)字符串+布尔值:布尔值转换为字符串true或者false
console.log("10"+true); // 10true
(4)布尔值+布尔值:布尔值转换为数值1或者0
console.log(false+true); // 1
2、强制转换:通过调用指定函数手动转换类型
(1)将任何类型转换为字符串类型:x.toString()
var str=100; console.log(typeof(str.toString())); // string
(2)将任何类型转换为number类型:Number(x)
var str='123312'; console.log(typeof(Number(str))); //number
(3)将字符串转换为number类型:parseInt('123213')
1、只能获取字符串中的整数部分,从一个开始获取,直到碰到不是数字的字符停止读取 var str='123312abc'; console.log(parseInt(str)); // 123321 2、如果开头碰到空格,则忽略 var str=' 123312abc'; console.log(parseInt(str)); // 123321 3、如果碰到第一个非空格字符,不是数字,那么不能转,则返回NaN NaN:Not a Number 类型是number类型,即不是数字(内容)的数字(类型) var str='aa123312abc'; console.log(parseInt(str)); // NaN 4、如果第一个字符是小数点,那么也返回NaN var str='.123312abc'; console.log(parseInt(str)); //NaN 5、如果是空串,也返回NaN var str=''; console.log(parseInt(str)); // NaN
(4)将字符串转换为浮点型:parseFloat('123123')用法同parseInt,唯一区别是仅认识第一个小数点
parseFloat('22.5.3') // 22.5 parseFloat(22.5) // 22.5 parseFloat(22.0) // 22
(5)将任何类型转为浮点型:Boolean(x)
var str=1; console.log(Boolean(str)); // true
3、js数据类型介绍:js属于弱类型语言
(1)声明时不用指定数据类型,今后可能保存任何类型数据
(2)数据类型间可以自动进行转换
二、运算
运算符:程序模拟人类运算的特殊符号
1、算数运算:任意类型数据做-(减法),都会被转为数字类型,如果有不能被转为数字的,则返回NaN
(1)除、减
如果除数为0:Infinity-->无穷大 console.log(5/0) // Infinity console.log(typeof(5/0)) // number console.log(0/0) // NaN console.log("20"-"5") // 15 console.log("20px"-"5px") // NaN console.log(100-"") // 100
(2)被除数 % 除数(模运算-取余):被除数/除数,取除不尽的余数
2、递增/递减运算
(1)i++、i--和++i、--i
1、++:i++ 相当于 i=i+1 2、i++单独用:++放前放后,效果一样:i++=>++i 3、i++出现在表达式内部(先赋值后+1): var change = 10; console.log(change++); // 输出10 4、++i出现在表达式内部(先+1后赋值): var change = 10; console.log(++change); //输出11 5、--:i-- 相当于 i=i-1
3、关系运算:判断大小,条件判断中使用,结果成立返回true,反之,false,自带隐式类型转换
总结:
普通类型,先转为相同类型,再比较
undefined,就用===
NaN,就用isNaN(x)
(1)字符串参与关系运算:从第一个字符取出每个字符PK unicode编号
"Hello" PK "Hi" H == H e 101 i 105 关系运算中:任何类型和数字相比较,都转为数字再进行比较,和+刚好相反。 布尔类型参与运算,布尔类型转为数字再进行比较。 console.log("10"==10); // true console.log("2">true); // true console.log(2>true); //true 注:在关系运算中,先将参与判断的数据,强转为相同的类型,再比较
(2)undefined做等值(==)比较:它是从null类型继承来的,它在比较时会被自动转换为null
undefined == null //true 本来不应该相等,但是现在没有办法了,所以引出 ===严格相等:不带自动类型转换的相等比较,要求类型和值必须都相等,才返回true 只要不确定比较的类型,又不希望自动类型转换时,就用===,严格相等如果到处使用,造成一下情况: "25"==25 //true "25"===25 //false console.log(typeof(undefined)); //undefined console.log(typeof(null)); //Object
(3)NaN做等值比较:NaN和任何数字做比较,永远返回false,NaN==NaN 返回false
isNaN(x):专门用来判断一个数据是否是NaN,如果是NaN返回true,如果不是NaN返回false,如果x是个数字返回false; isNaN("") // false 因为关系运算中""可以自动转换为0 isNaN(22.5) //false isNaN("10") //false 因为关系运算中"10"可以自动转为10 isNaN("12px") //true 因为12px不能自动转换为数字,只能强制转换 isNaN(true) // false isNaN("true") //true isNaN(NaN) // true
4、逻辑运算:基于多组关系运算得出一个结论
(1)&&:而且(所有条件为true,才返回true,只有一个为false就返回false)
(2)||:或者(只要有一个条件为true,就返回true,所有条件为false才返回false)
(3)!:颠倒true和false(如果结果为false,则返回true)
5、短路逻辑:只要前一个判断足以得出最终结论,则后续条件不执行!
1、 var i = 10; var j = 10; var k = i-- < 0 && j++ > 0 i=9 j=10 k=false 2、 var i = 10; var j = 10; var k = i-- > 0 || j++ >0 i=9 j=10 k=true
6、位运算:
左移:n <<m 相当于 n*(2的m次方) 3<<1 相当于 3*2的1次方 等于 6 3<<2 相当于3*2*2 等于 12 右移:n>>m 相当于 n/(2的m次方) 64>>1 相当于64/2=32 64>>3 相当于64/(2*2*2)=8
7、赋值运算:=用于变量赋值,赋值运算的结果就是等号右边表达式的结果
1、var x=y=z=10; //不推荐这样使用 2、console.log(x=y=z=10); //10
8、扩展赋值表达式:+=、-=、*=、/=、%=、对已有数据计算同时,将结果再存回变量
+=:i+=5 相当于 i=i+5
何时使用:修改原变量值的时候用这些
三、条件(三目)运算
三目运算:根据不同条件,动态返回不同结果,至少需要三个表达式
1、 var ts="人"; var bgj="妖"; var who=ts; who=="人" ? "放过" : "杀掉"; 语法:条件?当满足条件时返回的值:当条件不满足时返回的值 2、 var r=who=="人?"放过": who=="妖"?"杀掉": "送到泰国"; 语法:条件1?条件1满足时的值: 条件2?条件1满足时的值: 条件n?条件1满足时的值: 默认值;
拓展知识:
1、字符串在+运算当中,只要有字符串参与,一切类型都加“”变为字符串,如果没有字符串都转为数字计算
2、prompt("提示信息"):获取用户输入数据,收集数据的对话框,切记,只要从页面上获得的一切都是字符串,必须先转换再计算
3、今后只要计算结果是NaN,证明其中一个参数错了 eg:parseInt("true")+1000 -> NaN
4、typeof():函数可用于查询变量的当前类型
综合练习:
1、判断页面输入字符是否为数字、字母、还是汉字,通过控制台输出出来
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script type="text/javascript"> var c = prompt("请输入一个字符:"); var isNumber = c>="0" && c<="9"; var isAlphabet = (c>="A" && c<="Z") || (c>="a" && c<="z"); var isChinese = c>="\u4E00" && c<="\u9FA5"; console.log(isNumber+","+isAlphabet+","+isChinese); </script> </body> </html>
2、页面中输入一个数字年份,判断是否为闰年
注:闰年的判断公式为:
年份能被4整除,且不能被100整除的是闰年
年份能被400整除的事闰年
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script type="text/javascript"> var year = parseInt(prompt("请输入一个年份:")); var isLeapYear = (year%4==0 && year%100!=0)||(year%400==0); console.log(isLeapYear); </script> </body> </html>
3、2个数中取最大的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var score1=100; var score2=80; var result=score1>score2?score1:score2;
4、页面输入工资,按以下规则在控制台显示出工资的级别
注:后一个条件中不用包含否定前一个条件的关系判断,因为,进入后一个条件隐含的条件就是前一个条件不满足。
(1)大于等于20000,显示“高工资”
(2)小于20000大于等于8000,显示“中高工资”
(3)小于8000,显示“普通工资”
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script> var salary=parseInt(prompt("请输入工资:")); var x=salary>=20000?'高工资': salary>8000?'中高工资': '普通工资'; console.log(x); </script> </head> </html>