3 - 循环、引用值初识、显示及隐式类型转换

386 阅读5分钟

一、循环

for、while、do while循环的区别:

  1. 当循环的次数确定时,使用for循环和while循环差别不大,但是当循环次数不确定时,while方法使用起来更加方便;
  2. 当条件为false时,for、while循环就会终止循环,无论条件为不为true,do while循环都至少执行一次;

break、continue的区别:

  1. break:终止循环,所在的循环体已结束;
  2. continue:跳出循环,所在的循环体还没结束;

1. for循环:

/**
 * for循环的两种写法:
 * 1.声明、条件判断都写在()中
 * 2.将声明,条件拆分的写法
 * ...
 */

//1.声明、条件判断都写在()中,i<10后终止循环
for (var i = 0; i < 10; i++) {
  console.log(i); //依次打印0-9
}

//2.将声明,条件拆分的写法,
var i = 0;
for (; i < 10;) {
  console.log(i); //依次打印0-9、9
  i++;
}

2. while循环:

/**
* while循环的声明不能写在()中,
* ()中只能写一句条件判断
*/
var i = 0;
while(i < 10){
  console.log(i);
  i++; //依次打印0-9、9
}

3. do while循环:

/**
* 条件为false时,do while循环都至少执行一次
*/

//首次循环满足条件i<10的情况
var i = 0;
do{
  console.log(i); //依次打印0-9、9
  i++;
}while(i < 10);


//首次循环不满足条件i<0的情况,这种情况for循环、while循环会不进入循环
var i = 0;
do{
  console.log(i); //虽然不满足条件0<0;但是还是会打印:0
  i++;
}while(i < 0);

4. break:

/**
*  break:终止循环,所在的循环体已结束
*  用于满足条件时终止循环
*/
for(var i = 1 ; i < 10 ; i++ ){
  console.log(i); //1-5,当i=5时,满足条件i % 5 == 0,所以i>5之后的数字都不会再打印
  //如果i能整除5则终止循环
  if(i % 5 == 0){
    break;
  }  
}

5. continue:

/**
* continue:跳出循环,所在的循环体还没结束
* 1.题目:1-10中,有多少个数不能整除5?
* 思路:1. 整除5;就是i % 5 = 0 ;
*/
var num = 0 ;
for(var i = 0 ; i < 10 ; i++ ){
  //整除5的数跳过循环:5/10都会跳过循环,不进行统计
  if(i % 5 == 0){
    continue;
  }
  num ++ ;
  console.log(num);
}

6. for循环demo:

6.1 题目:0+1+2+...+n < 100,n为多少,它们累加的和为多少?

/**
* 思路:0+1+2+...+n :累加:sum += n,然后判断sum < 100
*/
var sum = 0;
for (var i = 0; i < 100; i++) {
  sum += i;
  if (sum < 100) {
    console.log("sum:", sum + ',' + "i:" + i); //sum: 91,i:13
  }
}

6.2 题目:找出1-100中可以整除7或者个位是7的数字,一共有多少个?

/**
* 思路:整除7的数:n % 7 = 0 ; 个位是7的数 : n % 10 = 7
* %:取模,例如:17 % 10 = 17 / 10 = 1 余7 ; = 7
*/

var sum = 0;
for (var i = 1; i < 100; i++) {
  if (i % 7 == 0 || i % 10 == 7) {
    sum++;
    console.log("sum:", sum); // 22
    console.log("i:" + i); //7、14、17、21...
  }
}

6.3 题目:打印0-100,要求:()里面只能出现一句语句;{}里面不能出现i++、i--

var i = 101;
for (; i--;) {
  console.log(i); //100,99,98,97...
}

6.4 题目:求一个数的n次方

/**
*  求10的5次方:10*10*10*10*10=100000
*/
var sum = 1,
    n = 10;
for (var i = 1; i <= 5; i++) {
  sum *= n;   //sum = 10, sum = 10*10 ,sum = 100*10...
  console.log(sum)  //100000
}

6.5 题目:求n的阶乘:1234...

/**
* 求5的阶乘
*/
var sum = 1,
    n = 5;
