JavaScript基础(在校学习总结)

136 阅读12分钟

1.变量

变量:引用内存中存储的一个值

声明变量:var,let,const(推荐使用ES6的新关键字let和const)

var 声明的变量属于函数级别,会有覆盖,存在变量提升.

let,const 声明的变量属于块级别

var和let 声明的是变量:可变

const 声明的是常量:不可变

let a = 1;//声明变量的同时进行初始化,未初始化的变量值为undefined
let b ;//声明变量,未初始化
b = 10;//变量的初始化
let x =6, y = 9,z = 10;//let可以一行进行多个变量的声明

重复的声明变量:var 声明的变量会覆盖前面的,letconst是不允许(同一范围内)
var a = 1;
var a = 2;
console.log(a);//2

⭐ 特殊情况,变量赋值无需事先声明,赋值操作会自动声明该变量
    {
       a = 5;
       console.log(a);//5
    }
    console.log(a);//5
    
//墨水交换
let a = 1;
let b = 2;
let t;
t = a;
a = b;
b = t;
console.log("交换之后两个数:a:"+a , "b:"+b);//a = 2,b =1;

1.1变量的作用域

2.变量的作用域:变量能够作用的范围
全局作用域 和 局部作用域
全局作用域:在整个文档的区域,而拥有全局作用域的变量叫做全局变量
局部作用域:Es5之前,指通过函数产生的作用域(函数作用域);ES6,letconst的引入,加入块级作用域的概念"{}",其变量叫局部变量
特别注意:没用关键字的变量,有特殊的处理,是全局的
let a = 10;//全局作用域
function foo(){         
    let b = 10;//函数作用域
}
foo();

let d = 11;
   {
        let c = 12;//块级作用域
        d = 13;//全局作用域,没有声明的变量,没有关键字的情况下赋值,有特殊的处理,是全局的,其声明位置在其所在块的上一行(没有变量提升)
        {
            console.log(c);//12
        }
    }
    console.log(d);//13

1.2 变量的提升

所有通过var声明的变量,变量的声明部分会提升到当前作用域的最顶端
var a = 10;
{
    var a = 11;
}
console.log(a);//11
==============================================================================
var age = 18;
function foo() {
    var age = 19;
    console.log(age);
}
foo();//19
==============================================================================
if(false){
    var a = 1;//var有着变量提升,并且var不会产生块级作用域
    let b = 2;//产生块级作用域
}
console.log(a);//undefined
console.log(b);//b is not defined
==============================================================================
 var a = 1;
 if (true) {
     console.log(a);
     let a = 2;//let声明的变量不会提升,并且会产生暂存死区.在let声明变量之前访问变量会抛出错误.
 }
==============================================================================
⭐区别varlet
1)varES5,letES6
2)var可以重复声明,但let不行
3)var有变量提升,let没有
4)var的局部作用域只有函数作用域,而let包含函数作用域和块级作用域

2.JS的数据类型

1.数据类型
1)简单数据类型:Number(整数,小数),String(字符串),undefined(未定义),boolean,Null(空),Symbol
2)复杂数据类型:object

2.查看数据类型关键字
查看数据类型的关键字:typeof
let a = "33333"
console.log(typeof a);//string

let b = typeof typeof typeof[12,23];
cnosole.log(b);//typeof typeof object
               //typeof "string"
               //"string",在两个typeof检测以上,基本答案都是string

2.1 JS的简单数据类型

Number:整数,小数
let a1 = 9;//十进制
let a2 = 0b011;//二进制ob
let a3 = 076;//八进制0
let a4 = 0x76;//十六进制0x
//不管运算中声明进制,其结果都是十进制
console.log(a1*a2);//27

let b1 = 1234567777**2345678987654;
console.log(b1);//数值的范围:(两个特殊的值:Infinity、NaN)
console.log("最大值:"+Number.MAX_VALUE);//超过这个这个值的值叫:Infinity(无限大)----Infinity不能参与运算
console.log("最小值:"+Number.MIN_VALUE);//小于这个这个值的值叫:-Infinity(无限小)NaN:nota Number 非数(属于Number类型)
特点:
1).任何参与到NaN的运算的结果都是NaN.
2).NaN与任何值都不相等(自己)
console.log(NaN==NaN);

