快速学习js上篇

126 阅读1分钟

简介

javaScript属于高级语言 解释型语言 计算机语言: 机器语言 汇编语言 高级语言 诞生1995年 ECMA-Script是js的一个标准 js:由ECMA-Script DOM BOM

变量与函数命名方式

    在js中所有的自主命名的都可以称为标识符
    例如:变量名,属性名,函数名都属于标识符
    1.标识符中可以含有字母,数字,_,$等
    不能以数字开头
    标识符不能是es中的关键字与保留字
    标识符规范使用驼峰命名法
    js保存底层保存标识符采用的是Unicode编码,uft-8
    所以理论上中文可以作为变量名

数据类型

     a.innerHTML="可以识别html标签";
    a.innerText="识别不出标签";
<script>
       var a =123;
       var c= "123";
       console.log(b);
       // 数据类型指的是字面量的类型
       // 前五种叫基本数据类型
       // 最后一种叫引用数据类型
       // 在js中一共有六种数据类型5+1说法
       // String 字符串
       // Number 数值
       // Boolean false/true 布尔值
       // Null 空值
       // Underfined 未定义 定义了,为赋值
       // Object 对象
       // string:字符串类型,凡是用引号包裹起来的都是字符串
       // 字符串只能双引号包单引号或者单引号包双引号
       // 字符串中引号不能嵌套
       // 字符串使用\转义
       // \"表示"
       // \'
       // \n表示换行
       // \t 表示空格
       // \\表示一个\
       // 有下标的,从0开始,有长度的
       var str = "我是:\"周周\"";
       console.log(str,str.length);
       alert("\\");
   </script>

运算

算术运算

<script>
       // 运算符也叫操作符
       // 通过运算符可以对一个或多个进行运算
       //结果属于string类型
       // 任何值加上NaN都得NaN
       // 当对于非number类型进行运算时,会将这些值转化为number类型
       // 如果对两个字符串进行相加;会进行拼串
       // 任何值和字符串做加法运算,都会转换成字符串,然后在和字符串做拼接
       //加一个空串,可以间接转换成字符串
       // + - * / 加减乘除
       var a = 123;
       var b = 456;
       var result = a + b;
       result = true + 1;
       //2
       result = true + false;
       //1
       result = 2 + null;
       // 2
       // result = 2+ NaN;
       // result = "123" +"456";
       // result = "123" + 1;
       // 1231
       // result = "false" + true;
       //"falsetrue"
       console.log(result,typeof result);
       result = 100 -"16";
       //84
       result = 100 -true;
       // 99
       result = 2 * "8";
       // 16
       result = 2 * undefined;
       // NaN
       result = 2 * null;
       //0
       result = 4 / 2;
       result = 3 / 2;
       //任何值- + * / 运算时都会自动转换成number
       var d =  "123";
       d = d * 1;
       d = d - 0;
       // %取余
       result = 9 % 3;0
       result = 9 % 4;1
       console.log(result);
   </script>

一元运算

<script>
       //只需要一个操作数,一元运算符
       var a =123;
       a = -a ;-123
       a = true;
       a = -a;-1
       a = "18";
       a = +a;18
       var result = 1 + "2"+ 3;123
       result = 1+ +"2" +3;6
       console.log("result  ="+ result);
   </script>

自增与自减

<script>
       //自增可以使变量在自身的基础上增加1
       // 自减使自身的基础上减1
       // 后减减a--;--a;会立即使原变量减1
       var a = 1;
       a++;
       a++;
       console.log(a++);3
       var result = a++ + ++a +a;
       console.log("result ="+ result,a++,++a,a);
       // a++是原值,++a加一
       var c= 11;
       // c--;
       ++c;
       console.log(c) ;
   </script>

逻辑运算符

