***数据类型转换: javascript是弱类型语言,数据类型都是由数据来决定的
对于不同数据类型的运算时,数据类型会进行转换:
number + number = number
number + string = string
如果你喜欢查看数据类型:typeof(需要检查的人);
1、算术运算隐式转换:其他运算也有
自动转换,悄悄的,我们程序猿是看不见的
其实只要是算术运算就一定带有隐式转换,默认会将左右两边转为数字,再运算
特殊:1、+运算,如果碰到了一个字符串,那么左右两边都会悄悄转为字符串,再拼接
2、-*/%,就算是字符串也可以转为数字,但是不需要是纯数字组成的才可以,只要包含了非数字字符,则为NaN
3、某得人转为数字的结果
true->1
false->0
undefined->NaN
null->0
"100"->100
"10a0"->NaN
4、NaN:Not a Number,不是一个数字,但是确实是数字类型,理解为是一个无效的数字
缺点:1、NaN参与任何算术运算结果仍为NaN
2、NaN参与比较运算结果都为false
问题:我们没有办法使用普通的比较运算来判断x是不是NaN
解决:个人更爱反用:
!isNaN(x) - 判断x是不是一个有效数字
true->说明是一个有效数字
false->说明是一个NaN
2、强制/显式转换:
隐式转换的结果可能不是我们想要的,我们程序员可以手动调用某些方法,进行数据类型的转换后,再运算
1、转为字符串:
语法:var str=x.toString();//x不能是undefined和null,因为undefined和null不能使用.操作
此方法不重要,页面上获取来的所有的数据默认都是字符串
2、*转数字:3个方法
*1、var num=parseInt(str/num); parse->解析 Int->整型/整数
原理:从左向右依次读取每个字符,进行转换,碰到非数字字符就停止,而且不认识小数点,如果一开始就碰到了不认识的字符,结果为NaN
console.log(parseInt(35.5));//35
console.log(parseInt("35.5"));//35
console.log(parseInt("35hello5"));//35
console.log(parseInt("hello35"));//NaN
console.log(parseInt("35px")+100+"px");//35
console.log(parseInt("35px555abc"));//35
console.log(parseInt(布尔、undefined、null));//NaN
*2、var num=parseFloat(str); parse->解析 Float->浮点数/小数
原理:几乎和parseInt一模一样,认识小数点
console.log(parseFloat("35.5"));//35.5
console.log(parseFloat("35.5px"));//35.5
console.log(parseFloat("35.5.5"));//35.5 - 数字只有一个小数点,第二小数点就是不认识的字符
console.log(parseFloat(".55"));//0.55
console.log(parseFloat("px35.5px"));//NaN
console.log(parseFloat(true));//NaN
以上两个都可以去掉字符串的单位
3、Number(x);//x是万能的,任何人都可以转为数字
//垃圾,因为此方法完全就是隐式转换,也不能转带有非数字字符的字符串,还不如对着x *1 /1 -0,绝对不要手动使用
总结:1、只要页面上带有单位的数字,我们都可以用parseXXX来去掉单位变为数字
2、Number何时都不用
2、*****函数:函数是第一等公民的地位 url(图片路径) - 完成了一个根据图像路径显示图片的功能 rotate(角度值) - 完成一个根据角度值旋转的功能 ... js里面的函数 - 完成了一个xxxxxxxxxxx的功能
1、什么是函数:也称为方法,需要【预定义】(提前创建好)后,可以【反复使用】的【代码段】(里面可以放若干代码)
2、创建函数并且调用函数
第一步:
创建:function 函数名(){
若干代码段
}
第二步:
调用:2种方式
1、直接在js里面写 函数名(); 程序员写几次就会执行几次
2、绑定在页面的元素上,让用户来触发,用户触发一次就会执行一次 - 提升用户体验感/多了交互感
<elem onclick="函数名();"></elem>
3、以后何时要使用函数呢?
1、打开页面不希望立刻执行
2、希望用户/程序员来触发
3、希望能够被反复执行
4、本身就是一段独立的功能体:暂时理解为我们的每一个作业就是一个独立的功能体
5、以后要尽量的将每个功能封装为一个函数,函数是第一等公民的地位,而且函数中的变量会自动释放
4、带有参数的函数
电饭煲 -> function函数
功能:把什么东西煮熟
原材料 -> 参数:米饭、蹄花、脑花
1、创建带参数的函数:
形参:就是一个变量名,只不过这里的变量名不需要var,并没有保存真正的值,形式参数,简称形参
function 函数名(形参,...){
函数体;
}
2、调用带参数的函数:
实参:实际参数,这个变量名所保存的值
函数名(实参,...)
一个函数可以执行相似的操作
比如:实现任意两个数相加:
function add(a,b){
console.log(a+b);
}
add(1,2);
add(3,4);
add(5,6);
注意:带参数的函数,在调用时,传入的实参的顺序和个数都要一一的和形参对应上
总结:
1、如果你的函数体是固定不变的,则不需要使用带参数的函数
2、如果你的函数体希望根据传入的实参的不同,做的事儿也略微不同,需要使用带参数的函数
3、***分支结构 1、代码中流程控制语句:3种 1、顺序结构: 默认结构,代码从上向下一步一步执行的
2、分支/选择结构:
根据条件,选择一部分代码去执行
3、循环结构:
根据条件,判断你是否需要再一次重复的执行某一些代码
2、比较运算符:> < >= <= == != 作用:比较判断/条件中出现 结果:以上六个运算符,结果一定是一个布尔值 其实比较运算符也具有隐式转换,但是我不给你说,大部分情况下依然会转为数字在比较大小
3、if结构: 1、一个条件一件事,满足就做不满足就不做 if(条件){ 操作 }
2、一个条件2件事,满足就做1不满足2
if(条件){
1
}else{
2
}
3、多个条件多件事,满足谁就做谁
if(条件1){
1
}else if(条件2){
2
}else{
3
}
扩展:逻辑运算符:&&(与、并且) ||或 !非 &&:只有全部条件都满足,最后结果才为true 只要有一个条件为false,结果就为false
||:只有全部条件都不满足,最后结果才为false
只要有一个条件为true,结果就为true
!:颠倒布尔值
!true -> false
!false -> true
!!!true -> false