for (var i = 1; i <= n; i++) {
  sum *= i;
  console.log(sum) // 1*2*3*4*5 = 120
}

6.6 题目:调换数字的顺序:将789以987的形式输出

/**
* 思路: 1.先得到9: var a = 789 % 10 = 9;
*        2.得到8: var b = (789- a) % 100 / 10 = 8;
*        3.得到7: var c = (789 - a - b *10) /100 = 7
*/

var sum = 789,
    a = sum % 10, //9
    b = (sum - a) % 100 / 10, //8
    c = (sum - a - b * 10) / 100; //7
console.log("" + a + b + c) //987-->前面+"",可以把三个数字变成字符串拼接而不是数字相加

6.7 题目: 打印100以内的质数,并统计一共有多少个

/**
* 思路:1.最小的质数是2,所以循环从2开始;
*      2.质数:只能被1或本身整除的自然数,所以统计完全商只有2个的自然数
*      
*/

var count = 0, //统计每个自然数完全商(a/b完全除得尽)的个数
    sum = 0; //统计质数的个数
for (var i = 2; i < 100; i++) {
  for (var j = 1; j <= i; j++) {
    if (i % j == 0) {
      count++;
    }
  }
  //判断自然数是否只有两个完全商,这种是质数
  if (count == 2) {
    sum++;
    console.log("i", i); //2、3、5、7...
    console.log("sum", sum); //25
  }
  count = 0; //统计完一个数是否为质数后,清0,重新统计下一个,
}

6.8 题目: 算出斐波那契数列的第n位:1 1 2 3 5 8 13 21 ...

/**
 *  规律:第1/2位都是1,第3位开始,是它的前两位相加的和,3->2 4->3 5->5...以此类推
 *  算出斐波那契数列的第n位:1   1   2   3   5  8   13   21 ...
 *                         n1  n2  n3
 *                             n1  n2  n3
 *                                 n1  n2  n3
 */
var n = parseInt(window.prompt("请输入第几位"));
if (n <= 0) {
    console.log("输入错误");
} else {
    if (n <= 2) {
        //第1/2位都是1
        console.log(1);
    } else {
        var n1 = 1,
            n2 = 1,
            n3;
        for (var i = 2; i < n; i++) {
            n3 = n1 + n2;
            n1 = n2;
            n2 = n3;
        }
        console.log(n3);
    }
}

二、引用值

引用类型:Object、Function、Array、Date、RegExp

三、typeof操作符

  1. typeof:操作符返回一个字符串,表示未经计算的操作数的类型。可用于判断一个变量的数据类型。 类型 | 结果->typeof(类型) | | ---------- | -------------- | | undefined | undefined | | Number | function | | Object | function | | Function | function | | Array | function | | null | object | | [ ] | object | | { } | object | | "" | string | | NaN | number | | false/true | boolean

四、显式及隐式类型转换

1. 显式类型转换:

1.1 Number()

类型结果->Number(类型)
true1
false0
null0
[ ]0
""0
{ }NaN
undefinedNaN

字符串:

  • 如果字符串包含数值字符,则转换为一个十进制数值。
  • 如果字符串包含有效的浮点值格式,则会转换为相应的浮点值。
  • 如果是空字符串,则返回0。
  • 如果字符串包含除上述情况之外的其他字符,则返回NaN。
//number
console.log(Number('123'));     // 123
console.log(Number('12.3'));    // 12.3

//NaN
console.log(Number('1s'));      // NaN
console.log(Number(undefined)); // NaN
console.log(Number({}));      // NaN

console.log(Number(true));      // 1

//0
console.log(Number(false));    // 0
console.log(Number(null));     // 0
console.log(Number(""));      // 0
console.log(Number([]));      // 0

1.2 parseInt()

parseInt(string, radix)

  • radix 参数用于指定使用哪种数字系统,例如基数为 16(十六进制)表示字符串中的数字应从十六进制数解析为十进制数。
  • 将字符串转换为整数;
  • 字符串最前面的空格会被忽略,从第一个非空格字符开始转换;
  • 如果第一个字符不是数值字符、加号或减号,parseInt()立即返回NaN,(空字符串返回NaN);
  • 如果第一个字符是数值字符、加号或减号,则继续依次检测每个字符,直到字符串末尾,或碰到非数值字符。