⭐⭐⭐String:以单引号或者双引号包起来的文本(String和其他数据类型相加都会转换成字符串类型)但是String字符串是不能直接参与运行,必须转换过后才能运算("+"号变成拼接)
let str1 = "你好";
let str2 = 'Hello';
console.log("\t第一行文字。\n\t第二行文字");//转义字符“\”:1、将有特殊含义的符号进行无含义转化 2.转义字母,产生特殊含义:\n,\t,\r........

let a = "12";
let b = 10;
let c = 3.4;
console.log(a+c);//123.4
console.log(Number.parseInt(a)+c);//15.4

⭐⭐⭐boolean:true,false
let a = true;
console.log(typeof a);//boolean
console.log(Boolean(30));//true
console.log(Boolean(0));//flase

⭐⭐⭐undefined:出现undefined情况(
    1.访问未初始化的变量
    2.直接给变量赋值为undefined
    3.typeof 值为undefined
    4.没有return语句的函数的默认返回值为undefined
    5.return语句,但是return后面没有显示的任何内容
    6.访问不存在的属性(对象)
)
let i;
console.log(typeof i);//undefined

⭐⭐Null:其实undefined就是Null衍生过来的,表示一个空的对象.
console.log(null == undefined);
console.log(typeof null)//objectsymbol:一般用于对象的属性命名.创建出来的是唯一值.

2.2 JS的复杂数据类型

⭐⭐⭐复杂数据类型:object:对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
 let obj = {
     a:0,
     b:1,
 }
 console.log(obj);//{ a: 0, b: 1 }

2.3 数据类型转换

⭐⭐⭐数据类型转换
 1.显示转换:
  parseInt(string),parseFloat(string),Number(mix)
  toString(),String(),Boolean()

⭐parselnt():看是否有数字,有就会转换为数值.
 
  console.log(parselnt("123Hello"));//123
  console.log(parseInt("11.4"));//11,碰小数时会取整parseFloat():数值转浮点数,将小数点字符串转换为小数

⭐parselnt()和parseFloat()方法,移植到Nnmber类上面,是为了减少全局性方法,语言逐步模块化.
//Es5写法
  console.log(parselnt("12.14"));//12
  console.log(parseFloat("12.14#"));//12.14

//Es6写法
  console.log(Number.parselnt("12.14"));
  console.log(Number.parseFloat("12.14#"));
  let a = "2.2";
  console.log(Number.parseInt(a));//2Number.islnteger():判断一个值是否为整数.(11.0视为同一个值)
   console.log(Number.islnteger(22));//true
   console.log(Number.islnteger(22.0));//true
   console.log(Number.islnteger(22.1));//falsetoString():该函数会将除了nullundefined以外的数据类型转换为字符串.
   let a = 12;
   console.log(typeof a.toString());//String

   toString()函数在转换数值的时候可以带参数,可以将数值指定为几进制
   let b = 100;
   console.log(b.toString(2));//1100100

 ⭐ 引用数据类型都是先转换为字符串然后再转换为数字,symbol是不允许被转换
 ⭐Number():作为一个函数来调用
   let c = `你好`;
   let num = Number(c);//将变量c转换成number类型
   console.log(typeof num);//number
   console.log(Number("123Hello"));//NaN
   
   let a = 12;
   let b = Number(12);
   consoloe.log(a===b);//truenew Number():
   let num = new Number(12);//把new Number()里面的12包装成对象
   console.log(num);//[Number: 12]
   console.log(typeof num);//object
    
 2.隐士转换
  console.log(typeof parseInt("3456"));//number
  console.log(parseInt("3456cccc"));//3456
  console.log(parseInt("nn3456cccc"));//NaN
  console.log(parseInt(""));//NaN
  console.log(parseInt("0039"));//39
  console.log(parseInt("11.4"));//11
  console.log(parseFloat(".44"));//0.44
  console.log(Number(23456));//23456
  console.log(Number("23456"));//23456
  console.log(Number("23456ttt"));//NaN
  console.log(Number(null));//0
  console.log(Number(undefined));//NaN
  let num77 = 123;
  console.log(typeof num77.toString());//string---->tostring不可以用于:undefined和null
