unmber + unmber =unmber
unmber + string =string
js获取页面上的一切东西,默认数据都是一个字符串
typeof 查看数据类型
1、算数运算的隐式转换:悄悄的,我们程序员看不到的
默认:悄悄的把左右两边的东西,转为数字,再运算
特殊:1、+运算,碰上一个字符串,左右两边都会变成字符串,加运算也不再是加运算,变成了拼接操作
2、原来别的数据也能转成数字
true->1
false->0
undefined -> NaN:只要是数字,但是不知道转为多少的时候,结果也为NaN
null--0
3、其实+ * / %,字符串也可以转为一个数字,前提是一个纯数字组成的字符串才可以,只要包含一个不是纯数字都是转为NaN
“100"->100
"100px"->NaN
NaN:Not A Number 不是一个数字,但又确实是数字类型,不是一个有效数字
缺点:
(1)NaN参与参与任何计算,结果都为NaN
(2)NaN参与任何比较运算,结果任为false,甚至自己都不认识自己
问题:我们没有办法使用普通比较运算来判断x是不是NaN
解决:
isNaN(x)
!isNaN(1)//取反
true -- 是一个有效数字
false -- 是Nan
2、强制/显示转换
手动调用的方法,强制转换为想要的数据类型
1)转字符串
var str=xx.toString(); /不能是undefined和null,因为undefined和null不能使用.做任何操作
页面上的一切数据类型都是字符串
2)转数字(3种)
**(1)parseInt(x); parse -> 解析 Int -> 整数
原理:专门为字符串和小数转数字准备的,从左向右依次读取每个字符,之后再碰到非数字字符就会停止转换;
如果一开始就碰到不认识的字符,结果就为NaN
console.log(parseInt (100.5));//100
console.log(parseInt("100.5"));//100
console.log (parseInt("100px"));/100
console.log (parseInt("px100"));//NaN
console.1og (parseInt(" 1px00"));//1
console.1og (parseInt (true)) ;//NaN
console.log (parseInt(false)) ;//NaN
console.log (parseInt (undefined));//NaN
console.log (parseInt (null));//NaN
**(2)parseFloat(str); parse -> 解析 Float -> 浮点数
原理:几乎和parseInt一致,认识小数点
console.log(parseFloat (100.5));// 100.5
console.log (parseFloat("100.5"));//100.5
console.log (parseFloat ("100.5px"));/100.5
console.log (parseFloat("px100.5"));//NaN
console.log (parseFloat("10px0.5"));//10
console.log (parseFloat ("100.5.5.5"));//100.5
console.log(parseFloat(".555"));//0.555
(3)Number(x); //此方法是万能的,任何数据类型都可以转换为数字
//垃圾:完全等同于隐式转换
二、Function基础
Function:函数,也称为方法(需要预定义,以后可以反复使用的代码块)
一阶段见过的函数:
rotate(360deg) - 完成顺时针旋转360度的功能
url("图片路径") - 完成根据图片路径显示图像
如何使用:
1)创建/定义/封装函数:
function 函数名(){
若干的函数体/代码块/操作
}
2)调用/使用函数
函数名();
注意:1程序员在js里写死,调用几次就,执行几次
2、交给用户来触发,只需要给元素绑定个点击事件
内容
3、何时使用:
1、不希望打开页面立刻执行,而需要时再用,或者由用户来触发
2、希望能够反复执行,不用刷新页面
3、以后任何一个独立的功能体,都要单独封装为一个函数(你的每一个作业)
4、函数在js中的地位最高:函数是第一等公民地位,所以随时随地,咱们要想着能不能封装函数
4、带参数的函数
榨汁机 -> 函数:榨汁
原材料 -> 参数
何时使用:如果我的函数体,希望根据传入的实参的不同,做的略微不同
创建:形参:形式参数,其实就是一个变量,但是不需要写var,而且默认也没有保存任何值
function 函数名(形参,...){
若干的函数体/代码段/操作
}
调用:实参:实际参数,真正的值,需要你在调用函数时传入进去
函数名(实参);
特殊:1、传参的顺序一定要一一对应上,并且数量也要对应
2、不是一定需要带参数的函数,才是好函数,具体要不要带有参数,需要看我们的需求
如果你的函数体就是固定的 - 则普通函数搞定
如果你的函数体是根据参数的不同,做的略微不同 - 就使用带参数的函数
3、***分支结构:
1、程序的流程控制语句:3种
1、顺序执行 - 默认:从上向下依次执行
2、分支结构 - 通过条件判断,选择部分代码执行
3、循环结构 - 通过条件判断,选择要不要重复执行某块代码
2、比较运算符:>= <= > < == !=
用于做判断的
结果:一定是一个布尔值
强调:1、=:不是比较,而叫做赋值操作,把等号右边的东西保存到等号左边
2、如果你想要判断多个条件,绝对不能像小时候数学的写法:18<=age<=65,错误的!在代码里不支持
解决:逻辑运算符
3、逻辑运算符:
&&:与、并且。要求全部条件都满足,最后的结果才为true
只要有一个条件不满足,结果则为false
||:或。要求全部条件都不满足,最后的结果才为false
只要有一个条件满足,结果则为true
!:颠倒布尔值:!true->false !false->true
4、分支的语法:
一个条件,一件事,满足就做,不满足就不做
if(条件){
操作
}
一个条件,两件事,满足做第一件,不满足做第二件
if(条件){
操作
}else{
默认操作
}
多个条件,多件事,满足谁,就做谁
if(条件1){
操作1
}else if(条件2){
操作2
}else{
默认操作
}