//1.将字符串转换为整数
parseInt("123");

//2.字符串最前面的空格会被忽略,从第一个非空格字符开始转换
parseInt(" 0"); //0

//3.如果第一个字符不是数值字符、加号或减号,parseInt()立即返回NaN,(空字符串返回NaN);
parseInt("*0"); //NaN
parseInt("");  //NaN
parseInt(null);  //NaN
parseInt("+0"); //0
parseInt("-0"); //0

/**
*  4.如果第一个字符是数值字符、加号或减号,
*  则继续依次检测每个字符,直到字符串末尾,或碰到非数值字符。
*/
parseInt("123str"); //123
parseInt("123.63"); //123 -> 小数点后的数值舍去
/**
* 5. parseInt(string, radix): radix 参数用于指定使用哪种数字系统,10,16...
* 10进制:0-9
* 16进制:0 1 2 3 4 5 6 7 8 9 a b c d e f
*/
//以16进制为基底
parseInt("a",16); //10  a-->10
parseInt("b",16); //11  b-->11
parseInt("c",16); //12  c-->12
parseInt("d",16); //13  d-->13
parseInt("e",16); //14  e-->14
parseInt("f",16); //15  f-->15

1.3 parseFloat()

  • 将一个字符串转换为浮点数时,只解析十进制值
  • 从位置0开始检测每个字符,解析到字符串末尾或者解析到一个无效的浮点数值字符为止。
  • 第一次出现的小数点是有效的,再次出现小数点就无效了,小数点后面的数值会被舍去。
  • 它始终忽略字符串开头的零。
  • 如果字符串表示整数,则返回整数。
//1.它始终忽略字符串开头的零
parseFloat("-05"); //-5
parseFloat("000005"); //5

//2.第一次出现的小数点是有效的,再次出现小数点就无效了,小数点后面的数值会被舍去。
parseFloat("05.05.05"); //5.05

//3.从位置0开始检测每个字符,解析到字符串末尾或者解析到一个无效的浮点数值字符为止
parseFloat("5.26tr6"); //5.26
parseFloat("5.2*5"); //5.2

//保留2位小数-> 四舍五入
parseFloat(5.688).toFixed(2); //5.69

1.4 toString()

  • null、undefined没有toString()方法
([1,2]).toString(); //"1,2"
(5).toString(); //"5"

1.5 Boolean()

  • null、undefined、0、''、 NaN、false都为假;
  • 除了以上6个,其他的都为真;
 //false
Boolean(null);
Boolean(undefined); 
Boolean(0); 
Boolean("");
Boolean(NaN);
Boolean(false);

//true
Boolean(1);

2. 隐式类型转换

2.1 + - * / ++ -- % ,如果包含这些操作符,会转换成Number类型;

//1. + ,如果表达式中包含字符串,+就是连接符;如果表达式中只包含number类型,+就是进行加法运算
var a = "20" + 5; // 205
var b = 5 + 6; //11

5 % "4" = 1;
5 / "4" = 1.25;

2.2 比较运算符

  • undefined、null 不等于、大于、小于0
  • null == undefined
  • null !== undefined
  • true == 1 ; false ==0;
  • == 0; //false
  • NaN == NaN; //false, NaN不与任何东西相等,包括自身
null == null; //true
true > 0 ; //true, true == 1

2.3 isNaN(value)

  • isNaN() 函数用于检查其参数是否是非数字值。
  • 参数如果不能被Number()转换为number类型则返回true,即为非数字值。
  • 如果参数值为 NaN 或字符串、对象、undefined等非数字值则返回 true, 否则返回 false。 参数 | 结果 --> isNaN(value) | | --------- | ------------------------------- | | NaN | true -->Number(NaN) = NaN | | undefined | true -->Number(undefined) = NaN | | Object | true -->Number(Object) = NaN | | Array | true -->Number(Array) = NaN | | | | | [ ] | false -->Number([ ]) = 0 | | true | false -->Number(true) = 1 | | false | false -->Number(false ) = 0 | | "" | false -->Number("") = 0