Day 6
变量的数据类型六个
- 基础数据类型:string字符串、Number数值、Boolean布尔值、Null空值、Undefined未定义
- 引用数据类型:Object对象
string字符串
-
声明一个字符串var a = "NULL",这个就是字符串。只要是引号的就是字符串
-
console.log(typeof a)可以输出变量的类型
- typeof对null返回的是object,这点比较特殊
-
注意引号内还有引号的情况
- 可以用单引号
- 转义符号\
- 如果本身也要用到\,那么就用双斜杠\\
-
将其他类型转化成字符串
- 拼接
- console.log(b+Num)
- tostring()
- string()
- 拼接
Number数值
- 声明一个数值变量var a = 100
- Number类型包含了整数和浮点数(小数)
- 由于内存限制,ES是有最大值和最小值的
- 如果超过了最大值或者最小值,则会返回infinity或者-infinity
- 异常的数值,例如用一个字符串加减乘除一个数字,返回NaN
- NaN是一个特殊的数字,表示非数字Not a Number
- 如果输入这个变量的类型,返回的是Number
- isNaN(非数值类型),判断是不是数字类型,都会返回true
- 注意这个会对类型进行转换
- 由于内存限制,ES是有最大值和最小值的
- 浮点数的运算
- JS中的浮点数运算时不精确的
- var a = 0.1
- var b = 0.2
- console.log(a+b)
- 这个会等于0.300000000004
- 所以不要使用JS进行较为精确的运算
- JS中的浮点数运算时不精确的
连字符和+号的区别
- 字符串之间用+是将字符串拼接
- 字符串+其他类型会变成字符串
- 数值类型则是数学运算
隐式转换
- 例如字符串与其他类型相加会进行隐式转换
布尔值Boolean
- 只有两个值true和false
空值Null
- 只有一个值就是Null
- typeof对null返回的是object,这点比较特殊
未定义Undefined
- 只有一个值Undefined,输出类型也只是Undefined
赋值
a = b;右边赋值给左边
基本类型数据类型和引用数据类型最大的区别是?
基本数据类型:参数赋值时传数值
引用数据类型:参数负值时传内存的地址
变量的强制转换
其他简单类型转换成→字符串
-
其他变量直接加上一个字符串
- 例如console.log(Num+"")
- 可以加空字符串
-
调用tostring()方法
- var Num = Number(123)
- console.log(num.tostring())
-
使用string()函数
- 对Number和Boolean是调用toString()方法
- 但是对Null和Undefined是直接转换成Null和Undefined
-
prompt()无论输入什么,都是字符串
其他简单类型转换成→数值
- 使用Number()函数
- 如果字符串中是存数字,则直接转换成数字
- 如果有非数字的内容,则转换成NaN
- 注意:如果是一个空串或者全是空格的字符串,则转换成0
- 如果是Boolean,则true转换为1,false为0
- 如果是Null,则转换成0
- 如果是Undefined,则转换成NaN
- parseInt()函数,专门用于字符串转数值
- 注意是向下取整
- 注意只保留字符串最前面的数字,后面的文本和数字都不保留
- 如果是其他类型的使用parseInt(),则会先转换成字符串,然后再判断
- 这样其他Null、Undefined都是NaN了
其他简单类型转换为→Boolean布尔
- 数字转布尔
- 除了0和NaNcy,其余都是true
- 即使是复数
- 除了0和NaNcy,其余都是true
- 字符串转布尔
- 除了空串“”,其他都是true
- null和undefined都是false
- 对象都转换成true
进制转换
用parseInt()转换其他进制
-
var a = 070
-
加上一个参数如parseInt(a,16)转换成16进制
-
默认是10进制
-
可能浏览器会不支持2进制的转换
以0x开头16进制
以0开头8进制
0b开头2进制
进制计算
十进制:999=10*9^3+10*9^2+10*9^1
算术运算符
+-*/加减乘除
- 注意乘除余是从左往右的顺序
- var a = 1+2*3%4/5
%获取余数
- 注意不是小数部分,例如6/4=1.5,但是6%4=2
()优先级
- 可以嵌套
对非Number类型的值进行运算,会先将这些值转换为Number再运算
- 隐式转换
- 如true+1=2,false+1=1
- 100-’22‘=78
- 但如果是+的话,100+’22‘则结果为10022字符串
- 任何值与NaN进行运算的是结果都是NaN(注意类型仍然是Number)
乘方、开方
数学对象Math
使用Math.pow(3,2)方法
- 可以嵌套(作为参数
随机数
Math.random()
自增自减++、--
var i = 0
i++
console.log(i)输出1,即+1
那么++i呢?也是自增,区别在于是先赋值还是先自增
++i就是先自增再赋值
i++就是先赋值再自增
var i = 0
i++
console.log(i++)//输出1
var i = 0
i++
console.log(++i)//输出2
自减同自增
逻辑运算符
&&且
||或
!非
结果是返回true或者false
关于且的运算,如果&&前的为false,就不会再去看后面的值
-
这个不看后面的值,如果后面是赋值操作的话,那么就不会赋值
-
var male= "男生" var brief =null man == “男生”&&(brief = “后面赋值”) console.log(brief) var male= "女生" var brief =null man == “男生”&&(brief = “后面赋值”) console.log(brief)
连比:
三元运算符
?前面的为条件,后面表示为true的时候赋的值,:后面为false的时候赋的值
var brief = man == “男生”?“后面赋值”:null;
console.log(brief)
比较运算与编码
赋值运算
-
+=
- a += 5即a = a + 5,两者等价
-
-= /= %=
- 与+=差不多
比较运算
- <、>、>=、<=大于小于小于等于大于等于
- == 等于
- var a = "123"
- var b = 123
- console.log(a==b)其值为true?
- 对。因为==会进行隐式转换,如果转换后内容可以相等,那么就为true
- === 全等于
- var a = "123"
- var b = 123
- console.log(a===b)其值为true?
- 不是。三个=不会进行隐式转换,如果两者相等即true,不相等即false
非数值的比较
- 例如1和true的比较
- console.log(1>true)
- true会转换为true
- 0也是如此
- console.log(“0”>true)
- 会先将字符串转成数字再比较
- 比较两个字符串时,是比较字符串的Unicode编码
- 比较编码时时第一位比第一位的,一位一位进行比较,相同的情况下比较下一个
- 例如“123”与“56”比较,是1的编码比5的小
- 比较两个字符串型的数字,最好先转型再比较
- Unicode编码是什么?
- 可以使用转义符输入Unicode编码
- \u四位编码
- 任何值与NaN比较都是false
- 自己与自己比较也是
- console.log(1>true)
==符号的强调
- undefined与null比较为true
- 因为undefined衍生自null
===符号的强调
不会进行类型的转换
!=不等于
- 会进行类型的转换,结果为==的取反
- var a = "123"
- var b = 123
- console.log(a!=b)
- 返回false
!==
- 不进行类型转换,结果为===的取反
- var a = "123"
- var b = 123
- console.log(a!==b)
- 返回true
三元运算符
一个条件的表达式?“语句1”:“语句2”
- 如果条件为真则执行语句1
- 如果条件为false则执行语句2
优点:比较方便
缺点:语义化不好,不如if、else
运算符的优先级
比较复杂,在实际运用中不知道哪个优先级更高的话,就加括号
流程控制语句:选择结构
if、else
代码块
用{
}包围起来的代码,就是代码块
流程控制语句
流程中的分支
if语句
if(条件){执行语句}
else
多条件判断
- else if分支
- 最后是else
项目:计算BMI
根据BMI(身体质量指数)显示一个人的体型。
BMI指数,就是体重、身高的一个计算公式。公式是:
BMI =体重÷身高的平方
比如,老师的体重是81.6公斤,身高是1.71米。
那么老师的BMI就是 81.6 ÷ 1.712 等于 27.906022365856163
过轻:低于18.5
正常:18.5-24.99999999
过重:25-27.9999999
肥胖:28-32
非常肥胖, 高于32
用JavaScript开发一个程序,让用户先输入自己的体重,然后输入自己的身高(弹出两次prompt框)。
计算它的BMI,根据上表,弹出用户的身体情况。比如“过轻” 、 “正常” 、“过重” 、 “肥胖” 、“非常肥胖”。
答案在第9课
项目:加油站
一个加油站为了鼓励车主多加油,所以加的多有优惠。
92号汽油,每升6元;如果大于等于20升,那么每升5.9;
97号汽油,每升7元;如果大于等于30升,那么每升6.95
编写JS程序,用户输入自己的汽油编号,然后输入自己加多少升,弹出价格。
switch语句
switch语句也叫条件分支语句。
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
...
default:
语句体 n+1;
break;
}
直接将表达式里的值与case的值进行匹配
- 字符串会转换吗,能匹配上吗?
- 不会。
- default是兜底的,如果和所有的case都不匹配的话,则执行default的语句
- 如果不写break会是什么情况?
- 那么会一直执行到break为止,也就是case穿透
循环结构
while循环
-
看起来比for循环要简洁
-
while(条件表达式){
执行语句
}
for循环
-
其实是对while循环的升级
-
for(){初始条件;条件判断;更新条件 比较和while的异同
执行语句
}
-
其实就是将while的三个整合在一起
-
执行顺序:先初始化,然后条件判断,然后循环内容,最后才执行变量的更新。。。然后再次条件判断。。。直到不满足条件跳出循环
do while循环
先执行一次循环看是否满足条件。
与while的区别是先执行后判断,而while是先判断才再执行,也就是说,dowhile可以保证至少循环一次
项目:计算投资时长
题目:假如投资的年利率为5%,试求从1000块增长到5000块,需要花费多少年?
break和continue
break跳出整个循环
for (var i = 0; i < 5; i++) {
console.log('i的值:' + i);
if (i == 2) {
break; // 注意,虽然在 if 里 使用了 break,但这里的 break 是服务于外面的 for 循环。
}
}
console.log("跳出循环")
continue跳出当次循环(可以执行看结果是什么样的)
for (var i = 0; i < 5; i++) {
console.log('i的值:' + i);
if (i == 2) {
continue; // 可以到
}
}
console.log("跳出循环")
并且braek和continue只是跳出最近的循环。例如循环嵌套,只是跳出最近的那个
for (var i = 0; i < 5; i++) {
for(var j = 0;j<3;j++){
if (j == 2) {
continue; // 可以到
}
console.log('i的值:' + i);
}
console.log('i的值:' + i);
}
console.log("跳出循环")