美文网首页
《JavaScript高级程序设计》之笔记三

《JavaScript高级程序设计》之笔记三

作者: fanyank | 来源:发表于2017-03-04 13:10 被阅读2次

    第五章 引用类型

    引用类型是一种数据结构,用于将数据和功能组合在一起,他也常被称为类(但是并不是类)。

    1. 创建对象的两种方法 :

    //使用object类型
    var person = new Object();//等价于var person = {};
    person.name = "Jack";
    person.age = 29;
    //使用对象字面量表示法(优点是使用大量属性时无需重复写对象名)
    var person = {
      name : "Jack",
      age : 29
    }//注意属性之间用逗号隔开,最后一个属性后面没有逗号
    //另外在使用对象字面量表示法时,属性名也可以使用字符串(这样属性名就变成可读的哦)
    var person = {
      "name" : "Jack",
      "age" : 29
    }
    

    2. 数组 :

    在JavaScript中你可以用数组来表是任何一种数据,甚至在同一个数组中时也是如此,并且JavaScript数组的长度是动态调整的,你可以在任何时候给数组添加值或者删除值。

    //创建数组的方法
    var colors = new Array();
    var colors = new Array(20);
    var colors = new Array("Blue","Green","Red");
    //利用上述方法new操作符可以省略
    //更为常见的是使用字面量表示法
    var colors = ["Blue","Green","Red"];
    //数组的length属性并不是只读的,你可以用它来删除数组项或新增数组项
    var colors = ["Blue","Green","Red"];
    colors.length = 2;       //删除了Red项
    colors[colors.length] = "Red";
    colors[colors.length] = "Yellow";   //随时为数组增添项
    

    3. 栈方法 :

    • push() : push() 方法接收任意个参数,并把他们逐个添加到数组的末尾,最后返回修改后 数组的长度
    • pop() : pop() 方法则从数组的末尾移除一项,减少数组的长度,然后返回 数组移除的值
    //push
    var colors = new Array();
    var count = colors.push("Red","Blue");
    alert(count);      //2
    //pop
    var colors = new Array();
    var count = colors.push("Red","Blue");
    var item = colors.pop();
    alert(item);       //Blue
    alert(colors.length);    //1
    

    4. 队列方法 :

    • shift() : 移除数组的第一个项并返回该项,同时将数组的长度减一。
    • unshift() : 在数组前端添加任意个项并返回新数组的长度
    //shift     
    var colors = new Array();
    var count = colors.push("Red","Blue");
    var item = colors.shift();
    alert(item);       //Red
    alert(colors.length);     //1
    //unshift
    var colors = new Array();
    var count = colors.push("Red","Blue");
    var counts = colors.unshift("Black");
    alert(colors.counts);      //3
    

    5. 重排序方法 :

    • reverse() : 反转数组的顺序,返回排序过后的新数组
    • sort() : sort() 方法按升序排列数组项,即最小的值位于前面,最大的值位于后面,最后返回排序后的新数组。但具体是按什么来比较呢?其实为了实现排序,sort() 会调用每个数组元素的 toString() 方法,然后比较转型后的字符串,从而确定排序。
    //reverse
    var number = [1,2,3,4,5];
    number.reverse();
    alert(number);     //5,4,3,2,1
    //sort
    var number = [0,1,5,10,15];
    number.sort();
    alert(number);      //0,1,10,15,5(字符串比较规则嘛)
    //那么如何按照从小到大来比排列呢?
    function compare(a,b){
      if(a < b){
        return -1;
      }
      else if(a > b){
        return 1;
      }
      else{
        return  0;
      }
    }
    var number = [0,1,5,10,15];
    number.sort(compare);
    alert(number);       //0,1,5,10,15
    //要想从大到小只需将compare倒过来即可
    //看到这里你可能想说,好麻烦啊,compare就不能简单点吗?
    //答案是可以,但是只能对数值类型或者valueOf()方法返回数值类型的对象使用,函数定义如下:
    function compare(a,b){
      return a - b;
    }
    

    6. 操作方法 :

    • concat() : concat() 方法会创建当前数组的一个副本,然后将接受的参数添加到这个副本数组的末尾,最后返回 这个新数组,如果没有传入参数,将只创建一个副本数组。

    • slice() : 切割方法,接受两个参数,一个是切割起始位置,一个是切割末位置,
      然后返回起始位置和末位置之间的项,但不包括 末项 ,如果只有一个参数,则返回指定位置到数组末尾的所有项,需要注意的是,slice()* 方法不影响原数组。

    • splice() : 最强大的数组方法。

      • 删除:可以删除任意数量的项,指定两个参数,要删除的第一项的位置和要删除的项数。
      • 插入:可以向指定位置插入任意数量的项,指定三个参数,起始位置,0(要删除的项数),要插入的项(多个项用逗号隔开)。
      • 替换:可以向指定位置删除任意的项并添加任意的项,指定三个参数,起始位置,要删除的项数,要插入的项(多个用逗号隔开)。
    • join() : 将数组转换为字符串的方法,但原有数组仍然保留。
      传入的参数为指定的分隔符,不传则默认使用逗号将数组的每一个元素隔开。

    //concat
    var colors = ["Green"];
    var colors2 = colors.concat("Yellow",["Blue","Red"]);
    alert(colors2);   //Green,Yellow,Blue,Red
    //slice
    var colors = ["Green","Red","Blue","Yellow"];
    var colors2 = colors.slice(1);
    var colors3 = colors.slice(1,3);
    alert(colors2);     //Red,Blue,Yellow
    alert(colors3);     //Red,Blue
    //splice
    var colors = ["Red","Green","Blue"];
    var removed = colors.splice(0,1);   //删除第一项
    alert(colors);    //Green,blue
    alert(removed);    //Red        
    removed = colors.splice(1,0,"Yellow","Orange"); //从位置一开始插入两项
    alert(colors);    //Green,Yellow,Orange,Blue
    alert(removed);   //返回的是空数组
    removed = colors.splice(1,1,"Red","Purple"); //插入两项,删除一项
    alert(colors);   //Green,Red,Purple,Orange,Blue
    alert(removed);  //Yellow
    //join
    var names = new Array("Tom","John","Marry");
    alert(names.join("|"));   //Tom|John|Marry
    alert(names);             //Tom,John,Marry
    

    7. 位置方法 :

    • indexOf() : 从数组的开头(位置0)开始向后查找,返回 目标在数组中的位置
    • lastIndexOf() : 从数组的末尾开始向前查找,返回 目标在数组中的位置
      PS:没有找到两者都返回 -1
    var number = [1,2,3,4,5,4,3,2,1];
    alert(number.indexOf(4));          //3
    alert(number.lastIndexOf(4));      //5
    //还可以从你指定的位置开始查找,只需传入两个参数即可
    alert(number.indexOf(4,4));                //5(别犯蒙)
    alert(number.lastIndexOf(4,4));            //3(别犯蒙)
    

    8. 迭代方法 :

    简而言之就是对数组的每一个元素进行操作。

    • every() : 对数组的每一项运行给定函数,如果每一项都返回 true,则返回 true

    • some() : 对数组的每一项运行给定函数,只要有一项返回 true,则返回 true

    • filter() : 对数组的每一项运行给定函数,返回 true项组成的数组

    • map() : 对数组的每一项运行给定函数,返回 调用结果组成的数组

    • forEach() : 对数组的每一项运行给定函数,这个函数 没有返回值
      PS:以上方法不会修改原数组的值。

    var number = [1,2,3,4,5,4,3,2,1];
    //every
    var everyResult = number.every(function(item,index,array){
      return(item > 2);
    });
    alert(everyResult);        //false
    //some
    var someResult = number.some(function(item,index,array){
      return(item > 2);
    });
    alert(someResult);         //true
    //filter
    var filterResult = number.filter(function(item,index,array){
      return(item > 2);
    });
    alert(filterResult);       //[3,4,5,4,3]
    //map
    var mapResult = number.map(function(item,index,array){
      return item * 2;
    });
    alert(mapResult);          //[2,4,6,8,10,8,6,4,2]
    //forEach
    number.forEach(function(item,index,array){
    //执行某些操作
    });
    

    9. 缩小方法 :

    • reduce() : 从数组的第一项开始,遍历到数组末尾。Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算。

    • reduceRight() : 方向和 reduce() 相反,作用相同。

    //利用reduce累加求和
    var number = [1,2,3,4,5];
    var sum = number.reduce(function(x,y){
      return x + y;
    });
    alert(sum);         //15
    var sum2 = number.reduceRight(function(x,y){
    return x + y;
    });
    alert(sum2);        //15
    

    10. Date类型 :

    //创建一个日期对象
    var now = new Date();
    

    在没有给 Date() 构造函数传入任何参数的情况下,Date() 函数会自动调用当前的日期和时间。如果人为的控制时间,则需用到以下方法...

    Date.parse() : 该方法接受字符串参数,事实上,如果给 Date() 函数传入字符串参数,Date() 会在后台默认调用 parse() 方法,如果传入的参数不能表示日期,则会返回 NAN

    Date.UTC() : 该方法传入的参数是数值,按顺序传入年,月,日,时,分,秒参数,其中,只有前两个参数是必须要传的(年和月),其他的在不传的情况下默认为0,月份使用偏移量的方法来表示(即一月是0)。

    //不给Date传入参数调用当前时间
    var now = new Date();
    alert(now);    //Sat, 16 Apr 2016 07:50:35 GMT
    //Data.parse()
    var someDate = new Date(Date.parse("May 25,2004"));  //创建了一个2004年5月24号的日期对象
    var someDate = new Date(Date.UTC(2005,4,5,17,55,55));  //创建了一个2005年5月5号17点55分55秒的日期对象               
    //事实上我们完全可以根据Date()函数的特点省略Date.parse()和Date.UTC(),因为Date()会根据参数的类型自动在后台调用。
    var someDate = new Date("May 25,2004");  //创建了一个2004年5月24号的日期对象
    var someDate = new Date(2005,4,5,17,55,55);  //创建了一个2005年5月5号17点55分55秒的日期对象
    

    另外JavaScript添加了 Date.now() 方法,表示调用这个方法时的日期和时间的毫秒数。

    var start = Date.now();     //取得开始时间
    doSomething();              //调用函数
    var stop = Date.now();      //取得结束时间
    result = stop - start;
    //使用+操作符把Date()对象转换成字符串也可以达到同样的目的(+操作符在遇见对象时会自动调用toString()方法,取得对象的字符串值)
    var start = +new Date();
    doSomething();
    var stop = +new Date();
    result = stop - start;
    //使用Date.now()方法返回的只是一个时间戳(一堆表示毫秒的数字),直接输出是看不懂的,所以我们需要将时间戳转换成给正常人看的日期
    var now = Date.now();
    alert(now);                 //1460792002349(时间戳)
    var nowTime = new Date(now);
    alert(nowTime.toLocaleString());   //2016/4/16 下午3:35:50
    //还有很多转换时间戳的方法
    alert(nowTime.toDateString());    //Sat Apr 16 2016
    alert(nowTime.toTimeString());    //15:45:43 GMT+0800 (CST)
    alert(nowTime.toLocaleDateString());      //2016/4/16
    alert(nowTime.toLocaleTimeString());      //下午3:47:53
    alert(nowTime.toUTCString());  //Sat, 16 Apr 2016 07:50:35 GMT
    

    11. RegExp类型 :

    内容太多,主要用于验证一些字符串。具体内容可以参考廖雪峰的正则表达式教程

    12. Function类型 :

    //定义函数的两种方法,两种方式完全一样
    function sum(num1,num2){
      return sum1 + sum2;
    }      //第一种
    var sum = function(num1,num2){
    return sum1 + sum2;
    }       //第二种
    

    在JavaScript中,函数名只起到一个指针的作用,故可以像其他变量一样使用函数名来赋值等操作。

    function sum(sum1,sum2){
      return sum1 + sum2;
    }
    var anotherSum = sum;
    alert(anotherSum(10,10));      //20
    sum = null;
    alert(another(10,10));         //20
    

    JavaScript函数也没有重载的概念,还是因为函数名只起到了一个指针的作用,一旦函数名一样,那么后定义的函数将覆盖前面所定义的函数。

    var sum = function(sum1,sum2){
      return sum1 + sum2;
    }
    var sum = function(sum1,sum2){
      return sum1 - sum2;
    }     //将覆盖前面所定义的函数
    alert(sum(10,2));      //8
    //函数的声明与函数表达式:
    //JavaScript引擎会在代码执行前将函数的声明放在源代码树的顶部,所以即使后声明函数也不会有什么问题
    alert(sum(10,10));      //20
    function sum(num1,num2){
      return sum1 + sum2;
    }
    //但是如果这样做就不对了
    var sum = function(num1,num2){
      return sum1 + sum2;
    }      //这样做会发生错误,原因是这是一个对sum初始化语句,而不是函数的声明,开头讲的两个函数的定义方法也仅有这一种区别
    

    继续深入理解函数名是指针的作用,函数名还可以被当做另一个函数的参数来传递,也可以作为另一函数的返回值。

    //用作函数的参数       
    function callSomeFunction(someFunction,someArgument){
      return SomeFunction(someArgument)
    }      //接受函数的函数
    function add10(num){
      return num + 10;
    }      //被传递的函数
    var result = callSomeFunction(add10,10);
    alert(result);      //20
    function getGreeting(name){
      return "Hello," + "name";
    }
    var hello = callSomeFunction(getGreeting,"Jack");
    alert(hello);      //Jack
    
    //用作函数的返回值
    function creatComparisonFunction(propertyName){
      return function(object1,object2){
        var value1 = object1[property];
        var value2 = object2[property]; //使用方括号取得property值
        if(value1 < value2){
          return -1;
        }
        else if(value1 > value2){
          return 1;
        }
        else{
          return 0;
        }
      }
    }
    var data = [{name:"Jack",age:28},{name:"Sam",age:29}];
    data.sort(creatComparisonFunction("name"));
    alert(data[0].name);     //Jack
    data.sort(creatComparisonFunction("age"));
    alert(data[0].name);      //Sam
    

    在函数的内部,有两个特殊的 对象 ,一个是 arguments ,一个是 this

    • 先来说 arguments ,这个对象有一个 callee 属性,该属性是一个指针,指向拥有这个 arguments 的函数。
    • 再来说 this ,其行为与Java和C#中的 this 类似,该对象引用的是据以执行的环境对象,this 在全局作用域中引用的就是 window
    • caller 这个 属性 保存着调用当前函数的函数的引用。
    //callee
    //来看一个阶乘函数
    function factorial(num){
      if(num <= 1)
        return 1;
        else
        {
          return num * factorial(num - 1);
        }
    }//我如果修改了函数名还得修改函数内部的代码(factorial),现在我不想这么做,能不能用一个东西来代替函数内部的函数名(factorial)
    //这就需要用到了arguments的callee属性了
    function factorial(num){
      if(num <= 1)
        return 1;
        else
        {
          return num * arguments.callee(num - 1);
        }
    }     //使用arguments.callee代替了原函数名,这样便保证了无论引用函数时是什么名字,都可以正常的进行递归调用啦
    var trueFactorial = factorial;
    factorial = null;
    alert(trueFactorial(5));    //120
    alert(trueFactorial(5));    //错误
    //this
    window.color = "Blue";
    var o = {color:"Red"};
    function sayColor(){
      alert(this.color);
    }
    sayColor();      //Blue
    o.sayColor = sayColor;
    o.sayColor();    //Red
    //caller
    function outer(){
      inner();
    }
    function inner(){
      alert(arguments.callee.caller);
    }
    outer();   //因为outer()调用了inner,所以arguments.callee.caller就指向了outer()
    

    函数属性和方法 :
    前面曾经提到过,函数 也是对象,既然是对象,那么函数也有着自己的属性和方法,每个函数包含两个属性:lengthprototype

    • length : 表示函数希望接受的命名参数的个数,这里不再举例。
    • prototype : 在ES5中,prototype 是不可枚举的,故用 for-in 没办法发现它。

    每个函数都包括两个非继承而来的方法,apply()call(),这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内的 this 值。

    • apply() : 该方法接受两个参数,一个是 运行函数的作用域,一个是 参数数组(可以是数组的实例,也可以是arguments对象)
    • call() : 第一个参数也是 运行函数的作用域其余的参数 都直接传递给函数。
      两个方法不仅仅是可以传递参数这么简单,他真正牛逼的地方在于可以 改变函数的运行域
    • bind() : 这个方法会创建一个函数的实例,其 this 会被绑定到传给 bind() 函数的值。
    function sum(num1,num2){
      return sum1 + sum2;
    }
    //apply
    function callSum1(num1,num2){
      return sum.apply(this,arguments);  //传入arguments
    }
    function callSum2(num1,num2){
      return sum.apply(this,[num1,num2]);   //传入数组
    }
    alert(callSum1(10,10));     //20
    alert(callSum2(10,10));     //20
    //call
    function callSum(num1,num2){
      return sum.call(this,num1,num2);
    }
    alert(callSum(10,10));      //20
    //改变函数的运行域
    var o = {color:"Blue"};
    window.color = "Red";
    function sayColor(){
      alert(this.color);
    }
    sayColor.call(this);     //Red
    sayColor.call(window);   //Red
    sayColor.call(o);        //Blue
    //bind
    window.color = "Red";
    var o = {color:"Blue"};
    function sayColor(){
      alert(this.color);
    }
    var anotherColor = sayColor.bind(o);
    anotherColor();   //Blue
    

    13. 基本包装类型 :

    为了便于操作基本类型值,JavaScript提供了3个特殊的引用类型:Boolean,Number,String.这些类型同时具有与各自基本类型相应的特殊行为。
    实际上,每当读取一个基本类型的时候,后台就会自动创建一个与其对应的基本包装类型的对象,从而让我们调用一些方法来操作这些数据

    var s1 = "some text";
    var s2 = s1.subString(2);    //"me text"
    //在后台跑的程序为
    var s1 = new String("some text");
    var s2 = s1.subString(2);
    s1 = null;
    //经过上述步骤处理,字符串就变得和对象一样了,也就意味可以像对象那样去调用方法了,上述步骤同样适用于Boolean,Number类型
    //同时需要指明的是,我们不能自己给Boolean,Number,String添加属性,只能调用自带的方法
    

    那么怎样来检测到底是 基本包装类型,还是 基本类型 呢?

    var s1 = "abc";
    var s2 = new String("abc");
    alert(typeof s1);    //"string"
    alert(typeof s2);    //"object"
    alert(s1 instanceof String);    //true
    alert(s2 instanceof String);    //false
    

    接下来开始介绍 Boolean,Number,String

    • Boolean 不建议大家使用,这里不再介绍。

    • Number : 这里只说一下 toFixed() 方法...

    var num = 10;
    alert(num.toFixed(2));  //10.00
    
    • String : 分为字符方法和字符串操作方法两种。

      字符方法

      • charAt()
      • charCodeAt()

      字符串操作方法

      • concat()
      • slice()
      • substr()
      • substring()
      • indexOf() 字符串位置方法。
      • lastIndexOf() 字符串位置方法。
      • tirm() 删除字符串前后的所用空格。
      • toLowerCase() 字符串大小写转换方法。
      • toUpperCase() 字符串大小写转换方法。
      • match() 字符串匹配方法 match(),本质上与调用RegExp里的exec()方法一样,match()方法只接受一个参数,要么是 一个正则表达式,要么是 一个RegExp对象
      • search() 字符串查找方法 search(),参数与match()相同。
      • replace() 字符串替换方法 replace(),接受两个参数,第一个参数 可以使正则表达式或字符串,第二个参数是 字符串或者一个函数。如果参数是字符串,则只会替换第一个被找到的字符串,要想全部被替换,只能使用正则表达式
      • split() 这个方法可以基于指定的分隔符来将一个字符串分割为多个字符串,并将结果保存在 一个数组中,分隔符可以是字符串,也可以是正则表达式。
      • localCompare() 比较两个字符串,如果字符串在字母表中排在参数字符串之前,返回-1,反之返回1,相等返回0。
      • formCharCode() 与charAt()方法相反。
    //charAt()
    var stringValue = "hello,world";
    alert(stringValue.charAt(1));     //"e"
    //charCodeAt()
    var stringValue = "hello,world";
    alert(stringValue.charCodeAt);    //"101"
    //JavaScript还定义了一种更简单的访问个别字符的方法
    var stringValue = "hello,world";
    alert(stringValue[1]);     //"e"
    //concat()
    var stringValue = "hello ";
    var result = stringValue("world");
    alert(result);     //"hello world",其实更多情况下用的是加号操作符来拼接字符串
    //JavaScript还提供了三个创建新字符串的方法,即 slice() substr() substring()
    var stringValue = "hello world";
    alert(stringValue.slice(3));     //"lo world"
    alert(stringValue.substr(3));    //"lo world"
    alert(stringValue.substring(3)); //"lo world"
    alert(stringValue.slice(3,7));   //"lo w"
    alert(stringValue.substr(3,7));  //"lo w"
    alert(stringValue.substring(3,7)); //"lo worl"
    //indexOf() lastIndexOf()
    var stringValue = "hello world";
    alert(stringValue.indexOf("o"));     //4,从前往后
    alert(stringValue.lastIndexOf("o"));  //7,从后往前
    //传递两个参数
    alert(stringValue.indexOf("o",6));    //7,从位置6开始查找
    alert(stringValue.lastIndexOf("o",6)); //4,同上
    //可以通过循环调用的方法来找到字符串中所用匹配到的字符
    var stringValue = "hello world";
    var positions = new Array();
    var pos = stringValue.indexOf("o");
    while(pos > -1)
    {
      positions.push(pos);
      pos = string.indexOf("o",pos + 1);
    }
    alert(positions);  //"4,7"
    //tirm()
    var stringValue = "   hello world   ";
    alert(stringValue.tirm());  //"hello world"
    //toLowerCase() toUpperCase()
    var stringValue = "Hello world";
    alert(stringValue.toLowerCase());    //"hello world"
    alert(stringValue.toUpperCase());    //"HELLO WORLD"
    //match()
    var text = "cat,bat,sat,fat";
    var partten = /.at/g;
    var matches = text.match(partten); //传入一个正则表达式
    alert(matches); //"at,at,at,at"
    //search()
    var text = "cat,bat,sat,fat";
    var pos = text.search(/at/g);
    alert(pos);     //1,5,9,13
    //replace()
    var text = "cat,bat,sat,fat";
    var result = text.replace(/at/g,"ond");
    alert(result);   //"cond,bond,sond,fond"
    //如果第二个参数是字符串,那么还可以使用一些特殊字符序列,将正则表达式操作得到的值插入到结果字符串中。下表列出了JavaScript提供的特殊字符序列
    
    特殊字符序列表特殊字符序列表
    //通过上表特殊的字符序列,可以使用最近一次匹配结果的内容
    var text = "cat,bat,sat,fat";
    result = text.replace(/.at/g,"word($1)");
    alert(result);   //"word(cat),word(bat),word(sat),word(fat)"
    //split()
    var text = "cat,bat,sat,fat";
    var result = text.split(",");
    alert(result);    //["cat","bat""sat""fat"]
    var result1 = text.split(",",2);
    alert(result1);    //["cat","bat"]
    var result2 = text.split(/[^/,]+/);
    alert(result2);    //["",",",",",""]
    //localCompare()
    var stringValue = "yellow";
    alert(stringValue.localCompare("brown"));    //1
    alert(stringValue.localCompare("yellow"));   //0
    alert(stringValue.localCompare("zoo"));      //-1
    

    14. 单体内置对象 :

    单体内置对象的定义是 : 由JavaScript实现提供的,不依赖于宿主环境的对象,这些对象在JavaScript程序执行之前就已经存在了

    • Global对象 :
      Global(全局)对象可以说是JavaScript中最特别的一个对象了,因为不管你从什么角度看,这个对象都是不存在的。JavaScript中的 Global对象 在某种意义上是作为一个终极的 兜底对象 来定义的,换句话说,不属于任何其他对象的属性和方法,最终都是它的属性方法。事实上,没有全局变量或全局函数,所有在全局作用域定义的属性和函数,都是 Global对象 的属性,前面所介绍的那些函数(inNaN() , parseInt() , parseFloat())实际上都是 Global对象 的方法。

    Global对象 有自己的方法

    • encodeURI()
    • encodeURIComponent()
    • decodeURI()
    • decodeURIComponent()

    这几种方法都用于对URI进行编码或者解码,这里不再一一介绍。

    • eval() : 大概是JavaScript中最强大的一个方法,它就像是一个完整的JavaScript解析器,它只接受一个参数,即 要执行的JavaScript语句的字符串 作用是将传入的参数当做实际的JavaScript语句来执行,这意味着通过 eval() 可以引用包含环境中定义的变量。
    //eval()
    eval("alert('hi')");     //hi
    //上面的代码等价于下面这行代码
    alert("hi");             //hi
    //包含环境中的变量
    var msg = "Hello world";
    eval("alert(msg)");      //Hello world
    
    • Math对象 :
      这里主要介绍几种 Math()对象 方法。
      • min() : 功能如其名,参数可以是任意多个
      • max() : 功能如其名,参数可以是任意多个
        以下是舍入方法 :
      • ceil() : 执行向上舍入。
      • floor() : 执行向下舍入。
      • round() : 四舍五入。
        以下是随机数方法 :
      • random() : 返回 介于0到1之间的一个随机数,不包括0和1
        值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值),这个公式由于调用了floor()方法,故返回的都是整数。
    //min()
    var min = Math.min(3,23,44,78);
    alert(min);     //3
    //max()
    var max = Math.max(3,23,44,78);
    alert(max);      //78
    //这里介绍一种求数组里面最值得方法
    var arr = [1,2,3,4,5,6,7,8];
    min = Math.min.apply(Math,arr); //注意这里apply方法的参数
    alert(min);      //1
    //ceil()
    alert(ceil(25.9));     //26
    alert(ceil(25.5));     //26
    alert(ceil(25.1));     //26
    //floor()
    alert(floor(25.9));     //25
    alert(floor(25.5));     //25
    alert(floor(25.1));     //25
    //round()
    alert(round(25.9));      //26
    alert(round(25.5));      //26
    alert(round(25.1));      //25
    //random()
    //返回一个1到10的整数
    var num = Math.floor(Math.random() * 10 + 1);
    //返回一个2到10的整数
    var num = Math.floor(Math.random() * 9 + 2);
    //实际上,这样做不是特别的直观,我们可以自己写一个函数来令它更直观一些
    function selectFrom(lowerValue,upperValue){
      var choices = upperValue - lowerValue + 1;
      return Math.floor(Math.random() * choices + lowValue);
    }       
    var num = selectFrom(2,10);
    alert(num);   //介于2到10之间的一个随机数
    //具体应用
    var colors = ["green","blue","red"];
    var color = colors[selectFrom(0,colors.length - 1)];
    alert(color);    //返回一个随机的颜色
    

    相关文章

      网友评论

          本文标题:《JavaScript高级程序设计》之笔记三

          本文链接:https://www.haomeiwen.com/subject/ewzdgttx.html