<script>
       /*js:中有三种逻辑运算符
       !非
           !可以用来对一个值进行非运算
           所谓非运算就是值对一个布尔值进行取反操作
           如果对一个值进行两次取反,所得的值还是原来的值。
           如果对于一个非布尔值取反,先把值改成boolean值,在进行计算。
           为任意的数据类型做两次非运算,既可将其转换为布尔值
       &&与
           &&可以对符号两侧的值进行与运算并返回结果
           js中的与属于短路的与,如果第一个值为false,或者其中有false,结果都为false.
           运算规则
       

       ||或
           可以对符号两侧的值进行或运算并返回结果
           两个值只要满足一个就返回true
           js
       */
       // 非
       var a = true;
       // a = !a;
       a = !!a;
       var b = 10;
       b = !b;
       b = !b;
       var c ="holle";
       c = !!c;

       // 与
       var d = true && false;
       var f = 10 && 8;

       //或运算
       var result = true || false;
       console.log("result = " + result);
       console.log("d = " + d);
       console.log("b = " + b);

       console.log("a = " + a);
   </script>

布尔值

<script>
       /*
           对非布尔值进行或与运算时;也叫做短路
           会将其转换为布尔值,然后再运算
           与运算:如果两个值中lfalse,责会返回靠前的false
           如果第一个值为true,则必然返回第二个值
           如果第一个值为false,则直接返回第一个值
       */
       //true && true;
       var result = 1 && 0;//0
       result = Nan && 0;//NaN
       
       // 或运算:如果第一个值为true,则直接返回第一个值
       // 如果第一个为false,则直接返回第二个值
       result = 11 || 22;
       console.log(result);
        
   </script>

赋值运算

<script>
       /*
       =
       可以将符号右侧的值赋值给左侧的变量
       =读作等于,但属于赋值
       +=先加后赋值,-=先减在赋值,*=先乘后赋值,/=先除后赋值,%=先取余在赋值
       */
      var a = 123;
      a = a + 5;
      a += 5;
      a -= 5;
      a *= 5;
      a %= 5;
      console.log(a);
   </script>

关系运算符

   <script>
   //    >,<,>=,<=,==,!=,===(全等),!==(全不等)
   // 	比较运算符的运算结果是布尔值false与true
   //     >,<,>=,<=,==,!=,只比较值,不比较类型
   //     {===(全等),!==(全不等),只比较值,也比较类型}
   字符串的比较:	
   	字符串可以比较
   	字符串会转换成ascii码值,再比较
   	字母越靠后越大,小写字母永远比大写字母大	
   	从左到右比较,直到比出结果
   </script>

三元运算符

<script>
       // 三元运算符也叫条件运算符:
       // 关系运算符?真:执行语句:假执行语句
       var a = 115;
       var b = 15;
       a == b ? consolelog(a) : console.log(b);

       var x = 22;
       var y = 54;
       var z = 15;
       // 不方便阅读
       var max = x>y ? (x > z ? x : z) : ( y > z ? y : z);
       console.log(max);
   </script>

运算符优先级

<script>
       /*
       运算符优先级
       使用,可以分割多个语句一般在声明多个变量时使用,
       运算符优先级与数学中的一样,
       (先算括号)
           |
       .叫字段访问
           |
       一元运算
           |
       ++,--(自增,自减)
           |
       再算乘除,后算加减(算术运算符)
           |
       关系运算符
           |
       >,<,>=,<=
           |
       ==,===,!=,!==
           |
       与>或>非>=(逻辑运算)
           |
       三元运算符(? :)
           |
       赋值运算 (=,+=,-=,*=,/=,%=)
           
       */
      var a,b,c;
      var a=1, b=2 ,c=3;
   </script>

前自增后自增

<script>
       自增分为前自增与后自增
       // 前自增:原值加一,返回值==原值;
       // 后自增:返回值等于原始值,原值加一。
       var n1=10, n2=20;
       var n =n1++;//10
       console.log("n="+n);//10
       console.log("n1="+n1);//11
       n= ++n1;//12
       console.log("n="+n);//12
       console.log("n1="+n1);//12
       n=n2--;20
       console.log("n="+n);//20
       console.log("n2="+n2);//19
       n= --n2;18
       console.log("n="+n);//18
       console.log("n2="+n2);//18
   </script>

条件语句与循环