// Number(),String()--任何值都可以字符串化,Boolean()---除了false,"",0,NaN,undefined,null,全部为true
console.log(Boolean("哈哈哈"));
 预期是数字的时候(使用Number()):
    类型		转换前		转换后
    number	  4		   4
    string	  ‘11
    string	‘abc’		   NaN
    string	 ‘’		   0
    boolean	true		   1
    boolean	false		   0
    undefined   undefined   NaN
    null		   null		0
    预期为字符串的时候(使用toString()):
    转为字符串 使用+号时候,会自动转换为字符串
    预期为布尔的时候(使用Boolean()):
    转换为布尔值,NaN,undefined,null,''”,0,NaN转为false,其余转为true

2.4 字符串模版

Es6中新增模板字面量,可以看作是增强版的字符串
 let a = `12`;
console.log(typeof a);//string

2.5 简单值和复杂值的区别(扩展)

⭐简单值:表示javaScript中可用的数据或信息的最底层形式,不可细化的.并且简单值的数据固定大小,数据是存储与内存中得栈区里面.

⭐复杂值:内存中的大小是未知的,可以包含任何值,数据存储于堆区里面.
let obj = {
    name:"xiehang",
    age:18,
    gender:true,
}
console.log(obj.age);//18

2.6 求位数运算

  var num=654;
  var baiwei=parseInt(num/100);//6.54取整 得到百位6
        console.log(baiwei);
  var shiwei=parseInt((num%100)/10);//num%100 得到的是54,然后/10取整 得到的是十位5
        console.log(shiwei);
  var gewei=parseInt(num%10);//num%10  得到的是4,模10取余;
        console.log(gewei);

console.log('输出四位数:');
let  i = input.question();
let ge = parseInt(i % 10);
let shi = parseInt((i % 100) / 10);
let bai =parseInt((i%1000)/100);
let qian = parseInt(i/1000);
console.log(ge,shi,bai,qian);

3. 运算符

 1.字符串相关:+(拼接运算符),``(模板运算符ES62.算术运算符:+ , - , * , / , %(取模,求余), **(求幂ES6),++,--
 3.比较运算符:> , >= , < , <= , == , === , != , !==
 4.逻辑运算符:&&(并且),&(与) , ||(或者) , | ,!
 5.赋值运算符: = , += , -= ,*= ,/= ,%= 
 6.三目运算符: 【1】?【2】:【3】
==============================================================================
1).模板运算符实现无缝拼接
特点:可换行(其中的空格,换行,制表都不会产生错误,且会被解析)
 let name = "zhang3";
 let age = 18;
 let gender = "男";
	console.log("姓名:"+name+"\n性别:"+gender+"\n年龄:"+age);// \n:换行符, \t:制表符
	console.log(`姓名:${name+0}\n性别:${gender}\n年龄:${age}`);
	console.log(3**3);//27,3*3*3

//++,--分前缀和后缀,前缀表示先执行该运算,再参与其所在表达式,后缀恰好相反
(
    变量名++{
 	1.计算返回结果,与变量相同
 	2.将变量的值自增1
 }
	++变量名{
        1.计算返回结果,为变量值加1
        2.将变量的值自增1
    }
)
let x = 1;
x++;//2
++x;//3
x = x++;//3
x = ++x;//4
console.log(x);//4

let i = 0;
let num = i++ + ++i - --i;//i:0 2 1
console.log(num);//1

let x = 1;
x++;//2
console.log(x);//2

let y = x++;//1
console.log(y);//1

2).比较运算符的结果为boolean
  ==(等于)  ===(全等于)  !=(不等于) !==(全不等于):“全”表示必须一模一样才会相等,没有类型的自动转换发生
