JavaScript之引用类型

  • 时间:
  • 浏览:0

  Object类型是JavaScript中使用最多的某种类型。嘴笨 Object的实例不具备有几个功能,但对于在应用守护进程中存储和传输数据而言,它嘴笨 是非常理想的选用。

  创建Object实例的最好的法律辦法 有某种,第某种是使用new操作符后跟Object构造函数。

    var person = new Object();
    person.name = "tt";
    person.age = 12;

  另某种最好的法律辦法 是使用对象字面量表示法。

    var person = {
        name : 'tt',
        age : 12
    }

  另外,使用对象字面量语法时,不可能 留空其花括号,则可不需要还可否 定义值带有默认属性和最好的法律辦法 的对象。

    var person = {};            //与new Object()相同
    person.name = "tt";
    person.age = 12;

  嘴笨 可不需要还可否 使用前面介绍的任何某种最好的法律辦法 来定义对象,但开发人员更青睐第二种最好的法律辦法 (对象字面量语法),不可能 什儿 语法要求的代码量少,回会 能给人封装数据的感觉。实际上,对象字面量也是向函数传递血块可选参数的首选最好的法律辦法 ,同类:

    function showInfo(args)
    {
        if(args.name != undefined)
        {
            alert(args.name);
        }
        if(args.age != undefined)
        {
            alert(args.age);
        }
    }

    showInfo({
        name:'name',
        age:12
    });

    showInfo({name:'name'});

  一般来说,访问对象属性时使用的完整篇 回会点表示法,这也是回会 面向对象语言中通用的语法。不过,在JavaScript也可不需要还可否 使用方括号表示法来访问对象的属性。同类:

    alert(person.name);
    alert(person['name']);    

  从功能上看,这某种访问对象属性的最好的法律辦法 没法 任何区别。但方括号语法的主要优点是可不需要还可否 通过变量来访问属性。

    var propertyName = 'name';
    alert(person[propertyName]);

  通常,除非前要使用变量来访问属性,回会 亲戚亲戚朋友建议使用点表示法。

  JavaScript中的数组与什儿 多数语言中的数组有着相当大的区别。嘴笨 JavaScript数组与什儿 语言中的数组完整篇 回会数据的有序列表,但与什儿 语言不同的是,JavaScript数组的每一项可不需要还可否 保持任何类型的数据。也回会 说,可不需要还可否 用数组的第一另有俩个位置来保存字符串,用第俩个位置来保存数值,用第另有俩个位置来保存对象。回会 ,JavaScript数组的大小是可不需要还可否 动态调整的,即可不需要还可否 随着数据的加上自动增长以容纳新增数据。

  创建数组的基本最好的法律辦法 有某种。第某种是使用Array构造函数。

    var colors1 = new Array();
    var colors2 = new Array(20);                        
    var colors3 = new Array('red','blue','yellow');

  创建数组的第二种基本最好的法律辦法 是使用数组字面量表示法。

    var colors1 = [];
    var colors2 = ['red','blue','yellow'];

  在读取和设置数组的值时,要使用方括号并提供相应值的基于0的数字索引。

    var colors = ['red','blue','yellow'];    //定义一另有俩个字符串数组
    alert(colors[0]);                        //显示第一项
    colors[2] = 'green';                     //修改第三项
    colors[3] = 'black';                     //新增第四项

  数组的长度保指在其length属性中,什儿 属性始终会返回0或更大的值。

    var colors = ['red','blue','yellow'];
    var names = [];
    alert(colors.length);        //3
    alert(names.length);        //0

  数组的length属性很有特点——它完整篇 回会只读的。回会 ,通过设置什儿 属性,可不需要还可否 从数组的末尾移除项或想数组中加上新项。

    var colors = ['red','blue','yellow'];
    colors.length = 2;
    alert(colors[2]);        //undefined

  什儿 例子中的数组colors一结速有俩个值。将其length属性设置为2会移除最后一项,结果再访问colors[2]就会显示undefined了。

  利用length属性也可不需要还可否 方便地在数组末尾加上新项。

    var colors = ['red','blue','yellow'];
    colors[colors.length] = 'green';        //在位置3加上某种颜色
    colors[colors.length] = 'black';        //再在位置4加上某种颜色

  不可能 数组最后一项的索引始终是length-1,回会 下一另有俩个新项的位置回会 length。

  转换最好的法律辦法

  所有对象都具有toLocaleString()、toString()和valueOf()最好的法律辦法 。其中,调用数组的toString()和valueOf()最好的法律辦法 会返回相同的值,即由数组中每个值的字符串形成拼接而成的一另有俩个以逗号分隔的字符串。实际上,为了创建什儿 字符串会调用数组每一项的toString()最好的法律辦法 。

    var colors = ['red','blue','yellow'];
    alert(colors.toString());   //red,blue,yellow
    alert(colors.valueOf());    //red,blue,yellow
    alert(colors);              //red,blue,yellow

  亲戚亲戚朋友首先显式地调用了toString()和valueOf()最好的法律辦法 ,以便返回数组的字符串表示,每个值的字符串表示拼接成了一另有俩个字符串,里边以逗号分隔。最后一行代码直接将数组传递给了alert()。不可能 alert()要接收字符串参数,所有它会在后台调用toString()最好的法律辦法 ,由此会得到与直接调用toString()最好的法律辦法 相同的结果。

  另外,toLocaleString()最好的法律辦法 总爱也会返回与toString()和valueOf()最好的法律辦法 相同的值,但回会 总爱没法 。当调用数组的toLocaleString()最好的法律辦法 时,它也会创建一另有俩个数组值的以逗号分隔的字符串。而与前另有俩个最好的法律辦法 唯一的不同之指在于,什儿 次为了取得每一项的值,调用的是每一项的toLocaleString()最好的法律辦法 ,而完整篇 回会toString()最好的法律辦法 。同类:

    var person1 = {
        toLocaleString : function(){
            return "person1 : toLocaleString";
        },
        toString : function(){
            return "person1 : toString";
        }
    };
    var person2 = {
        toLocaleString : function(){
            return "person2 : toLocaleString";
        },
        toString : function(){
            return "person2 : toString";
        }
    };
    var people = [person1,person2];
    alert(people);                       //person1 : toString,person2 : toString
    alert(people.toString());            //person1 : toString,person2 : toString
    alert(people.toLocaleString());      //person1 : toLocaleString,person2 : toLocaleString

  数组继承的toLocaleString()、toString()和valueOf()最好的法律辦法 ,在默认清况 下回会以逗号分隔的字符串的形式返回数组项。而不可能 使用join()最好的法律辦法 ,则可不需要还可否 使用不同的分隔符来构建什儿 字符串。

    var colors = ['red','blue','yellow'];
    alert(colors.join(','));    //red,blue,yellow
    alert(colors.join('||'));    //red||blue||yellow

  注意:不可能 数组中的某一项的值是null不可能 undefined,没法 该值在join()、toString()、toLocaleString()和valueOf()最好的法律辦法 返回的结果中以空字符串表示。

  栈最好的法律辦法

  JavScript数组也提供了某种让数组的行为同类于什儿 数据特征的最好的法律辦法 。具体来说,数组可不需要还可否 表现得就像栈一样,后者是某种可不需要还可否 限制插入和删除项的数据特征。栈是某种后进先出后进先出的数据特征。而栈中项的插入(叫做推入)和移除(叫做弹出),只指在在一另有俩个位置——栈的顶部。JavaScript提供了push()和pop()最好的法律辦法 ,以便实现同类的栈行为。

  push()最好的法律辦法 可不需要还可否 接收任意数量的参数,把它们逐个加上到数组末尾,并返回修改后数组的长度。而pop()最好的法律辦法 则从数组末尾移除最后一项,减少数组的length值,回会 返回移除的项。

    var colors = new Array();                    //创建一另有俩个数组
    var count = colors.push('red','blue');       //推入两项
    alert(count);                                //2
    count = colors.push('yellow');               //再推入一项
    alert(count);                                //3
    var item = colors.pop();                     //取得最后一项
    alert(item);                                 //yellow
    alert(colors.length);                        //2

  队列最好的法律辦法

  队列数据特征的访问规则是先进先出。队列在列表的末端加上项,从列表的前端移除项。不可能 push()是向数组末端加上项的最好的法律辦法 ,回会 要模拟队列只需一另有俩个从数组前端取得项的最好的法律辦法 。实现什儿 操作的数组最好的法律辦法 回会 shift(),它不需要还可否 移除数组中的第一另有俩个项并返回该项,一齐将数组长度减1。结合使用shift()和push()最好的法律辦法 ,可不需要还可否 像使用队列一样使用数组:

    var colors = new Array();                    //创建一另有俩个数组
    var count = colors.push('red','blue');       //推入两项
    alert(count);                                //2
    count = colors.push('yellow');               //再推入一项
    alert(count);                                //3
    var item = colors.shift();                   //取得第一项
    alert(item);                                 //red
    alert(colors.length);                        //2

  JavaScript还为数组提供了一另有俩个unshift()最好的法律辦法 。顾名思义,unshift()与shift()的用途相反:它能在数组前端加上任意个项并返回新数组的长度。回会 ,一齐使用unshift()和pop()最好的法律辦法 ,可不需要还可否 从反方向来模拟队列,即在数组的前端加上项,从数组的末端移除项,同类:

    var colors = new Array();                    //创建一另有俩个数组
    var count = colors.unshift('red','blue');    //推入两项
    alert(count);                                //2
    count = colors.unshift('yellow');            //再推入一项
    alert(count);                                //3
    var item = colors.pop();                     //取得第一项
    alert(item);                                 //blue
    alert(colors.length);                        //2

  注意:IE对JavaScript的实现中指在一另有俩个偏差,其unshift()最好的法律辦法 总爱返回undefined而完整篇 回会数组的新长度。

  重排序最好的法律辦法

  数组中不可能 指在另有俩个可不需要还可否 直接用来重排序的最好的法律辦法 :reverse()和sort(),reverse()最好的法律辦法 会反转数组项的顺序。

    var values = [1,2,3,4,5];
    values.reverse();
    alert(values);                //5,4,3,2,1

  在默认清况 下,sort()最好的法律辦法 按升序排列数组项——即最小的值指在最前面,最大的值排在最里边。为了实现排序,sort()最好的法律辦法 会调用每个数组项的toString()转型最好的法律辦法 ,回会 比较得到的字符串,以选用如可排序。即使数组中的每一项完整篇 回会数值,sort()最好的法律辦法 比较的也是字符串,如下所示:

    var values = [0,1,5,10,15];
    values.sort();
    alert(values);                //0,1,10,15,5

  可见,即使例子中值的顺序没法 问题报告 ,但sort()最好的法律辦法 也会根据测试字符串的结果改变从前的顺序。不可能 数值5嘴笨 小于10,但在进行字符串比较时,“10”则指在“5”的前面。回会 sort()最好的法律辦法 可不需要还可否 接收一另有俩个比较函数作为参数,以便亲戚亲戚朋友指定哪个值指在哪个值的前面。

    function compare(value1,value2){
        if(value1 < value2){
            return 1;
        } else if(value1 > value2){
            return -1;
        } else{
            return 0;
        }
    }
    var values = [0,1,5,10,15];
    values.sort(compare);
    alert(values);                //15,10,5,1,0

  对于数值类型不可能 其valueOf()最好的法律辦法 会返回数值类型的对象类型,可不需要还可否 使用一另有俩个更简单的比较函数。什儿 函数主要用第俩个值减第一另有俩个值即可。

    function compare(value1,value2){
        return value2 - value1;
    }

  操作最好的法律辦法

  JavaScript对操作数组提供了回会 最好的法律辦法 。其中,concat()最好的法律辦法 可不需要还可否 基于当前数组中的所有项创建一另有俩个新数组,不可能 传递给concat()最好的法律辦法 的是一或多个数组,则该最好的法律辦法 会将有有哪些数组中的每一项都加上到结果数组中。不可能 传递的值完整篇 回会数组,有有哪些值就会被简单地加上到结果数组的末尾。

    var colors = ['red','green','blue'];
    var colors2 = colors.concat('yellow',['black' , 'brown']);
    alert(colors);        //red,green,blue
    alert(colors2);        //red,green,blue,yellow,black,brown

  slice()最好的法律辦法 不需要还可否 基于当前数组中的一或多个项创建一另有俩个新数组。slice()最好的法律辦法 可不需要还可否 接受一或另有俩个参数,即要返回项的起始和结速位置。在不还可否 一另有俩个参数的清况 下,slice()最好的法律辦法 返回从该参数指定位置结速到当前数组末尾的所有项。不可能 有另有俩个参数,该最好的法律辦法 返回起始和结速位置前一天的项——但不包括结速位置的项。

    var colors = ['red','green','blue','yellow','black','brown'];
    var colors2 = colors.slice(1);
    var colors3 = colors.slice(1,4);
    alert(colors2);        //green,blue,yellow,black,brown
    alert(colors3);        //green,blue,yellow

  下面亲戚亲戚朋友来介绍splice()最好的法律辦法 ,什儿 最好的法律辦法 恐怕要否是最强大的数组最好的法律辦法 了,splice()主要用途是向数组的中部插入项,但使用什儿 最好的法律辦法 的最好的法律辦法 则有如下3种。

  删除——可不需要还可否 删除任意数量的项,只需指定另有俩个参数:要删除的第一项的位置和要删除的项数。同类,splice(0,2)会删除数组中的前两项。

  插入——可不需要还可否 向指定位置插入任意数量的项,只需提供俩个参数:起始位置、0(要删除的项数)、要插入的项。不可能 要插入多个项,可不需要还可否 再传入第四、第五,以致任意多个项。同类,splice(2,0,'red','green')会从当前数组的位置2结速插入字符串'red'和'green'。

  替换——可不需要还可否 向指定位置插入任意数量的项,且一齐删除任意数量的项,只需指定俩个参数:起始位置、要删除的项数和要插入的任意数量的项。插入的项数何必 与删除的项数相等。同类,splice(2,1,'red','green')会删除当前数组位置2的项,回会 再从位置2结速插入字符串'red'和'green'。

    var colors = ['red','green','blue'];
    var removed = colors.splice(0,1);                 //删除第一项
    alert(colors);                                    //green,blue
    alert(removed);                                   //red
    removed = colors.splice(1,0,'yellow','black');    //从位置1结速插入两项
    alert(colors);                                    //green,yellow,black,blue
    alert(removed);                                   //返回一另有俩个空数组
    removed = colors.splice(1,1,'red','brown');       //插入两项,删除一项
    alert(colors);                                    //green,red,brown,black,blue
    alert(removed);                                   //yellow

  JavaScript中的Date类型是在早期Java中的java.util.Date类基础上构建的。为此,Date类型使用自UTC 1970年1月1日零时结速经过的毫秒数来保存日期。在使用什儿 数据存储格式的条件下,Date类型保存的日期不需要还可否 精确到1970年1月1日前一天或前一天的285 616年。

  要创建一另有俩个日期对象,使用new操作符和Date构造函数即可。

  在调用Date构造函数而不传递参数的清况 下,新创建的对象自动获得当前日期和时间。不可能 想根据特定的日期和时间创建日期对象,前要传入表示该日期的毫秒数。为了复杂化什儿 计算过程,JavaScript提供了另有俩个最好的法律辦法 :Date.parse()和Date.UTC()。

  其中,Date.parse()最好的法律辦法 接收一另有俩个表示日期的字符串参数,回会 尝试根据什儿 字符串返回相应日期的毫秒数。JavaScript没法 定义Date.parse()应该支持哪种格式,回会 什儿 最好的法律辦法 的行为因实现而异,回会 通常是因地区而异。将地区设置为美国的浏览器通常都接受下列日期格式:

  ● "月/日/年",如:6/13/2204

  ● "英文月名 日,年",如:January 12,304

  ● "英文星期几 英文月名 日 年 时:分:秒 时区",如:Tue May 25 304 00:00:00 GMT-0700

  同类,要为304年5月25日创建一另有俩个日期对象,可不需要还可否 使用下面的代码:

  var someDate = new Date(Date.parse("May 25 , 304"));

  不可能 传入Date.parse()最好的法律辦法 的字符串不还可否 表示日期,没法 它会返回NaN。实际上,不可能 直接将表示日期的字符串传递给Date构造函数,也会在后台调用Date.parse()。换句话说,下面的代码与前面的例子是等价的:

  var someDate = new Date('May 25 , 304');

  Date.UTC()最好的法律辦法 同样也返回表示日期的毫秒数,但它与Date.parse()在构建值时使用不同的信息。Date.UTC()的参数分别是年份、基于0的月份(一月是0,二月是1,以此类推)。月中的哪一天(1到31)、小时数(0到23)、分钟、秒以及毫秒数。在有有哪些参数中,不还可否 前另有俩个参数(年和月)是必需的。不可能 没法 提供月中的天数,则假设天数为1;不可能 省略什儿 参数,则回会 假设为0。

  //GMT时间30年1月1日零时
  var y2k = new Date(Date.UTC(30, 0));
  //GMT时间305年5月5日下午5:55:55
  var allFives = new Date(Date.UTC(305,4,5,17,55,55));

  如同模仿Date.parse()一样,Date构造函数也会模仿Date.UTC(),但有什儿 明显不同:日期和时间都基于本地时区而非GMT来创建的。可不需要还可否 将前面的例子重写如下:

  //本地时间30年1月1日零时
  var y2k = new Date(30,0);
  //本地时间305年5月5日下午5:55:55
  var allFives = new Date(305,4,5,17,55,55);

  Date类型还有什儿 专门用于将日期格式化为字符串的最好的法律辦法 ,有有哪些最好的法律辦法 如下:

  ● toDateString()——以特定于实现的格式显示星期几、月、日和年

  ● toTimeString()——以特定于实现的格式显示时、分、秒和时区

  ● toLocaleDateString()——以特定于地区的格式显示星期几、月、日和年

  ● toLocaleTimeString()——以特定于实现的格式显示时、分、秒

  ● toUTCString()——以特定于实现的格式完整篇 的UTC日期

  以上有有哪些字符串格式最好的法律辦法 的输出也是因浏览器而异的,回会 没法 哪一另有俩个最好的法律辦法 不需要还可否 用来在用户界面中显示一致的日期信息。

  以下是Date类型的所有最好的法律辦法 :