<script>
       /*
       我们的程序是由一条语句构成
       语句按照自上向下的顺序一条一条执行的
       在js中可以使用{}来为语句进行分组
       同一个{}中的语句我们称为一组语句
       他们要么都执行,要么都不执行
       一个{}中的语句我们也称为一个代码块
       在代码块的后边就不用在编写;了
       js中的代码块,只有分组的作用,没有其他的作用
       代码块的内容,在外面完全可见
       */
      {
          alert("123");
          console.log(1533);
          document.write("wwww");
      }
      for(var i =1;i<=10;i++){
           if(i==6)continue
           if(i==8)break

           console.log(i);

      }
   </script>
   
   <script>
       /*
       流程控制语句
       -js中的程序是从上到下一行一行执行的
       通过流程语句可以控制程序执行流程
       使程序可以根据一定的条件来选择执行
       -语句分类
       1条件语句
       2条件分支语句
       3循环语句

       条件判断语句:
       -使用条件判断语句可以在执行某个语句之前进行判断,
       如果条件成立才会执行语句,条件不成立则语句不执行

       if语句:
       -语法一单分支:
       if(条件表达式)+语句...
       if语句在执行时,会先对条件表达式进行求值判断
       如果条件表达式的值为true,则执行if后的语句
       如果条件表达式的值为false,则不会执行if后的语句。
       if语句只能管紧随其后的那个语句
       如果希望if语句控制多条语句,
       可以将这些语句放到代码块中
       if 语句后的代码块不是必须的,但是在开发中尽量写上
       */
      var a = 10;  
      if(false)
      alert("hello");
      if (a == 10){
       alert("hello");
       alert("谁也管不了");
      }
      a = 15;
      if(a>10 && a<=20){
       alert("a大于10,并且a小于等于20")
      }
      
   </script>
   
   
   <script>
       /*
       if语句
           从上往下执行,第一个条件满足,就不在往下执行
           —语法二双分支:
               if(条件表达式){
                   语句...
               }else{
                   语句...
               }
               if...else...
               当该语句执行时,会先对if后的条件表达式进行求值判断,
               如果该值为true,则执行if后的语句
               如果该值为false,则执行else后的语句
           —语法三(可以无限套娃):
           if(条件表达式){
               语句...
           }esle if(条件表达式){
               语句...
           }esle if(条件表达式){
               语句...
           }else{
               语句...
           }
           if...else...if...else...
           当该语句执行时,会从上到下依次对条件表达式进行求值判断
           如果求值为true,则执行当前语句,
           如果值为false,则继续向下判断
       */
      var age = 50;
      if(age >= 60){
          alert("你已经退休~~");
      }else{
       alert("你还没有退休~~");
      };
      if(age > 100){
          alert("活着没意思~~");
      }else if(age>80){
          alert("你也老大不小了");
      }else if(age>60){
          alert("你也该退休了");
      }else if(age > 30){
          alert("你已经到中年了");
      };
   </script>
   
   
   <script>
       /*
       条件分支语句也叫Switch语句
       -语法
       执行流程:
       在执行时会一次将case后的表达式的值和Switch后的条件表达式进行全等比较
       case后面的值属于全等,后面跟着一个固定的值
       如果比较结果为true,则从当前case处开始执行代码,我们可以在case
       后面跟着break关键字,可以确保代码只执行到这,不在往下执行
       如果比较结果为false,则继续向下比较
       如果一直不满足条件,则执行default后的代码
       switch(变量){
           case 固定值:
               语句...
               break;
           case 固定值:
               语句...
               break;
           default:
               语句...
               break;
       }
       */
      var num = i3;
      if(num == 1){
       console.log("壹");

      }else if(num == 2){
       console.log("贰");
      }else if(num == 3){
       console.log("叁");
      }
      switch(num){
       case 1:
           console.log("壹")
       break;
       case 2:
           console.log("贰")
       break;
       default :
       console.log("叁");
      }
   </script>
   
   
   <script>
       /*
       while循环
           -语法
           while(条件表达式){
               语句...
           }
           while语句在执行时,
           先对条件表达式进行求值,
               如果值为true,则执行循环体
                   循环体执行完毕以后,继续对表达式进行判断
                       如果值为false,则终止循环体
           创建一个循环往往需要三个步骤
           1.创建一个初始化的变量
           在循环体中设置一个条件表达式
           定义一个更新表达式,每次更新表达式

       do...while循环
           -语法
           条件不成立do...while也会执行一次
           do{
               语句...
           }while(条件表达式);
           执行顺序会先执行循环体
           在对while条件表达式进行判断
           结果为true,则继续执行循环体,执行完毕继续以此类推
           如果结果为false,则终止循环体

           do...while...先执行在判断
           while 先判断,在执行
       */
      var n = 101;
      do{
          document.write(n++ +"<br>");
      }while(n<100);
   var a=0;
   while(a<10){
       document.write(a+"<br>");
       a++;
   }
   </script>
   
   
   <script>
       /*
       for语句,也是一个循环语句,也成为了for循环
       在for循环中,语法原理,与while写法相等
       var i=0;定义变量只执行一次
       var<10;每次执行n
       i++;执行了n-1
       for循环执行流程
           1执行初始化表达式,初始化变量
           2执行条件表达式,判断是否执行循环
           如果true,则执行循环3
           如果为false,终止循环
           4执行更新表达式,更新表达式执行完毕继续重复2
       
           for循环的三个部分都可以省略,也可以写在外部
           如果在for循环中,不写任何的表达式,只写两个;
           此时循环是一个死循环,慎用
       */
      for(let i=0;i<10;i++){
          console.log(i);
      }
      var c = 0;
      for(;c<10;){
       //    alert(c++);
       c+=c;
       c++;
      }
      document.write(c);
      var b = 0;
      while(b<10){
       console.log(b);
       b++;
      }
      document.write(b);
   //    死循环
   //    for(;;){
   //        alert("123");
   //    }
   // for break直接终止循环 break后面的代码不会输出
   for(var i=0;i<100;i++){
       if(i==10)
       break
   }
   </script>