console.log("ab"<"ac");//ASCII码
==============================================================================
3).逻辑运算符
⭐⭐⭐||(或者)
console.log(true || false && false);//true,执行顺序是从左到右
||:表达式1||表达式2
当表达式1true时,返回表达式1,且不会执行表达式2
当表达式1false时,返回表达式2
遇到||,先去左边的表达式得出结果,如果结果为true,则不会去执行右边的表达式,则短路运算生效;如果结果为false,则去执行右边的表达式,再去根据两边的结果去执行||运算符

⭐⭐⭐&&(并且)
||:表达式1 && 表达式2
当表达式1true时,返回表达式2
当表达式1false时,返回表达式1,且不会执行表达式2
区别:两个符号的代表短路操作。(短路:&&或者||,如果第一个操作数已经可以决定该运算的结果了,后面的不执行)

⭐%(求余)
   let a = 8;
   a %=3;//全局
   console.log(a);//2

==============================================================================

⭐⭐⭐【1】?【2】:【3】--->表达式1为真的时候,执行表达式2,并且整个三目运算符的运算结果是表达式2的值;表达式1为假,则为表达式3执行,并产生结果
let age = 18;
console.log(age == "18"?"成年了":"未成年");

//用三目运算排序
let input = require("readline-sync");
console.log("输入你的第一个数");
let a = ~~input.question();//隐士转换,讲字符串改成number类型
console.log("输入你的第二个数");
let b = ~~input.question();
console.log("输入你的第三个数");
let c = ~~input.question();
let max = a>b?(a>c?a:c):(b>c?b:c);
let min = a<b?(a<c?a:c):(b<c?b:c);
let minddle = a + b + c - max - min;
console.log(`${max},${minddle},${min}`);

let x = 20;
const answer = x > 10?'great than 10' : 'less than 10';

4. 流程控制

当知道循环的次数时,建议使用for循环;
当不知道循环的次数时,建议使用while循环或do-while循环,一般while循环用的多一些。
流程控制:用于控制程序流程走向的语句
顺序结构:程序从上到下依次执行
⭐⭐⭐⭐选择结构:
1.条件可以填写哪些?
2.if后面的{}是必须的?
  if:
  1).单分支语句: if(条件){执行的代码}
  2).双分支语句:if(条件){执行的代码}else{执行的第二段代码}
  3).多分支语句:if(条件){执行的代码}else if(条件2){执行的代码}...else{执行的代码}

//根据用户输入的男生或者女生还有年龄判断,去做不同的事情
let input = require("readline-sync");
console.log("输入你的年龄");
let age = input.question();//获取用户的输入的数据
console.log("输入你的性别");
let gender = input.question();
if (gender == "man") {
    if (age > 18) {
        console.log("你是个成年男子,去工作");
    } else {
        console.log("你还未成年,请认真去读书");
    }
} else if (gender == "woman") {
    if (age < 18) {
        console.log("你是未成年女生")
    } else {
        console.log("你已经是成年女生了");
    }
}

console.log("请输入你的性别");
let gender = input.question();
console.log("请输入你的年龄");
let age = input.question();
if (gender == "man" && age <= 18) {
    console.log("你是女生,请你去学习");
} else if (gender == "man" && age >= 18) {
    console.log("你是女生,请你去上班");
} if (gender == "woman" && age <= 18) {
    console.log("你是男生,请你去学习");
} else if (gender == "woman" && age >= 18) {
    console.log("你是男生,请你去上班");
}
==============================================================================
//ABC排序
let input = require("readline-sync");
console.log("请输入第一个数");
let a = ~~input.question();
console.log("请输入第二个数");
let b = ~~input.question();
console.log("请输入第三个数");
let c = ~~input.question();
if (!(a > b)) {
    let t = a;
    a = b;
    b = t;
} 
if(!(a>c)){
    let t =a;
    a = c;
    c = t;
}if(!(b>c)){
    let t = c;
     c = b;
     b = t;
}
console.log(a,b,c);

