• js入门 |ECMAScript 标准


    前言

    JS分为三个部分

    • ECMAScript 标准----js的基本的语法
    • DOM------Document Object Model 文档对象模型
    • BOM-----Browser Object Model 浏览器对象模型

    JavaScript是什么

    • 一门运行在客户端的脚本语言、一门解释性语言、一门动态类型的语言、一门基于对象的语言。

    • 编译语言:需要把代码翻译成计算机所认知的二进制语言,才能够执行;脚本语言:不需要霸译,直接执行,常见的脚本语言有t-sql,cmd。

    JS应用场景

    1. 网页特效
    2. 服务端开发(Node.js)
    3. 命令行工具(Node.js)
    4. 桌面程序(Electron)
    5. App(Cordova)
    6. 控制硬件-物联网(Ruff)
    7. 游戏开发(cocos2d-js)

    变量

    什么是变量
    变量是计算机内存中存储数据的标识符,根据变量名称可以获取到内存中存储的数据

    如何使用

    • 声明:有变量名 没有值
      var age
      
    • 初始化赋值:有名有值
      var age=18
      
    • 其他写法
      var num1 num2 num3
      num1=1;
      num2=2;
      num3=3
      
      var num1=1 num2=2 nume=e
      

    数据类型

    Number

    • init——整数
    • float——浮点数
    • double

    数值判断

    • NaN:与任何值都不相等包括它本身
    • isNaN:验证结果是否为NaN;判断不是一个数字,不是为true

    操作符

    • 算术运算符: + - * %, /(取余)——加减乘除
    • 一元运算符:++ --——只需要一个操作数即可计算
      var num=10
      num++ //10
      ++num  //10
      num++ +10 //20
      ++num +10 //21
      //num++先参与运算后才自身++,
      //++num先自身++后再参与运算
      
    • 二元运算符:+ - * % /——需要两个操作数
    • 三元运算符
    • 复合运算符|赋值运算符:+= -= *= /= %=
      num+=10
      num=num+10
      
    • 关系运算符:> < >= <= == === != !==
      var str="5"
      var num=5
      console.log(str==num)//true,==不严格,只需要值相等而数据类型不一定
      console.log(str===num)//false ===严格,要求值与数据类型都相等
      
    • 逻辑运算符:&& ||

    String

    在js中,无论是单引号还是双引号都是字符串,它可以看成一个数组

    字符串拼接

    用“+”连接,拼接两个字符串。如果另一个是数字,不会计算结果;如果其中一个字符串里面是数字,另一个是数字,用的不是“+”,会隐式转换,有计算结果

    转义字符

    除了普通的可打印字符以外,一些特殊有特殊功能的字符可以通过转义字符的形式放入字符串中

    转义序列 含义
    \n 换行
    \r 回车
    " 双引号

    Boolean

    【false】判断为flase的几种情况:
    	1. undefined(未定义,找不到值时出现)
    	2. null
    	3. false(布尔值的false,字符串"false"布尔值为true)
    	4. 0(数字0,字符串"0"布尔值为true)
    	5. NaN(无法计算结果时出现,表示"非数值")
    	6. ""或''(空字符串,空格时为true)
    	
    【注意】空数组空对象,负值转的布尔值时都为true
    

    nulL

    表示一个空,变量的值如果想为null,必须手动设置
    

    Undefined

    声明而没有赋值;函数没有明确返回值
    

    Array

    声明注意

    var arr=new Array(5)//数组内有五个undefined元素
    var arr=new Array(5,6,7,8)//[5,6,7,8]
    

    数组特性

    • 数组元素:数组内的数据;元素的数据类型可以多样
    • 数组长度:数组内元素个数arr.length
    • 数组索引:根据索引获取指定的数组元素arr[0]

    相关案例

    //案例1:去掉数组中重复的0
    var arr=[1,0,3,0,5,0,7]
    var newArr=[]
    for(var i=0;i<arr.length;i++){
    	if(arr[i]!=0){
    		newArr[newArr.length]=arr[i]
    	}
    }
    
    //案例2:冒泡排序从小到大
    var arr=[10,0,100,20,60,30];
    for(var i=0;i<arr.length-1;i++){
    	for(var j=0;j<arr.length-1-i;j++){
    		if(arr[j]>arr[j+1]){
    			var temp=arr[j];
    			arr[j]=arr[j+1];
    			arr[j+1]=temp;
    		}
    	}
    }
    

    Function

    声明与调用

    • 命名函数
      //函数声明
      function funcName(){函数体}
      
      //函数调用
      funcName()
      
    • 匿名函数:不能直接调用
      //函数声明
      function(){}
      
      //调用方法1:把函数给一个变量才能调用,这里称为函数表达式
      var f1=function(){}
      f1()
      
      //调用方法2:将函数包裹在括号内,也称自调用函数
      (function(){})()
      

    函数参数

    • 形参:函数在定义的时候括号里面的变量叫做形参

    • 实参:函数在调用的时候括号里传入的值

      function sum(x,y){
          var sum=x+y
          console.log(sum)
      }//x,y为形参
      
      console.log(2,3)//2,3为实参
      //注意:形参与实参的参数数量可以不一致,但可能实现不了预期效果
      
    • arguments:可以获取每个传入的参数值,即实参。它是一个伪数组

      function f1(){
      	console.log(arguments.length)//6
          console.log(arguments)//[1,2,3,4,5,6,collee:f...]
      }
      f1(1,2,3,4,5,6)
      
    • 回调函数:即当函数作为参数使用时,这个函数就称为回调函数

      function f1(fn){
      	fn()//将函数作为变量、参数传进去,之后被调用
      }
      
      function f2(){这是一个将要被作为参数的函数}
      f1(f2)//传入f2函数,此时f2函数作为参数传入,被称为回调函数。传入的是函数的代码,不需要加括号;如果加括号了就是传入了函数的返回值
      

    函数作用域

    • 全局变量:全局变量可以在页面的任何位置使用。函数域外定义的变量都是全局变量。如果页面不关闭就不会释放,会占用内存。

    • 局部变量:在函数内部定义的变量

    • 隐式全局变量:声明的变量没有var,区别在于没有var的变量会被轻易删除

    • 全局作用域:全局变量的使用范围

    • 局部作用域:局部变量的使用范围

    • 块级作用域:一对大括号,里面的变量只能在里边使用js只有函数内是块级作用域

    • 作用域链:函数会在内部逐级调用;在内部的变量会在当前作用域找,如果找不到,会依次往外围作用域寻找

      var num=10//---0级作用域
      function f1=(){
          var num=20//---1级作用域
          function f2(){
              //var num=30---2级作用域
              console.log(num)//由于2级作用域的num被注释了,就往上找,在1级作用域中找到num,输出20
          }
          f2()//在f1中调用其内部的f2,f2才会被执行
      }
      f1()//调用f1,会循循往里深入
      

    预解析

    提前解析代码。它可以把变量的声明提前,提前到当前所在作用域的最上面,即函数内的变量只会提前到函数内部的最上边;函数的声明也会被提前,提前到当前所在作用域的最上面

    //原本形式
    console.log(num)//输出undefined
    var num=10
    
    //预解析后
    var num//预解析会把声明放在上边
    console.log(num)//输出undefined
    num=10
    
    //原本形式
    function f1(){
        console.log(num)//undefined
        var num=10
    }
    
    //预解析后
    function f1(){
        var num
        console.log(num)//undefined
        num=10
    }
    console.log(num)//报错,因为变量只是提前到当前作用域最上边,外部没有声明
    
    //原本形式
    f1()
    function f1(){}
    
    //预解析后
    function f1(){}
    f1()
    
    var a=25;
    function f1(){
    	alert(a)//输出undefined。
        var a=10
    }
    //预解析会把a的声明提前,即alert上边是var a
    //在这里a由于没有值,可以理解为a被赋值undefined
    //所以函数能在内部找到a变量,
    //所以函数不会根据作用域链的原理往外找外边的a变量,而只是输出内部的undefined
    
    f1()
    console.log(a)//报错
    console.log(b)//9
    console.log(c)//9
    function f1(){
        var a=b=c=9;
        console.log(a)//9
        console.log(b)//9
        console.log(c)//9
    }
    //解析:首先函数预解析后会被提前,函数可调用。其次,函数内部的变量声明会被提前,即:
    //var a;a=9;b=9;c=9;
    //在这里,a是局部变量,而b和c是隐式全局变量,故b和c外部可以访问,而外部访问局部变量a的时候会报错
    
    f1()
    var f1=function(){
    	console.log(a);
        var a=10;
    }
    //结果:报错,函数不能调用
    //解析:注意,这里的f1是一个变量,首先变量的声明会被提前,即:
    //var f1;
    //f1()
    //在这里,f1不是一个函数,而是一个没有被赋值的变量 ,所以f1无法调用,报错
    

    函数的返回值

    • return后面的值称之为返回值,注意,当你需要返回值,调用函数之后需要定义一个变量接收;return后面的代码不会执行

      function getSum(x,y){
          return x+y
      }
      //定义变量接收返回值
      var result=getSum(x+y)
      console.log(result)
      
      function getSum(x,y){
          return x+y
      }
      //这里表示先调用再输出返回值
      console.log(getSum(x,y))
      
    • 函数作为返回值使用

      function f1(){
          return function(){我是返回的匿名函数}
      }
      var f2=f1()//在这里,f2就成了f1返回的那个匿名函数,即f2=function(){我是返回的匿名函数}
      f2()//调用返回的匿名函数
      

    函数案例

    //求n-m内数字的和
    function getSum(n,m){
        var sum=0;
        for(var i=n;i<m;i++){
            sum+=i;
        }
        return sum
    }
    console.log(getSum(1,100))
    
    //求圆的面积
    function getS(r){
        return Math.PI*r*r;
    }
    console.log(getSum(10))
    
    //求一组数字的和
    function getSum(array){
        var sum =0;
        for(var i-0;i<array.length;i++){
            sum+=array[i]
        }
        return sum
    }
    console.log(getSum([1,2,3,4]))
    

    注意事项

    • 函数需要先定义才能使用
    • 函数名字:遵循驼峰命名法
    • 函数一旦重名,后面的会把前面的覆盖掉
    • 一个函数最好是一个功能

    函数部分的内容会在这篇文章有更多细节的展开

    Object

    编程思想

    • 面向过程:每件事都自己做,具体过程都要知道,注重过程
    • 面向对象:根据需求找对象,所有的事都用对象来做,注重结果

    面向对象

    • 特性:封装,继承,多态(抽象,可模拟特性)
    • js不是面向对象的语言,但是可以模拟面向对象的思想,js是一门基于对象的语言,即本身有对象可以直接用。
    • 对象:有特征和行为,具体特指某一个事物

    创建对象的方式

    引入
    instanceof ,判断变量是否属于某类型,语法:变量 instanceof 类型的名字
    xiaoming instanceof Object——判断小明是否属于对象

    1. 调用系统的构造函数

      //语法
      var 变量名=new Object()
      
      
      //实例化对象
      var xiaoming=new Object()
      //添加属性
      xiaoming.age=18
      xiaoming.sex="男"
      //添加方法(行为)
      xiaoming.sleep=function(){
        console.log("我天天睡懒觉")
      }
      //获取与调用
      console.log(xiaoming.name)
      xiaoming.sleep()
      
      //在当前的对象的方法中,可以使用this关键字代表当前对象
      xiaoming.sleep=function(){console.log("我天天睡懒觉,我是"+xiaoming.name)}
      xiaoming.sleep=function(){console.log("我天天睡懒觉,我是"+this.name)}
      
    2. 工厂模式

      需求:第一种方法无法一次性创建多个对象,我该怎么做?

      解决:把创建对象的代码封装在一个函数中

      function createPerson(){
          var person=new Object();//---1.创建对象
          person.name="小明";//---2.添加属性
          person.age=18;
          person.sayHi=function(){
              alert('你好,我叫'+this.name+"我今年"+this.age+"岁")
          }//---3.添加方法
          return person//---4.返回对象
      }
      
      //使用:创建人的对象
      var person1=createPerson()
      person1.sayHi()//---此时就能使用封装函数内定义的属性和方法
      

      需求:上面的方法只能创建相同的对象,但我要不同的,我该怎么办?

      解决:传入变量

      function createPerson(name,age){
          var person=new Object();
          person.name=name;//在这里,左边的person.name是个属性,右边name是个变量
          person.age=age;
          person.sayHi=function(){
              alert('你好,我叫'+this.name+"我今年"+this.age+"岁")
          }
          return person
      }
      
      var person1=createPerson("小明",18)
      
    3. 自定义构造函数

      需求:不能分辨出对象到底属于哪个对象类型?怎么办?

      解决:自定义构造函数。

      function Person(){
          this.name="小明";
          this.age=18;
          this.sayHi=function(){
              alert('你好,我叫'+this.name+"我今年"+this.age+"岁")
          }
      }
      
      var person1=new Person()
      console.log(person1 instanceof Person)//true
      
      function Person(name,age){
          this.name=name;
          this.age=age;
          this.sayHi=function(){
              alert('你好,我叫'+this.name+"我今年"+this.age+"岁")
          }
      }
      
      var person1=new Person("小明",18)
      console.log(person1 instanceof Person)//true
      

      与工厂模式对比,少了new Object()和return;属性与方法直接用this而不用person。构造函数与函数的区别:名字上,构造函数首字母要大写;调用上,没有区别

      自定义构造函数创建对象做了四件事

      1.开辟空间,储存创建的新对象

      2.把this设置为当前对象

      3.设置对象的属性和方法的值

      4.返回创建后的新对象

    4. 字面量的方式

      //1.原始写法
      var person={}//创建了一个空对象
      person.name="小明";
      person.age=18;
      person.sayHi=function(){
        alert('你好,我叫'+this.name)
      }
      
      //2.优化后的写法
      var person={
        name:"小明",
        age:20,
        sayHi:function(){
            alert('你好,我叫'+this.name)
        }
      }
      

      缺陷:它是一次性的对象,无法轻易改值,只能在对象内部更改。即对象一开始就被写死

    访问与修改属性

    • obj.nameobj.name="小明"
    • obj["name"]obj["name"]="小明"

    JSON

    json也是一个对象,一般json格式的数据无论是键还是值都是用双引号括起来的

    值类型与引用类型

    • 基本类型(值类型):number,string,boolean
      值类型的值在中储存。值在栈。
    • 复杂类型(引用类型):object
      引用类型的值在栈和堆中储存。对象在堆,引用(地址)在栈

    在这里插入图片描述

    • 值类型作为函数的参数时,传递值

      function f1(x){
      	x=100;
      }
      var num=10
      f1(num)  
      console.log(num)//10
      //解析:f1调用相当于在栈创建了一个内存=> x=100
      //函数内部可以这样理解:var x;x=100 传进来的参数10自动化为变量x
      
    • 引用类型作为函数的参数时,传递的是地址

      var obj={name="小明"}
      function f2(obj2){
      	obj2.name="小红"
      }
      console.log(obj.name)//"小明"
      f2(obj);
      console.log(obj.name)//"小红"
      //解析:f2调用相当于传递obj的地址,进而在堆的找到地址上进行修改。这里obj和obj2指向的是同个地址
      

    内置对象

    JS包括三种对象

    • 内置对象——js系统自带的对象
    • 自定义对象——自定义构造函数创建的对象
    • 浏览器对象——BOM
    • 实例对象:通过构造函数创建出来,实例化的对象
    • 静态对象:不需要创建,静态方法直接通过这个对象的名字调用
    1. Math,它具有数学常数和函数的属性和方法。它不是一个构造器,不能直接new实例化。

      //属性
      Math.E//自然对数的底数e==>2.718281828459045
      Math.PI//圆周率
      
      //方法
      Math.abs(-2)//取绝对值==>2
      Math.ceil(10.1)//向上取整==>11
      Math.floor(10.1)//向下取整==>10
      Math.max(1,2,3,4)//获取最大值==>4 
      Math.random() //返回一个0-1的浮点
      

      [案例1]在1-10中获取随机数

      parseInt(Math.random()*10+1)
      

      [案例2]自定义构造函数,实现取最大值

      function MyMax(){
      	this.getMax=function(){
              var max=arguments[0];
              for(var i=0;i<arguments.length;i++){
                  if(max<arguments[i]){
                      max=arguments[i]
                  }
              }
              return max
          }
      }
      
      var mt=new MyMath();
      var result=mt.getMax(10,20,30)
      console.log(result)//30
      

      [案例3]随机生成一个十六进制的颜色值

      function getColor(){
          var str="#"
          //十六进制的值的数组
          var arr=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]
          //生成十六进制的6个索引
          for(var i=0;i<6;i++){
              //随机生成arr数组的索引,以根据索引获得里面的值
              var num=parseInt(Math.random()*16);
              //拼接字符串
              str+=arr[num]
          }
          return str
      }
      
    2. Date,创建date实例来处理时间和日期,可以new实例化

      //与Math不同,Date首先要实例化
      var dt=new Date()//表示实例化时刻的日期和时间。已自动转换成字符串类型
      
      dt.toDateString()//英文格式==>Fri Jul 31 2020
      dt.toLocaleDateString()//数字格式==>2020/7/31
      dt.toTimeString()//小时分钟秒==>16:16:12 GMT+0800 (中国标准时间)
      dt.toLocaleTimeString()//小时分钟秒==>下午4:16:12
          
      dt.getFullYear()//获取年份
      dt.getMonth()+1//获取月份,这里的月份是从0开始算的
      dt.getDate()//获取日期
      dt.getHours()//获取小时
      dt.getMinutes()//获取分钟
      dt.getSeconds()//获取秒
      dt.getDay()//获取星期,0指的是星期日
      

      [案例1]封装函数——格式化后的指定格式的日期和时间

      指定的格式:2020年7月31日 16:16:12
      
      function getDate(dt){
          var year=dt.getFullYear();
          var month=dt.getMonth()+1;
          var day=dt.getDate();
          var hour=dt.getHours();
          var minute=dt.getMinutes();
          var second=dt.getSeconds();
          
          month=month<10?"0"+month:month;
          day=day<10?"0"+day:day;
          hour=hour<10?"0"+hour:hour;
          minute=minute<10?"0"+minute:minute;
          second=second<10?"0"+second:second;
      
          return year+"年"+month+"月"+day+"日"+hour+":"+minute+":"+second
      }
      
      //调用
      getDate(new Date())
      
    3. String,全局对象,用于字符串或一个字符串序列的构造函数

      string:字符串类型——值类型 var str="hello"
      String:字符串类型——引用类型 var str=new String("hello")
      一个字符串既是值类型又是引用类型。以上两种方式声明的字符串都可以被认为是实例化的一个对象,即都可以使用内置的方法。区别在于是否使用了内置方法和属性。

      字符串特性:不可变性,即字符串原来的值不可改变

      //这里的改变是因为重新赋值了
      var str="hello"//这里在堆生成了地址1
      str="hi"//这里在堆生成了地址2,原来的地址1没改
      console.log(str)//hi  这里是因为地址的指向发生改变
      
      
      //不可变性
      var str="hello"
      str[1]="w"//字符串可以通过索引访问某个值,但是只可以访问不能修改,即只读
      console.log(str)//hello
      

      属性与方法

    • string.length

      返回字符串的长度

      var str="hello"
      str.length//5
      
    • chartAt()

      输入索引,找到该索引位置的值。语法:str.chartAt(索引)。如果指定的索引超出了该范围,则返回一个空字符串

      var str="hello"
      str.charAt(2)//l
      
    • concat()

      合并字符串,并返回一个新的字符串。语法:str.concat(字符串1,字符串2,字符串3...)

      var str="hello"
      str.cancat('my','name','is','xiaoming')//hellomynameisxiaoming
      
    • indexOf()

      返回字符串中第一次出现指定值的索引,只找一个。语法:str.indexOf(指定值,从哪里开始找),第二个参数默认是0;如果未找到该值,则返回 -1;区分大小写

      //通常用法
      var str="Blue Whale"
      str.indexOf("Blue")		   // 返回 0
      str.indexOf("Blute")       // 返回 -1
      str.indexOf("Whale", 5)    // 返回 5
      str.indexOf("blue")        // 返回 -1
      
      //检测是否存在某字符串
      str.indexOf('Blue') !== -1    // true
      str.indexOf('Bloe') !== -1    // false
      
    • includes()

      判断一个字符串是否包含在另一个字符串中,根据情况返回 true 或 false。语法:str.includes(要找的字符,从哪开始])区分大小写

      var str= "Blue Whale"
      str.includes('blue'); // false
      
    • match()

      返回一个字符串匹配正则表达式的的结果。语法:str.match(regexp)

      正则表达式相关知识请看这篇文章

        var str="中国移动10086;中国联通10010"
        var array=str.match(/\d{5}/)//这样只能匹配一个
        var array=str.match(/\d{5}/g)//全局匹配 ["10086","10010"]
      
    • replace()

      如果与正则表达式相匹配,就将这个字符串替换成自己想要的
      语法:str.replace(regexp|substr, newSubStr|function)

        var str="小明睡懒觉了"
        str=str.replace(/睡懒觉/,"起床")
        console.log(str)//小明起床了
      
    • slice()

      输入开始索引与结束索引,截取其中间的字符。语法:str.slice(开始索引,结束索引),从第一个索引开始,到第二个索引前结束。

      var str = 'The morning is upon us.'
      str.slice(1, 8)//he morn
      
    • substr()

      从指定位置开始,直到满足指定字符数后结束,返回字符串。语法:str.substr(开始索引,字符数),如果后面没有参数,则返回从索引开始到结束的字符串。

        var str = "abcdefghij";
          str.substr(1,2);   // bc
          str.substr(1);     // bcdefghij
      
    • toLocaleLowerCase()

      把字符串转换为小写的格式。

      var str=HELLO
      str.toLocaleLowerCase()//hello
      
    • toLocaleUpperCase()

      把字符串转换为大写的格式。

      var str=hello
      str.toLocaleLowerCase()//HELLO
      
    • split()

      用特定分隔符认定字符串中需要分割的位置,分割成数组。语法:str.split(分隔符,切割后留下的个数)

        var str = "Hello World. How are you doing?";
        str.split(" ", 3)//["Hello", "World.", "How"]
      
    • String.fromCharCode()

      返回使用指定的Unicode值的序列创建的字符串。静态方法,即不能通过实例化直接调用,而是直接用大写的String调用

        String.fromCharCode(65)//A  如果输入多个则返回拼接后的字符串
      

      [案例]找到这个字符串中索引a出现的位置

      var str="asjdhqohkjasekcaxa"
      var index=0//开始的位置
      var key="a"//要找的字符串
      while((index=str.indexOf(key,index))!=-1){
      	console.log(index)
          index+=key.length
      }
      
    1. Array 数组对象是用于构造数组的全局对象
    • forEach()
      遍历数组。对数组的每个元素执行一次给定的函数,不会改变原数组。这个函数不能终止循环
      语法:arr.forEach(item,(index)=>{操作})

      const arr1= ['a', 'b', 'c'];
      arr.forEach(item => console.log(item));
      const arr2 = [1, 4, 9, 16];
      arr.forEach(item=> item * 2);//打印输出:[1, 4, 9, 16]
      
    • map()
      把每个元素进行处理后返回一个新数组
      语法:arr.map(item,(index)=>{处理})

      const arr = [1, 4, 9, 16];
      arr.map(item=> item * 2);//打印输出:[2, 8, 18, 32]
      
    • every()
      测试数组内的所有元素是否都能通过某个指定函数,返回一个布尔值。可提前终止
      语法:arr.every(item,(index)=>{测试})

      const arr = [1, 30, 39, 29, 10, 13];
      arr.every(item=>item<40))//打印输出:true 即所有元素满足小于40
      
    • some()
      测试数组是否至少有1个元素通过了测试,返回一个布尔值。可提前终止
      语法:arr.some(item,(index)=>{测试})

      const arr = [1, 2, 3, 4, 5];
      arr.some(item=>item%2===0)//打印输出:true 即至少有一个元素可被2整除
      
    • find()
      返回数组中通过测试的第一个元素值。否则返回 undefined。可提前终止
      语法:arr.find(item,(index)=>{测试})

      const arr = [5, 12, 8, 130, 44];
      arr.find(item=>item>10)//12 即12是第一个大于10的元素,返回
      
    • findIndex()
      返回数组中通过测试的第一个元素的索引。否则返回-1。可提前终止
      语法:arr.findIndex(item,(index)=>{测试})

      const arr = [5, 12, 8, 130, 44];
      arr.findIndex(item=>item>13)//打印输出:3 即第一个满足测试的元素的索引是3
      
    • cancat()
      合并两个或多个数组,返回一个新数组
      语法:旧数组.cancat(数组1,数组2...)

      const arr1 = ['a', 'b', 'c'];
      const arr2 = ['d', 'e', 'f'];
      arr1.concat(arr2)//打印输出:["a", "b", "c", "d", "e", "f"]
      
    • filter()
      创建一个新数组, 里面是通过测试的所有元素。
      语法:arr.filter(item,(index)=>{测试})

      const arr = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
      arr.filter(item=>item.length>6)//打印输出:["exuberant", "destruction", "present"]
      
    • push()
      将元素添加到数组的末尾,并返回该数组的新长度。改变原有
      语法:arr.push(元素1,元素2...)

      const animals = ['pigs', 'goats', 'sheep'];
      animals.push('cows')//打印输出:4
      animals//打印输出:["pigs", "goats", "sheep", "cows"]
      
    • unshift()
      将元素添加到数组的开头,返回该数组的新长度,改变原有
      语法:arr.unshift(元素1,元素2...)

      const arr = [1, 2, 3];
      arr.unshift(4, 5)//打印输出:5
      arr//打印输出:[4, 5, 1, 2, 3]
      
    • pop()
      从数组中删除最后一个元素,返回该元素的值,更改了数组的长度。
      语法:arr.pop()

      const plants = ['broccoli', 'cauliflower', 'cabbage', 'kale', 'tomato'];
      plants.pop()//打印输出:"tomato"
      plants//打印输出:["broccoli", "cauliflower", "cabbage", "kale"]
      
    • shift()
      从数组中删除第一个元素,返回该元素的值。更改了数组的长度。
      语法:arr.shift()

      const arr = [1, 2, 3];
      arr.shift()//打印输出:1
      arr//打印输出:[2, 3]
      
    • indexOf()
      找给定元素的索引,返回。如果不存在,则返回-1。
      语法:arr.indexOf(要找的元素,从哪里开始)

      const beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];
      beasts.indexOf('bison')//打印输出:1
      
    • join()
      用一个指定符号把数组元素连接起来,返回连接好的字符串
      语法:arr.join("指定符号")

      const arr = ['Fire', 'Air', 'Water'];
      arr,join('-')//打印输出:"Fire-Air-Water"
      
    • reverse()
      颠倒数组元素的位置
      语法:arr.reverse()

      const arr = ['one', 'two', 'three'];
      arr.reverse();//打印输出:["three", "two", "one"]
      
    • sort()
      对数组的元素进行排序,并返回数组,改变了。按照转换为的字符串的各个字符的Unicode位点进行排序。
      语法:arr.sort()arr.sort(比较函数)

      const months = ['March', 'Jan', 'Feb', 'Dec'];
      months.sort();//打印输出:["Dec", "Feb", "Jan", "March"]
      
      var numbers = [4, 2, 5, 1, 3]; 
      sort((a, b) => a - b); //打印输出:[1, 2, 3, 4, 5]
      
    • slice()
      从开始位置到结束位置抽取新数组,不包括结束位置的元素
      语法:arr.slice(开始索引,结束索引)

      const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
      animals.slice(2)//打印输出:["camel", "duck", "elephant"]
      animals.slice(2, 4)//打印输出:["camel", "duck"]
      
    • splice()
      删除、替换或添加元素来修改数组,以数组形式返回被修改(替换)的内容。改变原数组。
      语法:arr.splice(开始位置,要移除的个数,要添加(替换)的元素)

      //删除
      var myFish = ['angel', 'clown', 'drum', 'mandarin', 'sturgeon'];
      myFish.splice(3, 1)//从第三位删除一个元素。打印输出:["mandarin"]
      myFish//打印输出:["angel", "clown", "drum", "sturgeon"]
      
      //替换
      var myFish = ['angel', 'clown', 'drum', 'sturgeon'];
      myFish.splice(2, 1, "trumpet");//从第二个元素开始删除一个插入一个,即替换第三个元素。打印输出:["drum"]
      myFish//打印输出:["angel", "clown", "trumpet", "sturgeon"]
      
      //添加或插入
      var myFish = ["angel", "clown", "mandarin", "sturgeon"];
      myFish.splice(2, 0, "drum");//从第二个位置添加元素“drum”。打印输出:[]
      myFish//打印输出:["angel", "clown", "drum", "mandarin", "sturgeon"]
      
    • Array.isArray()
      静态方法,判断传递的值是否为一个数组

      Array.isArray([1, 2, 3]);  // true
      Array.isArray({foo: 123}); // false 
      

    基本包装类型

    普通变量不能直接调用属性或者方法 对象可以直接调用属性和方法

    本身是基本类型,但是在执行代码的过程中,如这种类型的变量调用了属性或者是方法,那么这种类型就不再是基本类型了,而是基本包装类型。这个变量也不是普通的变量了,而是基本包装类型对象

    var num=Number("10")//类型转换
    var num=new Number//基本包装类型
    

    数据类型转换

    • parseInt():转为整数
    • parseFloat():转小数
    • Number():转数字,更为严格
    • .toString():转字符串,如果变量有意义使用
    • String():转字符串,没有意义时转换,即可以是未声明或null等
    • Boolean() :转布尔值。0|字符串没有内容|null|undefined等没有意义的为false

    流程控制

    1.顺序结构

    从上到下,从左到右
    

    2.分支结构

    if if-else if-else if switch-case

    if(条件){事件1}else{事件2}
    
    //三元表达式可达到同等效果
    //解释:判断条件的结果是true还是false,如果是true执行事件1,如果是2执行事件2,最后把结果赋值给变量
    var a=条件?事件1:事件2
    
    if(条件1){事件1}else if(条件2){事件2}else{事件3}
    //else if可无限添加
    
    switch(变量){
    	case 值1:事件1:
    	break;
    	case 值2:事件2:
    	break;
    	case 值3:事件3:
    	break;
    	default:事件4
    }
    //获取变量的值,与case的值依次比较,如果一样则执行事件并且跳出整个语句。若前面都不相同,执行default事件。
    //变量与case值比较时,是严格模式,即“===”
    //若事件重复,值可集合在一起,在这个集合中,前面的事件和break可以省略,只保留最后一个即可
    

    3.循环结构

    while do-while for for-in

    while(循环条件){
    	循环体;
    	计数器++
    }
    //判断循环条件是否为true,为true时执行,先循环体再计数器
    
    //计算1-100所有值的和
    var sum=0
    var i=0
    while(i<100){
    	sum+=;
    	i++;
    }
    //解析:第一次进入循环,sum=0,i=1;
    //第二次进入循环,sum=0+1,i=2;
    //第三次进入循环,sum=1+2,i=3
    
    do{
    	循环体
    }while(循环条件)
    //先执行循环体,再判断条件,成立时继续执行,否则跳出
    
    for(变量;判断;计数器){
    	循环体
    }
    //例子
    for(var i=0;i<10;i++){
    	执行事件
    }
    

    break:循环中如果碰到则会跳出当前循环
    continue:不再执行其后面的事件,直接进入下一次循环

  • 相关阅读:
    SQL 2008 TSQL(表变量参数) (转)
    当前主流浏览器并行连接数(同域名)
    ASP.NET 页生命周期概述
    使用SecureCRT连接ubuntu或者redhat
    Linux下查看CPU使用率
    在网上搜罗的一些有阀值的性能测试指标(转)
    httpModule测试
    狙击怪物还不错,O(∩_∩)O~
    IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述
    Sql Server 分区演练
  • 原文地址:https://www.cnblogs.com/sanhuamao/p/13595523.html
Copyright © 2020-2023  润新知