最好的法律辦法 描述
Date() 返回当日的日期和时间。
getDate() 从 Date 对象返回一另有俩个月中的某一天 (1 ~ 31)。
getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。
getMonth() 从 Date 对象返回月份 (0 ~ 11)。
getFullYear() 从 Date 对象以四位数字返回年份。
getYear() 请使用 getFullYear() 最好的法律辦法 代替。
getHours() 返回 Date 对象的小时 (0 ~ 23)。
getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。
getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。
getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。
getTime() 返回 1970 年 1 月 1 日至今的毫秒数。
getTimezoneOffset() 返回本地时间与格林威治标准时间 (GMT) 的分钟差。
getUTCDate() 根据世界时从 Date 对象返回月中的一天 (1 ~ 31)。
getUTCDay() 根据世界时从 Date 对象返回周中的一天 (0 ~ 6)。
getUTCMonth() 根据世界时从 Date 对象返回月份 (0 ~ 11)。
getUTCFullYear() 根据世界时从 Date 对象返回四位数的年份。
getUTCHours() 根据世界时返回 Date 对象的小时 (0 ~ 23)。
getUTCMinutes() 根据世界时返回 Date 对象的分钟 (0 ~ 59)。
getUTCSeconds() 根据世界时返回 Date 对象的秒钟 (0 ~ 59)。
getUTCMilliseconds() 根据世界时返回 Date 对象的毫秒(0 ~ 999)。
parse() 返回1970年1月1日深更深更半夜到指定日期(字符串)的毫秒数。
setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。
setMonth() 设置 Date 对象中月份 (0 ~ 11)。
setFullYear() 设置 Date 对象中的年份(四位数字)。
setYear() 请使用 setFullYear() 最好的法律辦法 代替。
setHours() 设置 Date 对象中的小时 (0 ~ 23)。
setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。
setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)。
setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)。
setTime() 以毫秒设置 Date 对象。
setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31)。
setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)。
setUTCFullYear() 根据世界时设置 Date 对象中的年份(四位数字)。
setUTCHours() 根据世界时设置 Date 对象中的小时 (0 ~ 23)。
setUTCMinutes() 根据世界时设置 Date 对象中的分钟 (0 ~ 59)。
setUTCSeconds() 根据世界时设置 Date 对象中的秒钟 (0 ~ 59)。
setUTCMilliseconds() 根据世界时设置 Date 对象中的毫秒 (0 ~ 999)。
toSource() 返回该对象的源代码。
toString() 把 Date 对象转换为字符串。
toTimeString() 把 Date 对象的时间帕累托图转换为字符串。
toDateString() 把 Date 对象的日期帕累托图转换为字符串。
toGMTString() 请使用 toUTCString() 最好的法律辦法 代替。
toUTCString() 根据世界时,把 Date 对象转换为字符串。
toLocaleString() 根据本地时间格式,把 Date 对象转换为字符串。
toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间帕累托图转换为字符串。
toLocaleDateString() 根据本地时间格式,把 Date 对象的日期帕累托图转换为字符串。
UTC() 根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数。
valueOf() 返回 Date 对象的原始值。

  JavaScript带有哪些最有意思,我前要那莫过于函数了——而有意思的根源,则在于函数实际上时对象。每个函数完整篇 回会Function类型的实例,回会 都与什儿 引用类型一样具有属性和最好的法律辦法 。不可能 函数是对象,回会 函数名实际上也是一另有俩个指向函数对象的指针,不需要与某个函数绑定。

  函数通常是使用函数声明语法定义的,如下面例子所示:

    function sum(num1,num2)
    {
        return num1 + num2;
    }

  这与下面使用函数表达式定义函数的最好的法律辦法 几乎相差无几:

    var sun = function(num1,num2){
        return num1 + num2;
    };

  以上代码定义了变量sum并将其初始化为一另有俩个函数。function关键字里边没法 函数名,这是不可能 在使用函数表达式定义函数时,没法 必要使用函数名——通过变量sum即可引用函数。另外,前要注意函数末尾有一另有俩个分号,就像声明什儿 变量时一样。

  最后某种定义函数的最好的法律辦法 是使用Function构造函数。Function构造函数可不需要还可否 接收任意数量的参数,但最后一另有俩个参数始终都被看成是函数体,而前面的参数则枚举出了新函数的参数。

  var sum = Function('num1','num2','return num1 + num2');        //不推荐使用此种最好的法律辦法

  不可能 函数名仅仅是指向函数的指针,回会 函数名与带有对象指针的什儿 变量没法 有哪些不同。换句话说,一另有俩个函数不可能 会有多个名字,同类:

    function sum(num1,num2)
    {
        return num1 + num2;
    }
    alert(sum(10,10));           //20
    var anotherSum = sum;
    alert(anotherSum(10,10));    //20
    sum = null;
    alert(anotherSum(10,10));    //20

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

  函数声明与函数表达式

  目前为止,亲戚亲戚朋友总爱没法 对函数声明和函数表达式加以区别。而实际上, 解析器在向执行环境中加载数据时,对函数声明和函数表达式何必 一视同仁。解析器会率先读取函数声明,并使其在执行任何代码前一天可用(可不需要还可否 访问);至于函数表达式,则前要等到解析器执行到它所在的代码行,才会真正被解释执行。

    alert(sum(10,10));
    function sum(num1,num2)
    {
        return num1 + num2;
    }

  以上代码完整篇 可不需要还可否 正常运行。不可能 在代码结速执行前一天,解析器就不可能 读取函数声明并将其加上到执行环境中了。不可能 像下面例子所示,把里边的函数声明改为变量初始化最好的法律辦法 ,就会在执行期间原应错误。

    alert(sum(10,10));
    var sum = function(num1,num2)
    {
        return num1 + num2;
    }

  作为值的函数

  不可能 JavaScript中的函数名某种回会 变量,回会 函数也可不需要还可否 作为值来使用。也回会 说,不仅可不需要还可否 像传递参数一样把一另有俩个函数传递给从前函数,回会 可不需要还可否 将一另有俩个函数作为从前函数的结果返回。

    function callSomeFunction(someFunction , someArgument)
    {
        return someFunction(someArgument);
    }

  什儿 函数接受另有俩个参数,第一另有俩个参数应该是一另有俩个函数,第俩个参数应该是要传递给该函数的一另有俩个值。回会 ,就可不需要还可否 像下面的例子一样传递函数了:

    function add(num)
    {
        return num + 10;
    }
    var result = callSomeFunction(add,10);
    alert(result);        //20

  当然,可不需要还可否 从一另有俩个函数中返回从前函数,回会 这也是极为有用的某种技术。

    function createSumFunction()
    {
        return function(num1,num2){
            return num1 + num2;
        };
    }
    var sumFunction = createSumFunction();
    alert(sumFunction(10,10));        //20

  函数内内外部属性

  在函数内内外部,有另有俩个特殊的对象:arguments和this。其中,arguments是一另有俩个类数组对象,带有着传入函数中的所有参数,回会 可不需要还可否 使用length属性来选用传递进来有几个个参数。

    function sayHi()
    {
        alert(arguments.length);                        //2
        alert(arguments[0] + ',' + arguments[1]);        //hello,world
    }
    sayHi('hello','world');

  嘴笨 arguments的主要用途是保存函数参数,但什儿 对象还有一另有俩个名叫callee的属性,该属性是一另有俩个指针,指向拥有什儿 arguments对象的函数。看下面什儿 非常经典的阶乘函数:

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

  定义阶乘函数一般完整篇 回会用到递归算法;如里边的代码,在函数有名字,回会 名字前一天回会 会变的清况 下,从前定义没法 问题报告 。但问题报告 是什儿 函数的执行与函数名factorial紧紧耦合在一齐。为了消除什儿 紧密耦合的问题报告 ,可不需要还可否 像下面从前使用arguments.callee

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

  在什儿 重写后的factorial()函数的函数体内,没法 再引用函数名factorial。从前,无论引用函数时使用是有哪些名字,都可不需要还可否 保证正常完成递归调用。同类:

    var trueFactorial = factorial;
    factorial = function(){
        return 0;
    };
    alert(trueFactorial(5));        //120
    alert(factorial(5));            //0

  函数内内外部的从前特殊对象是this,this引用的是函数据以执行操作的对象——不可能 也可不需要还可否 说,this是函数在执行时指在的作用域(当在网页的全局作用域中调用函数时,this对象引用的回会 window)。看下面的例子:

    window.color = 'red';
    var o = {color:'blue'};
    
    function sayColor()
    {
        alert(this.color);
    }

    sayColor();                //red
    o.sayColor = sayColor;
    o.sayColor();              //blue

  里边什儿 函数sayColor()是在全局作用域中定义的,它引用了this对象。不可能 在调用函数前一天,this的值何必 选用,回会 this不可能 会在代码执行过程中引用不同的对象。当在全局作用域中调用sayColor()时,this引用的是全局对象 window;换句话说,对this.color求值会转加上对window.color求值,于是结果回会 'red'。而当把什儿 函数赋给对象o并调用o.sayColor()时,this引用的是对象o,回会 对this.color求值会转加上对o.color求值,结果回会 'blue'。

  函数属性和最好的法律辦法

  不可能 JavScript中的函数是对象,回会 函数完整篇 回会属性和最好的法律辦法 。每个函数都带有另有俩个属性:length和prototype。其中,length属性表示函数希望接收的命名参数的个数。

    function sayName(name)
    {
        alert(name);
    }
    function sayHi()
    {
        alert('hi');
    }

    alert(sayName.length);      //1
    alert(sayHi.length);         //0

  在JavaScript中最耐人寻味的就要数prototype属性了。对于引用类型而言,prototype是保存它们所有实例最好的法律辦法 的真正所在。诸如toString()和valueOf()等最好的法律辦法 实际上完整篇 回会保指在prototype名下,只不过是通过所有人 对象的实例访问罢了。在创建自定义引用类型以及实现继承时,prototype属性的作用是极为重要的(这里就不对prototype属性做完整篇 介绍了)。

  每个函数都带有另有俩个非继承而来的最好的法律辦法 :apply()和call()。这另有俩个最好的法律辦法 的用途是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。首先,apply()最好的法律辦法 接受另有俩个参数:一另有俩个是在其中运行函数的作用域,从前是参数数组。其中,第俩个参数可不需要还可否 是Array的实例,也可不需要还可否 是arguments对象。同类:

    function sum(num1,num2)
    {
        return num1 + num2;
    }
    function callSum1(num1,num2)
    {
        return sum.apply(this,arguments);
    }
    function callSum2(num1,num2)
    {
        return sum.apply(this,[num1,num2]);
    }
    alert(callSum1(10,10));                    //20
    alert(callSum2(10,10));                    //20

  在里边例子中,callSum1()在执行sum()函数时传入了this作为作用域(不可能 是在全局作用域中调用的,回会 传入的回会 window对象)和arguments对象。而callSum2同样也调用了sum()函数,但它传入的则是this和一另有俩个参数数组。

  call()最好的法律辦法 与apply()最好的法律辦法 的作用相同,它们的区别仅在于接收参数的最好的法律辦法 不同。对于call()最好的法律辦法 而言,第一另有俩个参数是作用域没法 变化,变化的回会 其余的参数完整篇 回会直接传递给函数的。

    function callSum2(num1,num2)
    {
        return sum.call(this,num1,num2);
    }
    alert(callSum2(10,10));                    //20

  事实上,传递参数何必 apply()和call()真正的用武之地;它们真正强大的地方是不需要还可否 扩充函数赖以运行的作用域。看下面的例子:

    window.color = 'red';
    var o = {color:'blue'};
    
    function sayColor()
    {
        alert(this.color);
    }

    sayColor();                //red
    sayColor.call(this);    //red
    sayColor.call(window);    //red
    sayColor.call(o);        //blue

  在里边的例子中,当运行sayColor.call(o)时,函数的执行环境就不一样了,不可能 此时函数体内的this对象指向了o,于是结果显示"blue"。

  注意:每个函数完整篇 回会一另有俩个非标准的caller属性,该属性指向调用当前函数的函数。一般是在一另有俩个函数的内内外部,通过arguments.callee.caller来实现对调用栈的追溯。目前,IE、FireFox、Chrome都支持该属性,但建议将该属性用于调试目的。

  JavaScript带有另有俩个内置对象:Global和Math。

 Global对象

  Global(全局)对象可不需要还可否 说是JavaScript中最很糙的一另有俩个对象了,不可能 不管你从有哪些深度图上看,什儿 对象完整篇 回会不指在的。JavaScript中的Global对象在某种意义上是作为一另有俩个终极的“兜底儿对象”来定义的。换句话说,不属于任何什儿 对象的属性和最好的法律辦法 ,最终完整篇 回会它的属性和最好的法律辦法 。事实上,没法 全局变量或全局函数;所有在全局作用域定义的属性和函数,完整篇 回会Global对象的属性。诸如isNaN()、parseInt()以及parseFloat(),实际上全完整篇 回会Global对象的最好的法律辦法 ,Global对象还带有什儿 什儿 最好的法律辦法 。

  URI编码最好的法律辦法

  Global对象的encodeURI()和encodeURIComponent()最好的法律辦法 可不需要还可否 对URI进行编码,以便发送给浏览器。有效的URI中不还可否 带有什儿 字符,同类空格。而这另有俩个URI编码最好的法律辦法 就可不需要还可否 对URI进行编码,它们用特殊的UTF-8编码替换所否是效的字符,从而让浏览器不需要还可否 接受和理解。

  其中,encodeURI()主要用于整个URI(同类:http://www.test.com/test value.html),而encodeURIComponent()主要用于对URI中的某一段(同类前面URI中的test value.html)进行编码。它们主要区别在于,encodeURI()不需要对某种属于URI的特殊字符进行编码,同类冒号、正斜杠、问好和井号;而encodeURIComponent()则会对它发现的任何非标准字符进行编码。

    var uri = "http://www.test.com/test value.html#start";
    //"http://www.test.com/test%20value.html#start"
    alert(encodeURI(uri));
    //"http%3A%2F%2Fwww.test.com%2Ftest%20value.html%23start"
    alert(encodeURIComponent(uri));

  一般来说,使用encodeURIComponent()最好的法律辦法 的前一天要比使用encodeURI()更多,不可能 在实践中更常见的是对查询字符串参数而完整篇 回会对基础URI进行编码。

  与encodeURI()和encodeURIComponent()最好的法律辦法 对应的另有俩个最好的法律辦法 分别是decodeURI()和decodeURIComponent()。其中,decodeURI()不还可否 对encodeURI()替换的字符进行解码,同样,decodeURIComponent()不还可否 对encodeURIComponent()替换的字符进行解码。

  eval()最好的法律辦法

  eval()最好的法律辦法 至少是JavaScript中最强大的一另有俩个最好的法律辦法 了,eval()最好的法律辦法 就像是一另有俩个完整篇 的JavaScript解析器,它只接受一另有俩个参数,即要执行的字符串。看下面的例子:

  这行代码的作用等价于下面这行代码:

  当解析器发现代码中调用eval()最好的法律辦法 时,它会将传入的参数当做实际的JavaScript语句来解析,回会 把执行结果插入到原位置。通过eval()执行的代码被认为是带有该次调用的执行环境的一帕累托图,回会 被执行的代码具有与该执行环境相同的作用域链。这原应通过eval()执行的代码可不需要还可否 引用在带有环境中定义的变量,同类:

    var msg = 'hello world';
    eval('alert(msg)');            //hello world

  可见,变量msg是在eval()调用的环境之外定义的,但其中调用的alert()仍然不需要还可否 显示“hello world”。这是不可能 里边第二行代码最终被替加上了一行真正的代码。同样地,亲戚亲戚朋友也可不需要还可否 在eval()调用中定义一另有俩个函数,回会 再在该调用的内外部代码中引用什儿 函数:

    eval("function sayHi(){alert('hi')}");
    sayHi();

  注意:不需要还可否 解释代码字符串的能力非常强大,但也非常危险。回会 在使用eval()时前要极为谨慎,很糙是在用它执行用户输入数据的清况 下。回会 ,不可能 会有恶意用户输入威胁你的站点或应用守护进程安全的代码(即所谓的代码注入)。

 Math对象

  与亲戚亲戚朋友在JavaScript直接编写的计算功能相比,Math对象提供的计算功能执行起来要快得多。Math对象还提供了辅助完成有有哪些计算的属性。

属性描述
E 返回算术常量 e,即自然对数的底数(约等于2.718)。
LN2 返回 2 的自然对数(约等于0.693)。
LN10 返回 10 的自然对数(约等于2.302)。
LOG2E 返回以 2 为底的 e 的对数(约等于 1.414)。
LOG10E 返回以 10 为底的 e 的对数(约等于0.434)。
PI 返回圆周率(约等于3.14159)。
SQRT1_2 返回返回 2 的平方根的倒数(约等于 0.707)。
SQRT2 返回 2 的平方根(约等于 1.414)。

  Math对象带有的最好的法律辦法 如下:

最好的法律辦法 描述
abs(x) 返回数的绝对值。
acos(x) 返回数的反余弦值。
asin(x) 返回数的反正弦值。
atan(x) 以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值。
atan2(y,x) 返回从 x 轴到点 (x,y) 的深度图(介于 -PI/2 与 PI/2 弧度之间)。
ceil(x) 对数进行上舍入。
cos(x) 返回数的余弦。
exp(x) 返回 e 的指数。
floor(x) 对数进行下舍入。
log(x) 返回数的自然对数(底为e)。
max(x,y) 返回 x 和 y 中的最高值。
min(x,y) 返回 x 和 y 中的最低值。
pow(x,y) 返回 x 的 y 次幂。
random() 返回 0 ~ 1 之间的随机数。
round(x) 把数四舍五入为最接近的整数。
sin(x) 返回数的正弦。
sqrt(x) 返回数的平方根。
tan(x) 返回角的正切。
toSource() 返回该对象的源代码。
valueOf() 返回 Math 对象的原始值。