• JavaScript知识点整理2-函数、字符串


    五  函数基础

    1   定义方法:

           (1)静态方法:

    function 函数名([参数列表]){
    
       函数体;
    
       [return [函数返回值;]
    
    }
    

           (2)动态匿名方法:var 函数名=new Function([“虚参列表”],”函数体”);

           (3)直接量方法:函数名=function([虚参列表]){函数体;}        

    function sum(num1,num2){ 
        return num1 + num2; 
    } 
     
    var sum=function(num1,num2){ 
        return num1 + num2; 
    } 
     
    var sum=new Function("num1", "num2", "return num1+num2");
    

             Ps:使用函数表达式定义函数时,可以不用定义函数名,通过变量名可以直接引用函数。同时函数表达式的末尾记得有分号。

             Ps:使用不带圆括号的函数名是访问函数指针,而非调用函数。

    2  调用方法:

    (1)作为函数调用

            直接调用:函数名(实参列表)

            在连接中调用:<a href=”javascript:函数名()”>zhii</a>

            在事件中调用:事件类型=”函数名()”

            递归调用:在函数体内部调用函数自身,function 函数名(){ 代码;函数名();}

    (2)作为方法调用

     o.m=f;
    
         o.m();
    
         o.m(x,y)
     
    var calculator={ 
        opera1:1, 
        opera2:1, 
        add:function(){ 
            this.result=this.opera1+this.opera2; 
        } 
    }; 
    calculator.add(); 
    calculator.result;
    

    (3)作为构造函数调用

         若函数或方法调用之前带有关键字new,则为构造函数调用。如果构造函数调用在圆括号内包含一组实参列表,先计算这些参数表达式,然后传入函数内。如果构造函数没有形参,JavaScript构造函数调用的语法啊是允许省略实参列表和圆括号的。凡是没有形参的构造函数调用都可以省略圆括号。

    var o=new Object();    等价于   var o=new Object;
    

    ps:(1)构造函数通常不用return关键字,它们通常初始化新对象,当构造函数的函数体执行完毕后,会显示返回。此时,构造函数调用表达式的计算结果就是这个新对象的值。(2)若构造函数显示return一个对象,则调用表达式的值就是这个对象。(3)若构造函数使用return语句但没有指定返回值,或返回一个原始值,此时将忽略返回值,同时使用这个新对象作为返回结果。

    (4)通过它们的apply()、call()方法间接调用

     
    function Animal() { 
        this.name = 'Animal'; 
        this.showName = function () { 
            alert(this.name); 
        } 
    } 
    function Cat() { 
        this.name = 'Cat'; 
    } 
    var animal = new Animal(); 
    var cat = new Cat(); 
    //通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。 
    //输入结果为"Cat" 
    animal.showName.call(cat, ','); 
    //animal.showName.apply(cat,[]);
    

    3  函数内部属性:

       在函数内部,存在两个特殊的对象:arguments与this

      [1] arguments是一个类数组对象,包含着传入函数中的所有参数,其主要用于保存函数参数。arguments对象有一个叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

    function factorial(num){ 
                 if(num <= 1){ 
                    return 1; 
                }else{ 
                   return num * arguments.callee(num - 1); 
                } 
        }
    

    [2] 函数内部的另一个对象this,其引用的是函数执行的环境对象,或者说是this值。

    [3] ES5规范了另一个函数对象的属性caller,其保存着调用当前函数的函数的引用。若在全局作用域内调用当前函数,其值为null。

    4  函数属性:

    每个函数都包含两个属性:length、prototype。其中,length属性表示函数希望接收的命名参数的个数。prototype是保存引用类型所有实例方法的真正所在。即toString()等方法都保存在prototype上,只不过是通过各自对象的实例访问罢了。

    function syName(num1,num2){ 
        return num1 + num2; 
    } 
    console.log(sayName.length);//2
    

    5   方法:

    每个函数都包含两个非继承而来方法:apply()、call(),二者的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值,可以扩充函数赖以运行的作用域。

    apply::(将函数作为对象的方法来调用,将参数以数组形式传递给该方法;)

    call:(将函数作为对象的方法来调用,将参数传递给该方法)

    toString:(返回函数的字符串表示)

    ps:apply()接收两个参数,前一个是在其中运行函数的作用域,后一个是参数数组,其中后一个参数可以是Array的实例,也可以是arguments对象。而call()接收两个参数,前一个是与apply一致,后一个参数是传递给函数的参数必须逐个列举出来。

    function sum(num1, num2){ 
        return num1 + num2; 
    } 
    function apSum1(num1, num2){ 
        return sum.apply(this,arguments); 
    } 
    function apSum2(num1, num2){ 
        return sum.apply(this,[num1, num2]); 
    } 
    function callSum(num1, num2){ 
        return sum.call(this, num1, num2); 
    } 
    console.log(apSum1(10,10));//20 
    console.log(apSum2(10,10));//20 
    console.log(callSum(10,10));//20
    window.color="red"; 
    var o={ color: "blue"}; 
    function sayColor(){console.log(this.color);} 
    sayColor();//red 
    sayColor.call(this);//red 
    sayColor.call(window);//red 
    sayColor.call(o);//blue
    

    ps: 使用call()、apply()扩充作用域的好处是对象不需要与方法有任何耦合关系。

    bind():创建一个函数的实例,其this值会被绑定到传给bind()函数的值。

    window.color="red"; 
    var o={ color: "blue"}; 
    function sayColor(){ 
        console.log(this.color); 
    } 
    var objSayColor=sayColor.bind(o); 
    objSayColor();//blue
    

    6  arguments对象:

           存放实参的参数列表;仅能在函数体内使用,带有下标属性但并非数组,函数声明时自动初始化;其属性有length(获取函数实参的长度)、callee(返回当前正在指向的函数)、caller(返回调用当前正在执行函数的函数名)

    7  函数参数:

          参数类型:形参(定义函数时使用的参数; 接收调用该函数时传递的参数)、实参(调用函数时传递给函数的实际参数)

    特性:参数个数没有限制,当实参个数 < 形参个数时,多余参数为undefined,当实参个数 > 形参个数时,多余实参会被忽略; 参数的数据类型没有限制; 通过arguments对象访问参数数组; 参数始终按值传递,基本类型传值,引用类型传地址

           Ps:形参:函数中定义的变量; 实参:运行时的函数调用时传入的参数。

     

    8  指针标识:

          this:(指向当前操作对象)

         callee:(指向参数集合所属函数)

         prototype:(指向函数附带的原型对象)

         constructor:(指向创建该对象的构造函数)

    Ps:函数实际上是对象。每个函数都是Function类型的实例,具有属性与方法。由于函数是对象,则函数名实际上是一个指向函数对象的指针。

    Ps:若函数挂载在一个对象上,作为对象的一个属性,则称其为对象的方法。当通过这个对象来调用函数时,该对象即为此次调用的上下文,即该函数的this值。

    Ps:用于初始化一个新创建的对象的函数称为构造函数。

    Ps:JavaScript中,函数本质上是对象,可以给其设置属性或者调用其方法。同时,可以把函数赋值给变量或者将参数传递给其他函数。

    六  字符串

    String类型是字符串的对象包装类型,可以使用String构造函数来创建:

    var stringObj=new String(“hello”);

    1  查找方法:

    (1) 字符方法

          charAt():(返回字符串中第n个字符; 参数超出范围,返回空字符串; 返回值为string中第n个字符的实际值)

         charCodeAt():(返回字符串中第n个字符的代码; 超出范围返回NaN; 返回值为string中第n个字符的Unicode编码)

         fromCharCode():(根据字符编码创建字符串; 返回由指定编码字符组成的新字符串)

    var stringVal="hello world"; 
    alert(stringVal.charAt(1));//"e" 
    alert(stringVal.charCodeAt(1));//101 (小写e的字符编码) 
    alert(String.fromCharCode(104,101,108,108,111));//"hello"
    

    (2) 位置方法

        indexOf(将要查找的子字符串[,开始查找的位置坐标]):(从前往后检索字符串,看其是否含有指定子串; 返回值为子串首次出现的下标或-1)

        lastIndexOf(将要查找的子字符串[,开始查找的位置坐标]):(从后向前检索字符串,看其是否含有指定子串; 返回值为子串首次出现的下标或-1)

    var stringVal="hello world"; 
    alert(stringVal.indexOf("o"));//4 
    alert(stringVal.indexOf("o",6));//7 
    alert(stringVal.lastIndexOf("o"));//7 
    alert(stringVal.lastIndexOf("o",6));//4
    

    (3) 匹配方法

    match(要进行模式匹配的正则表达式,非正则表达式):(找到一个或多个正则表达式的匹配; 参数2将其传递给RegExp()构造函数,并转换为正则表达式对象; 返回值为存放匹配结果的数组或Null,有全局标记g的执行全局搜索,无g标记的只执行一次匹配)

    search(要进行模式匹配的正则表达式,非正则表达式):(检索字符串中与正则表达式匹配的子串; 返回值为字符串中第一个与正则表达式相匹配的子串的起始位置或-1; )

    replace(需要进行替换正则表达式对象或字符串,替换文本或替换函数):(替换一个与正则表达式匹配的子串;若参数1仅为字符串则只进行一次匹配替换,若替代所有子串则必须制定全局标记g; 若参数2仅为字符串则可使用特殊字符序列,如$$ => $,$& => 匹配整个模式的子字符串,$’ => 匹配的子字符串之前的子字符串,$` => 匹配的子字符串之后的子字符串,$n => 匹配第n个捕获组的子字符串,n为0-9,$nn => 匹配第nn个捕获组的子字符串,nn为01-99)

    split(指定的分隔符[,指定数组的长度]):(根据指定分隔符将字符串分割成多个子串,并返回数组)

    var text="cat, bat, sat, fat"; 
    var pattern=/.at/; 
    var matches=text.match(pattern); 
    alert(matches.index);//0 
    alert(matches[0]);//"cat" 
    alert(pattern.lastIndex);//0 
     
    var pos=text.search(/at/); 
    alert(pos);//1 
     
    var res=text.replace("at", "ond"); 
    alert(res);//"cond, bat, sat, fat" 
    res=text.replace(/at/g,"ond"); 
    alert(res);//"cond, bond, sond, fond 
     
    var color="red, blue, green, yellow"; 
    var colos1=color.split(",");//["red", "blue", "green", "yellow"] 
    var colos2=color.split(",",2);//["red","blue"] 
    var colos3=color.split(/[^\,]+/);//["",",",",",",",""]
    

     

    2  操作方法:

    (1) 拼接方法

           concat():(连接字符串,返回值为连接字符串后返回的新字符串; 功能与“+”相同,原始字符串的值并未被改变; )

           ps:虽然concat()方法专门用来拼接字符串的方法,但实践中更多使用+进行字符串拼接。

    var stringVal="hello"; 
    var result=stringVal.concat("world"); 
    var result1=stringVal.concat("1","2"); 
    console.log(result);//hello world 
    console.log(result1);//hello12 
    console.log(stringVal);//hello
    

    (2) 截取方法

           根据下标截取子串:slice()、substring()

           根据长度截取子串:substr()

    var stringVal="hello world"; 
    alert(stringVal.slice(3));//"lo world" 
    alert(stringVal.substring(3));//"lo world" 
    alert(stringVal.substr(3));//"lo world" 
     
    alert(stringVal.slice(3,7));//"lo w" 
    alert(stringVal.substring(3,7));//"lo w" 
    alert(stringVal.substr(3,7));//"lo worl" 
     
    alert(stringVal.slice(-3));//"rld" 
    alert(stringVal.substring(-3));//"hello world" 
    alert(stringVal.substr(-3));//"rld" 
     
    alert(stringVal.slice(3,-4));//"lo w" 
    alert(stringVal.substring(3,-4));//"hel" 
    alert(stringVal.substr(3,-4));//" "(空字符串)
    

           ps:当给这些函数传递负数的情况下,slice()方法会将传入的负值与字符串的长度相加;substr()方法将负的第一个参数加上字符串的长度,而负的第二个参数转换为0;substring()方法会把所有负值参数都转换为0,同时如果一正一负的话,将负的转换为0后,将较小的参数作为起始位置,较大的参数作为结束位置。

    (3) 空格处理

           trim() :(消除前置及后缀空格)

           trimLeft():(消除前置空格)

           trimRight():(消除后缀空格)

    var stringVal="  hello world  "; 
    var trimStr=stringVal.trim(); 
    alert(trimStr);//"hello world" 
    alert(stringVal);//"  hello world  "
    

    (4) 比较方法

    localeCompare():(用本地特定顺序比较两个字符串; 返回值为说明比较结果的数字,负数表示原字符串<参数字符串,正数表示原字符串>参数字符串;为0表示二者相等。)

    var stringVal="yellow"; 
    alert(stringVal.localeCompare("brick"));//1 
    alert(stringVal.localeCompare("yellow"));//0 
    alert(stringVal.localeCompare("zoo"));//-1
    

    3   编码方法:

          字符串常规编码与解码:escape()、unescape()

          URI字符串编码与解码:encodeURI()、decodeURI()

          URI组件编码与解码:encodeURIComponent()、decodeURIComponent()

    4  转换方法:

          大小写转换:转为大写(toUpperCase()、toLocaleUpperCase())、转为小写(toLowerCase()、toLocaleLowerCase())

    参考资料:

    《JavaScript高级程序设计》、《JavaScript权威指南》

    宝剑锋从磨砺出,梅花香自苦寒来。
  • 相关阅读:
    git的工作区和暂存区
    git的撤销、删除和版本回退
    PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/phalcon.so'
    please complete all spokes before continuing 提示
    右键添加git bush here
    phalcon 设置cookie一直是httponly导致前端读取不到cookie的值
    composer update 提示 username
    Git Error: warning: refname 'origin/branch-name' is ambiguous.
    Phalcon框架数据库读写分离的实现方法
    Windows环境下redis 配置文件中设置的密码无效
  • 原文地址:https://www.cnblogs.com/haimengqingyuan/p/7153770.html
Copyright © 2020-2023  润新知