数组


<script>
       /*
       对象分为:
       内建对象
       宿主对象
       自定义对象
       数组(Array)
       数组也是对象
       一维有序数据的集合,每个数据都有对应的编号,可以通过快速检索数据
       它和普通对象功能类似,也是用存储一些值的
       不同于普通对象,是使用字符串作为属性名的,
       而数组时使用数字来作为索引操作元素
       -索引index
           从0开始的整数
       数组的存储性能比普通对象更好,所以在开发中我们经常使用数组来存储一些数据

       */
       //创建一个数组对象
       var arr=new Array();

       /*
       向数组中添加元素(增)
       语法:数组[索引]=值
       向数组最后添加数据
       arr[arr.length]=...

       读取数组中的元素(查,改)
       语法:数组[索引]
       索引比长度小1
       如果读取不存在的索引,他不会报错而是undefined

       获取数组长度
       可以使用length属性来获取连续数组的长度(元素的个数)
       对于非连续的数组,使用length会获取到数组的最大索引加1
       尽量不要创造非连续的数组
       
       修改length
       如果修改的length大于原长度,则多出的部分会空出来
       如果修改的length小于原长度,则多出的元素会被删除

       删除
       arr=[];
       arr.length=0;
       arr=null;
       */
      arr[0]=10;
      arr[1]=12;
       //    arr[5]=2;
       // 向最后一个元素添加元素
       arr[arr.length]=45;
       // arr=null;
       console.log(arr);
   //    console.log(arr.length);
   //    console.log(arr[0]);
   //    console.log(arr[2]);
       
   var a= [1,2,2,2,3,4,5,2];
   var b=[];
   
   for(index in a){
       if(a[index]!=2){
           b[b.length]=a[index];
           
       }
   }
   console.log(b);
   </script>
   
   <script>
       // 使用构造函数创建数组
       //也可以同时添加元素,将要添加的元素作为构造函数的参数传递
       var arr= new Array(1,1,2,36,45);
       // 使用字面量来创建数组
       var arr =[1,2,3,4,5,6,7];
       //使用字面量创建组数是,可以在创建时就指定数组中的元素
       console.log(arr,arr.length);
       //数组中的元素可以是任意数据类型,可以是函数,对象,数组
       var arr1=["aaa",true,false,{a:123,},null,[1,2,4,],{s:"arr"}];
       // 二维数组,三维数组,四维数组
       arr1 =[[1,2,3],[,4,5,6],[,7,8,9,10],[12,11]];
       console.log(arr1,arr1.length);
   </script>
   
   <script>
       //字面量创建一个数组
       var arr=["猪八戒","孙悟空","沙和尚"];
       // push() 方法向数组末尾添加一个或者多个长度,并返回新长度,改变原来的数组
       // 可以将要添加的元素作为方法的参数,可以传递多个,可以传递为一个数组
       // 这样这些元素将会自动添加到数组的末尾    
       //该方法会将新的数组长度作为返回值返回
       
       var result=arr.push("唐僧","张三","李四");
       console.log(arr,result);
       // unshift() 方法将新项添加到数组的开头,并返回新的长度,改变原来的数组
       var a =arr.unshift("112233",44556);
       console.log(a);
       // pop() 方法移除数组的最后一个元素,并返回该元素,会改变原来的数组
       var b=arr.pop();
       console.log(b);

       // shift() 方法移除数组的第一项。
       // 注释:shift() 方法会改变数组的长度。
       // 注释:shift 方法的返回值是被移除的项目。
       // 注释:shift() 方法会改变原始数组。
       var c=arr.shift();
       console.log(c,arr);

       // splice(开始的下标,删除个数,要替换的值)替换/删除/添加
       // 返回的值:新的数组,数组里包括删除的
       // 会改变原来的值
       console.log(arr);
       item=arr.splice(0,1,"000");
       console.log(item,arr);

       // reverse() 方法反转数组中元素的顺序。
       // 返回值与原来的纸一样
       // 注释:reverse() 方法将改变原始数组。
       console.log(arr.reverse());

       // join() 方法将数组作为字符串返回。
       // 返回字符串,原来的值不变
       // 元素将由指定的分隔符分隔。默认分隔符是逗号 (,)。

       // 注释:join() 方法不会改变原始数组。
       console.log(arr.join("-"));

       // indexOf()寻找相应元素的下标,返回第一个对应的值的下标,判断为全等,找不到为-1
       arr=[123,456,23,13];
       arr.indexOf(13);
       arr.lastIndexOf(13);
       console.log(arr.indexOf(13));
       console.log(arr.lastIndexOf(13));
       
   </script>
   
   <script>
       var arr=[11,22,33,44];
       // 所谓的遍历数组,就是将数组中所有的元素都取出来
       // for循环遍历
       // for(i=0;i<arr.length;i++){
       //     console.log(arr[i]);
       // }
       
       // 不允许break,continue跳出,返回值为undefined

       // arr.forEach(function(currentValue,index,arr){
       //     console.log(index,currentValue);
       // });
       // for in 循环
       // 字符串也可以使用for in 循环
       // 改了增加数组长度,不会改变循环的次数
       // 其他遍历增加数组长度,会改变循环的次数
       // var arr="123456789";
       for (index in arr){
           console.log(index);
           // index类型属于字符串
       }
       // for of 循环,不能获取下标
       for(item of arr){
           console.log(item);
       }

       // for-of 无法遍历 不可迭代对象
       // 可迭代对象包括: Array,Map,Set,String,TypedArray,arguments等等
       // for…in 遍历键名,for…of 遍历键值
       // 相对于数组自带的 forEach 方法,for…of 可以与 break、continue 和 return 配合使用。
       // for-of 遍历的是值,for-in遍历的是index
   </script>