//会员卡四位数(开头不为0)求和,会员卡四位数求和大于20时将返利50元,否则不返利根据用户输入的会员卡卡号(四位数),判断是否返利
console.log('输入会员卡卡号:');
let number = input.question();
let a = parseInt(number % 10);//个位
let b = parseInt((number % 100) / 10);//十位
let c = parseInt(number / 100 % 10);//百位
let d = parseInt(number / 1000)//取整
if (a+b+c+d>20) {
    console.log('返利50');
}else{
    console.log('不返利');
}

//工资所得税工资超过1000的部分需要缴纳个人所得税(税率0.05),根据用户输入的工资,输出税后工资
console.log("请输入你的工资:");
let a = input.question();
if (a > 1000) {
    a -= (a - 1000) * 0.05;
    console.log(a);
} else {
    console.log(a);
}

4.1 switch循环

⭐⭐switch
  	特点:
      1.穿透效果:选中的case执行,但是switch语句没有结束,会依次从选择的位置往下,执行完所有代码
      2.break:终止当前switch语句的继续执行;
       注意:switch语句()内容不会根据case的值进行隐式转换,只能全等比较;js case后面是        允许放变量的.
      3.default:来规定匹配不存在时做的事情
        switch(表达式) {
         case n:
            代码块
            break;
         case n:
            代码块
            break;
         default:
            默认代码块
        } 
   //输入你的考试成绩分数,90分以上:优秀,80分以上:良,70分以上:中单,60分以上:及格,60分一     下不及格
    let input = require("readline-sync");
    console.log("输入你的分数");
    let number = input.question();//获取到用户输入
    switch (parseInt(number / 10)) {//parseInt 显示转换
        case 10:
        case 9:
            console.log("优秀");
            break;
        case 8:
            console.log("良");
            break;
        case 7:
            console.log("中等");
            break;
        case 6:
            console.log("及格");
            break;
        case 5:
        default:
            console.log("不及格");
            break;
    }
==============================================================================
    循环嵌套:一个循环嵌套另一个循环
    跳转语句:
    break:用于退出当前所在的整个循环或者switch 
    continue:跳过本次循环(剩下的循环体代码),继续下一次循环
    return:关键字用于在函数或方法中返回一个值,并终止函数执行返回给谁?谁用的就返回给谁.

4.2 for循环

⭐⭐⭐⭐for 循环
    1.执行"初始化表达式"
    2.执行"条件判断表达式"
    3.如果判断为true,执行循环体,否则退出循环
    4.执行“修改循环条件表达式”
    5.回到第二步
    for(表达式1;表达式2;表达式3){循环体}====>表达式1:初始化表达式 表达式2:条件判断表达式 表达式3:修改循环条件表达式
 ⭐⭐⭐⭐JS中的for循环体比较特殊,每次执行都是一个全新的独立的块作用域,用let声明的变量传入到 for循环体的作用域后,不会发生改变,不受外界的影响

//输出1+2+3+4+....到100的和
let sum = 0;
for(let i = 1;i<=100;i++){//这一行全部是关于i的,循环的控制在i身上,可以通过这一行知道i的变化情况,以及循环次数-----像这样的变量i叫做循环控制变量
    sum +=i;//也可以写成 sum = sum + i;
}
console.log(sum);

for (let i = 0; i <= 100; i++) {//输出100以内的奇数
    if (i % 2 == 1) {
        console.log(i);
    }
}

for (let j = 1; j <= 100; j++) {//输出100以内的偶数
    if (j % 2 == 0) {
        console.log(j);
    }
}

//输出1-100之间的质数
let str = "";
for (let i = 1; i <= 100; i++) {
    let j;//这里形成块级作用域,如果把j写for循环里面,j就只有在for循环里面使用
    for (j = 2; j <= i; j++) {
        if (i % j == 0) {
            break;
        }
    }
    if (i == j) {//注意,这里使用了J变量 
        str += (i + ",");
    }
}
console.log(str);

for (var i=2;i<=100;i++) { // 控制数字从2开始到100为止,i是除数
    for (var j=2;j<i;j++) { // 控制被除数,j是被除数
	if(i%j==0){ // 不是质数的条件
		break;  // 跳出当前循环
	}
    }
	if (i<=j) { // 是质数
	str += (i + ",");
    }
}
console.log(str);

