Day 6

158 阅读9分钟

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
        • 注意这个会对类型进行转换
  • 浮点数的运算
    • JS中的浮点数运算时不精确的
      • var a = 0.1
      • var b = 0.2
      • console.log(a+b)
        • 这个会等于0.300000000004
    • 所以不要使用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
      • 即使是复数
  • 字符串转布尔
    • 除了空串“”,其他都是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 == “男生”?“后面赋值”:nullconsole.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
      • 自己与自己比较也是

==符号的强调

  • 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("跳出循环")

项目:在页面中接收一个用户输入的数字,并判断该数是否是质数。

项目:打印1~100之间的所有质数

项目:99乘法表