对象

<script>
       // 使用new关键字调用的函数,是构造函数constructor
       // 构造函数是专门创建对象的函数
       var obj=new Object();
       //  var 变量={key:value};
       // 键值对
       // 在对象中保存的值称为属性
       // 向对象中添加属性
       // 语法:对象.属性名=属性值
       obj.name="孙悟空";
       obj.gender="男";
       obj.age=20;
       console.log(obj);
       // 读取对象属性
       // 语法:对象.属性名
       //如果读取对象中没有的属性,不会报错而时会返回undefined
       console.log(obj.name);
       // 修改对象的属性名
       // 语法:对象.属性名=新值
       obj.name="tom";
       console.log(obj);
       // 删除对象属性
       // 语法delete 对象.属性名
       // obj={};删除所有的
       delete obj.age;
       console.log(obj);
       var obj2={
           name:"张三",
           age:28,
           nicknane:"tom"
       }
       // 对象的遍历
       for(let key in obj2){
           console.log("age" in obj2);
           console.log(key);
           console.log(delete obj2.nicknane);
       }
       
   </script>
   <script>
       // 对象属性名不强制要求遵循标识符的规范
       // 但是尽量使用标识符的规范去做
       // 另一种添加属性的方法
       // 语法:对象["属性名"]=属性值;
       // 使用[]这种形式操作属性,更加灵活,可以传变量
       var obj=new Object();
       obj.name ="孙悟空";
       obj["age"]=24;
       var n="name";
       console.log(obj[n]);

       // 属性值
       // js对象的属性值,可以是任意数据类型
       obj.test=false;
       console.log(obj.test);
       // in 运算符
       // 通过该运算可以检查一个对象中是否含有指定的属性
       // 有返回true,没有返回false
       // 语法:"属性名" in 对象
       console.log("a" in obj);
   </script>
   
    <script>
       //基本数据类型(不异变)
       //String null undfined number Boolean
       // 基本数据类型的值是在栈内存中储存
       // 值与值之间是独立存在,修改一个变量不会影响其他的变量
       var a =123;
       var b= a;
       a++;
       console.log(a,b);//124 123
       //引用数据类型(容易异变)
       // 对象是保存在堆内存中的,每创建一个新的对象,就会在堆内存中开辟一个新的空间
       // 而变量保存的是内存地址(对象的引用)
       var obj=new Object();
       var obj2=obj;
       obj.name="孙悟空";
       obj.name="猪八戒";
       console.log(obj.name)//"猪八戒"
       console.log(obj2.name)//"猪八戒"
   
   </script>
   
   <script>
       // 使用工厂方式创建的对象,使用构造函数都是object
       // 所以创建的对象都是object类型
       // 所以导致我们无法区分他们的类别
       // 构造函数习惯首字母大写
       // 构造函数与普通函数的区别就是调用方法的不同
       // 普通函数是直接调用,而构造函数需要使用new关键字调用
       // 构造函数的执行流程:
           // 1立即创建一个新的对象
           // 2.将新建的对象设置为函数中的this,在构造函数中可以使用this引用新建的对象
           // 3.逐行执行函数的代码
           // 4.将新建的对象作为函数返回值返回
       // 使用构造函数创建的对象是同一类对象,也将一个构造函数称为一个类
       // 我们将通过一个构造函数创建的对象,称为该类的实例
       // 使用instanceof可以检查一个对象是否一个类的实例
       function Person(name,age,gender){
           this.name=name;
           this.age=age;
           this.gender=gender;
           this.sayName=function(){
               alert(this.name)
           }
       };
       var per =new Person("孙悟空",24,"男");
       var per1 =new Person("嫦娥",18,"男");
       var per2 =new Person("猪八戒",1024,"男");
       console.log(per);
       console.log(per1);
       console.log(per2 instanceof Person);
       // 所有的对象都是object实例,用instanceof检查都是true
       console.log(per2 instanceof Object);
       // this当以函数形式调用时,this就是window
       // 当以方法的形式调用时,this就是就是调用的这个对象
       // 当以构造函数调用时,this就是新创建的对象
   </script>
   
   
   <script>
       // 原型prototype
       // 我们所创建的每一个函数,解析器都会想函数中添加一个属性prototype 
       // 这个属性对应的对象,这个对象就是所谓的原型对象
       // 当以构造函数形式调用时,它所创建对象中都会有一个隐含的属性
       // 指向该构造函数的原型对象,我们可以通过__proto__来访问该属性
       // 原型对象就相当于一个公共区域,所有的同一个类的实例都可以访问到这个原型对象
       // 当我们访问对象的一个属性或者方法时,它会先在自身中寻找,如果有则直接用,
       // 没有则去原型对象中寻找,如果找到则直接使用
       // 以后我们创建构造函数时,可以将这些对象共有的属性与方法,统一添加到构造函数的原型对象中
       // 这样就不用分别为每一个对象添加,也不会影响到作用域,就可以使每一个对象都具有这些属性与方法
       function Person(name){
           this.name=name;
           Person.prototype.sayName=function(){
               alert(this.name);
           }
       }
       console.log(Person.prototype)
       console.log(Person.prototype.__proto__.__proto__)
       var per=new Person("123");
       per.sayName();
       console.log(per.__proto__);
   </script>

原型.webp