//判断一个数是不是质数
let input = require("readline-sync");
console.log("输入你要判断的数");
let number = input.question();
let sum = 0;
for (let i = 1; i <= number; i++) {
    if (number % i == 0) {
        sum++;
    }
} if (sum == 2) {
    console.log(`${number}是一个质数`);
} else {
    console.log(`${number}不是一个质数`);
}  

//九九乘法表
for (let index = 1; index <= 9; index++) {
    let str = "";
    for (let j = 1; j <= index;j++) {
        str += `${index}x${j}=${index * j}\t`;
    }
    console.log(str);
}

//弹皮球,皮球从高度100m的位置向下掉落,每次掉落地面弹高10m,弹10次后,求球距离地面的距离
const h = 100;//高度100M
let sum = 0;//弹起的距离
let i = 1;
for (let index = 0; index < 10; index++) {
    sum = sum + i * (h + h / 2)
    i = i * (1 / 2);
}
console.log(sum);

//百鸡百钱:cock 公鸡5元一只 hen 母鸡3元一只 chick 小鸡1元3只,100元要买100只鸡?有多少买法?
1.for (let cock = 5; cock <= 20; cock++) {
  for (let hen = 3; hen <= 33; hen++) {
    let chick = 100 - cock - hen;
 if ((cock + hen + chick == 100) && (cock * 4 + hen * 3 + chick / 3 == 100)) {
            console.log(`有${cock}只公鸡,有${hen}母鸡,有${chick}只小鸡`);
      }
    }
}

2.for (let cock = 1; cock <=100; cock++) {
    for (let hen = 1; hen <=100; hen++) {
       for (let chick = 1; chick <=100; chick++) {
       if (cock / 3 + hen / 5 + chick * 2==100 &&(cock + hen + chick ==100)) {
      	  console.log(`公鸡买${cock/3}只,母鸡买${hen/5}只,小鸡买${chick*2}只`);
          }           
       }
    }    
}

//5.使用循环打印出下面的三角形图案
let row = 10;
for (let index = 1; index <=row; index++) {//外层循环代表的是要循环的行数,外层循环一次,里面的循环执行全部
    let str="";
    for (let j = 1; j <=row-index; j++) {//这层循环代表的是要循环的空格数
      str +=" ";
    }
    for (let k = 1; k <=index; k++) {
        str += "* ";
    }
    console.log(str); 
}
         * 
        * * 
       * * *
      * * * *
     * * * * *
    * * * * * *
   * * * * * * *
  * * * * * * * *
 * * * * * * * * *
* * * * * * * * * *
           
//倒立的等腰三角形
for (var i = 10; i >= 1; i--) {//外层循环代表的是要循环的行数,外层循环一次,里面的循环执行全部
    var str= '';
    for (var k = 0; k < 10-i; k++) {//这层循环代表的是要循环的空格数
        str += ' ';
    }    
    for (var j = 0; j < i; j++) {//内层循环代表的是要打印的列数
        str +='* ';
    }
    console.log(str);
}

// 1,2,3,4.(4个数字能组成多少个互不相同且无重复数字的三位数?都是多少?)
let sum =0;
for (let a = 1; a <= 4; a++) {//123,124,134,132,142,143,213,231,241,243,234,214,312,321,314,341,324,342,
    for (let b = 1; b <= 4; b++) {
        for (let c = 1; c <= 4; c++) {
            if (a != b && b != c && c != a) {
                sum++;
                console.log(''+a+b+c);
            }
        }
    }
}
console.log(sum);

//输出100-999的水仙花数,是一种自幂数的一种,严格来说3位数的3次幂数才能称为水仙花数
for (let i = 100; i <=999; i++) {
    let ge =parseInt(i%10);
    let shi = parseInt((i%100)/10);
    let bai = parseInt(i/100);
    let sum = ge*ge*ge+shi*shi*shi+bai*bai*bai;
    if (sum ==i) {
        console.log(i);
    }
}

//入职薪水10K,每年涨幅5%,50年后工资多少?
console.log('输入你的薪资:');
let money = input.question()-0;
console.log('输入工作年限:');
let year = input.question()-0;
for (let i = 1; i <= year; i++) {
    money *=(1+0.05);
}
console.log(money.toFixed(2));

//计算斐波拉契数列:1 1 2 3 5 8 13 21…的前20项之和。斐波拉契数列:前两个数为1,从第三个数开始,数值为前两个数之和。例如:2=1+1, 3=1+2,5=2+3
let a = 1;
let b = 1;
let c = 2;//初始化变量
for (let i = 3; i <= 20; i++) {//从3开始循环
    let temp = a + b;
    a = b;//交换思想,将a,b的位置不断向后移动,即将原来b的值作为a的值,将原来temp的值作为b
    b = temp;
    c +=temp;//求和
}
console.log(c);

//4. 逢7过游戏,打印1-100,遇到能被7整除或者带7的数字打印“过”代替
for (let a = 1; a <= 100; a++) {
    let ge = a % 10;//个位
    let shi = parseInt(a / 10);//十位
    if (a % 7 == 0 || a % 10 == 7 || ge == 7 || shi == 7) {
        console.log('a' + '');
    } else {
        console.log(a + ',');
    }
}

4.3 while循环

⭐⭐while循环
   while(循环条件){循环体}:如果循环条件为true,执行循环体,再次判断循环条件.......
//1+...100的和
let n = 1;
let t = 0;
while (n <= 100) {
    t = t + n;
    n++;
}
console.log(t);

//一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米
let h = 0.0001;
let sum = 0;
while (h<=8848) {
    h *=2;
    sum++;
}
console.log(sum);

4.4 do...while 循环

⭐⭐do...while循环
   do...while:do{循环体}while(循环条件); 特色;先执行一次循环体(输入密码)
       
//+...100的和
let sum = 0;
let i = 1;
do
sum+=(i++);
while(i<=100); 
console.log(sum);

5. 数组

⭐⭐⭐数组是一组数据(数据类型不限,任意)的有序集合;====>写代码时,一般一个数组只放一种数据类型的数据,数组的类型其实也是属于对象。
注意:大多数的语言里面数组的存储是连续的,但是js的数组特点决定了js的数组不一定是连续的。
 数组的特点:
  1.作用:将许多零散的数据组成一个整体;
  2.数组本身属于复杂数据类型(引用数据类型/对象),即我们的数组就是“对象”
  3.根据需要,对数组内部数据进行一些操作(增删查改),
  	数组的创建: 1.字面量的方式  2.构造函数的方式
  	 1.let arr0 = [1,2,3,4,5,6];
	   2.let arr1 = new Array(1,2,3,4,5,6);
          console.log(arr0[0]);//1
          console.log(arr1[3]);//4
		 console.log(JSON.stringify(arr1))//[1,2,3,4,5,6]
数组的下标:数组中存储是数据时有序的,我们就给每一个元素加一个编号,称之为“下标”/"索引"index
索引特点:index从0开始,到 “数组元素个数-1” 结束
下标的使用:数组名称[index]  ======> 查看数据:(查询时,越界?访问到一个undefined值,不管学什么语言,越界一般是不允许的)
1.修改数据
    let arr0 = [1,2,3,4,5,6];
     arr0[1] =1
    console.log(arr0);//[ 1, 1, 3, 4, 5, 6 ]
2.增加数据:当我们的数组下标访问超过了里面元素的下标最大值时,会在赋值的同时,增加元素
    arr0[6] =1
    console.log(arr0)//[ 1, 1, 3, 4, 5, 6 ,1]
3.删除数据  delete 关键字
    delete arr0[6] =1
    console.log(arr0);//[ 1, 1, 3, 4, 5, 6 ,<1 empty item>]Arrary对象的length属性
    console.log(arr0.length);//6
1.通过设置length的值(比原来数组length大),可以增加空元素undefined
    let c = [];
    c.length = 3;
    console.log(c.length);//[ <3 empty items> ]
    c[0] = 1;
    c[1] = 2;
   	c[2] = 3;

2.设置length的值(比原来数组length小)可以删除元素
	c.length = 1;
	console.log(c);//[ 1 ]

3.将大于等于10的数字挑选出来,放入新的数组
let arr = [1, 2, 3, 4, 5, 11, 19, 56, 23, 12, 67, 45, 10];
let NewArr = [];
let j = 0;
for (var i = 0; i < arr.length; i++) {
    if (arr[i] >= 10) {
        //新数组下标从0开始计算。依次递增
       NewArr[j] = arr[i];//将已经筛选好值的存给NewArr[j]
       j++;//每存一次值,j++一次;
    }
}
console.log(NewArr);

6.对象

JavaScript 中的对象(Object)是⼀组数据的⽆序集合.其中,每⼀条数据都是由键:值组成(例
如:name:'HanMeiMei' ).其中,值可以是任意数据类型,⽽键是字符串类型.

let obj = {};//字面量方式
let obj2 = new Object();//构造函数⽅式,并创建一个空的对象

6.1 对象的属性

//当对象中某⼀条数据的键所对应的值是⾮函数类型,则我们将这条数据叫做对象的属性。
let student = {//name 和 age 两个键对应的值都不是函数,因此这两条数据我们就叫做 student 对象的属性.
    name:'xiehang',
    age:'20'
}
console.log(student);//{ name: 'xiehang', age: '20' }

⭐对象的操作
1.通过点运算符.来操作⼀个对象的属性。
let student = {
    name:'xiehang',
    age:'20'
}
student.name = '张三';//修改已有的属性
student.number = 69;//增加没有的属性
console.log(student);//{ name: '张三', age: '20', number: 69 }

2.通过⽅括号 [] 操作⼀个对象的属性
student['name'] = '李四';
student['gender'] = '男';
console.log(student);//{ name: '李四', age: '20', gender: '男' }

3.通过 delete 关键字来删除⼀个对象的属性.
delete student.name;
console.log(student);//{ age: '20', gender: '男' }

6.2 对象的方法

//当对象中某⼀条数据的键所对应的值是函数类型,则我们将这条数据叫做对象的⽅法。
let person = {
    name:'xiehang',
    introduce:function() {////introduce 键对应的值都是⼀个函数,因此这条数据我们就叫做 person 对象的⽅法。
        console.log('my name is li si');
    }
};

1.通过.运算符访问⼀个对象的⽅法。
person.introduce();//my name is li si,调⽤ person 对象的 introduce ⽅法

2.通过[]运算符访问⼀个对象的⽅法。
person['intrduce']();//调⽤ person 对象的 introduce ⽅法

3.通过 delete 关键字来删除⼀个对象的⽅法
delete person.intrduce;//方法名后面不跟括号

6.3 对象的遍历

1.for in 
  let traversal = {
  name:'张三',
  age:20,
  gender:'男',
  introduce:function(){
      console.log('my name is lisi');
  } 
};
for (let key in traversal) {
  console.log(key);//name age gender introduce
}

6.3 对象中的this

//对象的方法中可以使用this关键字
let foo ={
    bar:function(){
        console.log(this);
    }
};
foo.bar();//对象⽅法中的 this 永远指向调⽤该⽅法时.或{}前的那个对象。如上例中 bar ⽅法的 this 就⼀定指向 foo对象

let traversal = {
    name: '张三',
    age: 20,
    gender: '男',
    introduce: function () {
        console.log('my name is'+this.name);
    }
};
traversal.introduce();//my name is 张三

6.4 对象的扩展

⭐ 对象的解构
let a = 1;
let b = 2;
let obj={a,b};
const {a:ua,b:ub}=obj;
console.log(`${ua},${ub}`);//1,2

const user2={name:'啊啊啊',age:16,protecotr:'哈哈哈',address:'熊本'}
const {name:uName,age:uAge,protecotr:uprotecotr,address:uaddress}=user2
console.log(`${uName},${uAge},${uprotecotr},${uaddress}`)