第五章:引用类型

第五章:引用类型

5.1 Object 类型

5.1 .1 创建 Object 实例的方式有两种

// 第一种
var person = new Object(); 
person.name = "Nicholas"; 
person.age = 29;
// 第二种 字面量方式
var person = {
    name : "Nicholas", 
    age : 29
};
// 在使用对象字面量语法时,属性名也可以使用字符串,如下面这个例子所示。
var person = {
    "name" : "Nicholas",
    "age” : 29,
    5 : true    //这里的数值属性名会自动转换为字符串
};
//另外,使用对象字面量语法时,如果留空其花括号,则可以定义只包含默认属性和方法的对象,如下所示:
var peraon = {}://与new object()相同
person.name = "Nicholas";
person.age = 29;

5.2 Array 类型

5.2.1 创建数组的两种方式

// 第一种 使用 Array 构造函数
var colors = new Array();
var colors = new Array(20);// 创建 length 为 20 的数组
var colors = new Array("red", "blue", "green");//创建了一个包含3个字符串值的数组:

// 另外,在使用Array构造函数时也可以省略new操作符。如下面的例子所示,省略new操作符的结果相同:
var colors = Array(3);//创建一个包含3项的数组var 
names = Array("Greg");//创建一个包含1项,即字符率“Greg”的数组

//第二种 使用数组字面量表示法
var colors = ["red","blue","green"];//创建一个包含3个字符串的数组
var names = [];//创建一个空数组
var values = [1,2,];//不要这样!这样会创建一个包含2或3项的数组var options=[,,,,,];//不要这样!这样会创建一个包含5或6项的数组
  • 在读取和设置数组的值时,要使用方括号并提供相应值的基于 0 的数字索引,如下所示:

    var colors = ["red","blue","green"];//定义一个字符事数组
    alert(colors[0]);//显示第一项
    colors[2] = "black";//修改第三项
    colors[31 = "brown";//新增第四项
    
  • 数组的 length 属性很有特点——它不是只读的。因此,通过设置这个属性,可以从数组的末尾移除项或向数组中添加新项。请看下面的例子:

    var colors = ["red","blue","green"];//创建一个包含3个字符事的数组
    colora.length = 2;
    alert(colora[2]);//undefined
    
    var colors = ["red","blue","green"];//创建一个包含3个字符事的数组
    colora.length = 4;
    alert(colora[3]);//undefined
    
    // 利用1ength属性也可以方便地在数组末尾添加新项,如下所示:
    var colors = ["red","blue","green"];//创建一个包含3个字符事的数组
    colors[colors.length] = "black";//在位置3)添加一个颜色
    
    

5.2.2 检测数组

if(value instanceof Array){
    //对数组执行某些操作    
}//若网页中存在多个框架,则会出现问题

// ES5 新增Array.isArray()
if(Array.isArray(value)){
    //对数组执行某些操作
}

5.2.3 转换方法

  • 如前所述,所有对象都具有 toLocalestring()、tostring()和 valueof()方法。其中,调用数组的 tostring()方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。而调用valueof()返回的还是数组。实际上,为了创建这个字符串会调用数组每一项的 tostring()方法。来看下面这个例子。

    var colors=["red","blue","green"];//创建一个包含3个字符串的数组
    alert(colors.tostring());//red,blue,green 
    alert(colors.valueOf());//red,blue,green 
    alert(colors);//red,blue,green  会在后台调用 toString 方法
    
    
  • join 方法

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

5.2.4 栈方法

  • push 方法

    • 添加至数组末尾,并返回修改后的数组长度

      var colors=new Array();//创建一个数组
      var count=colors.push("red","green");//推入两项
      alert(count);//2
      count=colors.push(“black");//推入另一项
      alert(count);//3
      
  • pop 方法

    • 从数组末尾删除最后一项,减少数组的 长度,并返回移除的项

      var item=colors.pop();//取得最后一项
      alert(item);//"black"
      alert(colors.length);//2
      

5.2.5 队列方法

  • shift 方法

    • 从数组前端删除第一项,减少数组的 长度,并返回移除的项

      var item=colors.shift();//取得第一项
      alert(item);//"red"
      alert(colors.length);//2
      
  • unshift 方法

    • 添加至数组前端,并返回修改后的数组长度

      var colors=new Array();/创建一个数组var count=colora.unshift("red","green");//推入两项
      alert(count);//2
      

5.2.6 重排序方法

  • reverse (反转)方法

    var values=[1,2,3,4,5];
    values. reverse(); 
    alert(values);//5,4,3,2,1
    
  • sort(排序,种类)方法

    • 即使数组中的每一项都是数值,sort() 方法会调用 toString() 比较的是字符串

      var values=[0,1,5,10,15]; 
      values,sort(); 
      alert(values);//0,1,10,15,5
      
      //解决方法
      function compare (valuel, value2) {
          if (valuel< 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;
      }
      

5.2.7 操作方法

  • 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 方法

    • 接收两个参数:返回项的起始位置和结束位置(不包括结束位置的项)
    var colors=["red","green","blue","yellow","purple"]; var colors2=colors. slice(1); 
    var colors3=colors. slice(1,4); 
    alert(colors2);//green, blue, yellow, purple 
    alert(colors3);//green, blue, yellow
    
  • splice 方法

    • 删除:可以删除任意数量的项,只需指定2个参数:要删除的第一项的位置和要删除的项数。
      例如,splice(0,2)会删除数组中的前两项。

    • 插入:可以向指定位置插入任意数量的项,只需提供3个参数:起始位置、0(要删除的项数)和要插入的项。如果要插入多个项,可以再传入第四、第五,以至任意多个项。例如,splice(2,0,"red","green")会从当前数组的位置2开始插入字符串“red”和“green"。

    • 替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定3个参数:起始位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。例如,splice(2,1,"red",“green“)会删除当前数组位置2的项,然后再从位置2开始插入字符串“red“和“green"。

    • splice()方法始终都会返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何项,则返回一个空数组)。下面的代码展示了上述3种使用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");//从位置1开始括入两项
      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,返回的数组中只包含一项
      

5.2.8 位置方法

  • 都接收两个参数,要查找的项和(可选的)表示查找起点的索引

  • 两个方法都返回查找的项在数组中的位置,没有找到返回 -1

  • 要查找的向必须严格相等(===)

    • indexOf 方法
      • 从数组的开头(位置0)开始向后找
    • lastIndexOf 方法
      • 从数组的末尾开始向前找
    var numbers=[1,2,3,4,5,4,3,2,1];
    
    alert(numbers. indexof(4));//3
    alert(numbers.1astIndexof(4));//5
    
    alert(numbers. indexOf(4,4));//5
    alert(numbers. lastIndexof(4,4));//3
    
    var person={ name:"Nicholas"}; 
    var people=[{ name:"Nicholas"}]; 
    
    var morePeople=[person]; 
    
    alert(people.indexOf(person));//-1
    alert(morePeople. indexof(person));//0
    

5.2.9 迭代方法

  • ES5 中定义了 5 个迭代方法,每个方法接收两个参数

  • ECMAScript5为数组定义了5个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和
    (可选的)运行该函数的作用域对象——影响this的值。传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置和数组对象本身。根据使用的方法不同,这个函数执行后的返回值可能会也可能不会影响方法的返回值。以下是这5个迭代方法的作用。

    • every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true。
    • filter()(过滤器):对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组
    • forEach():对数组中的每一项运行给定函数。这个方法没有返回值。
    • map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
    • some():对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true
    // // every() 和 some()
    var numbers = [1,2,3,4,5,4,3,2,1]; 
    
    var everyResult = numbers.every(function(item, index, array){     return (item > 2);  }); 
    alert(everyResult);    //false 
    
    var someResult = numbers.some(function(item, index, array){     return (item > 2); }); 
    alert(someResult);     //true 
     
    // filter()
    var numbers = [1,2,3,4,5,4,3,2,1]; 
     
    var filterResult = numbers.filter(function(item, index, array){    
        return (item > 2); 
    }); 
    alert(filterResult);  //[3,4,5,4,3] 
    
    // map()
    var numbers = [1,2,3,4,5,4,3,2,1]; 
     
    var mapResult = numbers.map(function(item, index, array){     
        return item * 2; 
    });  
    alert(mapResult);  //[2,4,6,8,10,8,6,4,2] 
    
    // forEach()
    var numbers = [1,2,3,4,5,4,3,2,1]; 
     
    numbers.forEach(function(item, index, array){    
        //执行某些操作  
    }); 
    

5.2.10 归并方法

  • :reduce()和 reduceRight()。这两个方法都会迭 代数组的所有项,然后构建一个终返回的值。

  • ,reduce()方法从数组的第一项开始,逐个遍历 到后。而 reduceRight()则从数组的后一项开始,向前遍历到第一项。

  • 这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值

  • 给 reduce()和 reduceRight()的函数接收 4 个参数:前一个值、当前值、项的索引和数组对象。这 个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第 一个参数是数组的第一项,第二个参数就是数组的第二项。

    // reduce()
    var values = [1,2,3,4,5]; 
    
    var sum = values.reduce(function(prev, cur, index, array){    
        return prev + cur; 
    });
    alert(sum); //15 
     
    //reduceRight()的作用类似,只不过方向相反而已。来看下面这个例子。 
    var values = [1,2,3,4,5];
    
    var sum = values.reduceRight(function(prev, cur, index, array){ 
        return prev + cur;
    }); 
    alert(sum); //15
    

5.3 Date 类型

  • 创建一个日期对象

    var now = new Date();//不传参数默认获取当前时间和日期
    //在调用 Date 构造函数而不传递参数的情况下,新创建的对象自动获得当前日期和时间。如果想根 据特定的日期和时间创建日期对象,必须传入表示该日期的毫秒数
    var dt = new Date("2019/9/26");
    
  • Date.parse() 方法

    • 接收一个表示日期的字符串参数,然后根据字符串返回相应的毫秒数
    // 例如,要为 2004年 5月 25日创建一个日期对象,可以使用下面的代码: 
     var someDate = new Date(Date.parse("May 25, 2004")); 
    
  • Date.UTC()方法

    • 同样也返回表示日期的毫秒数,但它与 Date.parse()在构建值时使用不同的信息
    • Date.UTC()的参数分别是年份、基于 0的月份(一月是 0,二月是 1,以此类推)、月中的哪一天 (1 到 31)、小时数(0 到 23)、分钟、秒以及毫秒数
    // GMT 时间 2000 年 1 月 1 日午夜零时 
    var y2k = new Date(Date.UTC(2000, 0)); 
     
    // GMT 时间 2005 年 5 月 5 日下午 5:55:55
    var allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55)); 
    
    // 如同模仿 Date.parse()一样,Date 构造函数也会模仿 Date.UTC(),但有一点明显不同:日期 和时间都基于本地时区而非 GMT来创建。不过,Date 构造函数接收的参数仍然与 Date.UTC()相同。因此,如果第一个参数是数值,Date 构造函数就会假设该值是日期中的年份,而第二个参数是月份, 以此类推。据此,可以将前面的例子重写如下。
    // 本地时间 2000 年 1 月 1 日午夜零时 
    var y2k = new Date(2000, 0); 
     
    // 本地时间 2005 年 5 月 5 日下午 5:55:55 
    var allFives = new Date(2005, 4, 5, 17, 55, 55); 
    
  • Date.now() 方法

    • 返回表示调用这个方法时的日期和时间的毫秒数
    //取得开始时间 
    var start = Date.now(); 
     
    //调用函数 
    doSomething(); 
     
    //取得停止时间 
    var stop = Date.now();     
    result = stop – start; 
    
    // 使用 + 操作符把 Date 对象转成字符串也可以达到同样的目的
    //取得开始时间 
    var start = +new Date(); 
     
    //调用函数 
    doSomething(); 
     
    //取得停止时间 
    var stop = +new Date();     
    result = stop – start; 
    

5.3.1 Date 比较大小

  • Date 类型的 valueOf()方法,则根本不返回字符串,而是返回日期的毫秒表示。因此,可以 方便使用比较操作符(小于或大于)来比较日期值。请看下面的例子。
var date1 = new Date(2007, 0, 1);    //"January 1, 2007"
var date2 = new Date(2007, 1, 1);    //"February 1, 2007" 
 
alert(date1 < date2); //true
alert(date1 > date2); //false

5.3.2 日期格式化方法

  • toDateString()——以特定于实现的格式显示星期几、月、日和年;(英文的日期)
  • toLocaleDateString()——以特定于地区的格式显示星期几、月、日和年; (数字格式)
  • toTimeString()——以特定于实现的格式显示时、分、秒和时区;
  • toLocaleTimeString()——以特定于实现的格式显示时、分、秒;
  • toUTCString()——以特定于实现的格式完整的 UTC日期
  • 与 toLocaleString()和 toString()方法一样,以上这些字符串格式方法的输出也是因浏览器 而异的,因此没有哪一个方法能够用来在用户界面中显示一致的日期信息。

5.3.3 日期/时间组件方法

方法 说明
getFullYear() 获取年份
getMonth() 获取月份(0-11)
getDate() 获取日期
getHours() 小时
getMinutes() 分钟
getSeconds()
getDay() 星期(0 = 星期天)
valueOf 毫秒值

5.4 RegExp 类型

  • 创建正则表达式

    var expression = / pattern / flags;
    
  • 3 个标志

    • g : 表示全局模式,,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即 停止;

    • i :表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写

    • m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模 式匹配的项

    /* * 匹配字符串中所有"at"的实例 */
    var pattern1 = /at/g; 
     
    /* * 匹配第一个"bat"或"cat",不区分大小写 */
    var pattern2 = /[bc]at/i; 
     
    /* * 匹配所有以"at"结尾的 3 个字符的组合,不区分大小写 */ 
    var pattern3 = /.at/gi; 
    
  • 正则表达式中的元字符包括:( [ { \ ^ $ | ) ? * + .]}

    /* 
    * 匹配第一个"bat"或"cat",不区分大小写 
    */ 
    var pattern1 = /[bc]at/i; 
     
    /* 
    * 匹配第一个" [bc]at",不区分大小写
    */ 
    var pattern2 = /\[bc\]at/i; 
     
    /* 
    * 匹配所有以"at"结尾的 3 个字符的组合,不区分大小写 
    */ 
    var pattern3 = /.at/gi; 
     
    /*
    * 匹配所有".at",不区分大小写 
    */ 
    var pattern4 = /\.at/gi; 
     
    

5.4.1RegExp 实例属性

  • global:布尔值,表示是否设置了 g 标志。

  • ignoreCase:布尔值,表示是否设置了 i 标志。

  • lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从 0算起。

  • multiline:布尔值,表示是否设置了 m 标志。

  • source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回

    var pattern1 = /\[bc\]at/i; 
     
    alert(pattern1.global);         //false 
    alert(pattern1.ignoreCase);     //true 
    alert(pattern1.multiline);      //false 
    alert(pattern1.lastIndex);      //0 
    alert(pattern1.source);         //"\[bc\]at" 
     
    var pattern2 = new RegExp("\\[bc\\]at", "i"); 
     
    alert(pattern2.global);         //false 
    alert(pattern2.ignoreCase);     //true 
    alert(pattern2.multiline);      //false 
    alert(pattern2.lastIndex);      //0 
    alert(pattern2.source);         //"\[bc\]at" 
     
    

5.4.2 RegExp 实例方法

  • exec() 方法

    • exec()接受一个参数,即 要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null
    • 返回的数组虽然是 Array 的实例,但包含两个额外的属性:index 和 input。其中,index 表示匹配 项在字符串中的位置,而 input 表示应用正则表达式的字符串。
    var text = "mom and dad and baby"; 
    var pattern = /mom( and dad( and baby)?)?/gi; 
     
    var matches = pattern.exec(text); 
    alert(matches.index);     // 0 
    alert(matches.input);     // "mom and dad and baby" 
    alert(matches[0]);        // "mom and dad and baby"
    alert(matches[1]);        // " and dad and baby" 
    alert(matches[2]);        // " and baby" 
     
    

    ...待续

5.5 Function 类型

  • 函数名是指向函数的指针

    
     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 
    

5.5.1 没有重载

5.5.2 函数声明与函数表达式

  • 解析器会先读取函数声明,至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真 正被解释执行

    alert(sum(10,10));
    function sum(num1, num2){    
      return num1 + num2; 
    } // 正常执行
    
    alert(sum(10,10)); 
    var sum = function(num1, num2){   
      return num1 + num2;
    }; // 会导致“unexpected identifier”(意外标识符)错误
     
    

5.5.3 作为值的函数

  • 因为 ECMAScript中的函数名本身就是变量,所以函数也可以作为值来使用。

    function callSomeFunction(someFunction, someArgument){    
        return someFunction(someArgument); 
    } 
    
    // 这个函数接受两个参数。第一个参数应该是一个函数,第二个参数应该是要传递给该函数的一个值。 然后,就可以像下面的例子一样传递函数了。 
    function add10(num){     
        return num + 10;
    } 
     
    var result1 = callSomeFunction(add10, 10); 
    alert(result1);   //20 
     
    function getGreeting(name){     
        return "Hello, " + name; 
    } 
     
    var result2 = callSomeFunction(getGreeting, "Nicholas"); 
    alert(result2);   //"Hello, Nicholas"
    

5.5.4 函数内部属性

  • arguments

    • 它是一个类数组对象,包含着传入函数中的所有参数

    • 主要作用是保存函数参数

    • 这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。

      // 阶乘函数
      function factorial(num){    
          if (num <=1) {       
              return 1;     
          } else {        
              return num * factorial(num-1);
          }
      } 
      
      function factorial(num){  
          if (num <=1) {       
              return 1;    
          } else {       
              return num * arguments.callee(num-1); 
          } 
      }  
      
      
      
      var trueFactorial = factorial; 
       
      factorial = function(){     
          return 0; 
      }; 
       
      alert(trueFactorial(5));     //120 
      alert(factorial(5));         //0 
       
      
      
  • this

    • this 引用的是函数据以执行的环境对象

      window.color = "red"; var o = { color: "blue" }; 
       
      function sayColor(){     
          alert(this.color); 
      } 
       
      sayColor();     //"red" 
       
      o.sayColor = sayColor; 
      o.sayColor();   //"blue" 
      
  • ECMAScript 5也规范化了另一个函数对象的属性:caller

    • 这个属性中保存着调用当前函数的函数的引用, 如果是在全局作用域中调用当前函数,它的值为 null。

      function outer(){     
          inner();
      } 
       
      function inner(){    
          alert(arguments.callee.caller);
      } 
       
      outer(); //[Function: outer]
      

5.5.5 函数属性和方法

  • 每个函数都包含两个 属性:length 和 prototype。其中,length 属性表示函数希望接收的命名参数的个数

    
     function sayName(name){     
         alert(name); 
     }       
     
    function sum(num1, num2){  
        return num1 + num2; 
    } 
     
    function sayHi(){     
        alert("hi"); 
    } 
     
    alert(sayName.length);      //1 
    alert(sum.length);          //2 
    alert(sayHi.length);        //0 
    
  • 每个函数都包含两个非继承而来的方法:apply()和 call()。

    • 这两个方法的用途都是在特定的作 用域中调用函数

    • apply()方法接收两个参数:一个 是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是 Array 的实例,也可以是 arguments 对象。

      
       function sum(num1, num2){   
           return num1 + num2;
       } 
       
      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()方法与 apply()方法的作用相同,它们的区别仅在于接收参数的方式不同。

      function sum(num1, num2){    
          return num1 + num2;
      } 
       
      function callSum(num1, num2){   
          return sum.call(this, num1, num2);
      } 
       
      alert(callSum(10,10));   //20 
      
    • 它们真正强大的地方是能够扩充函数 赖以运行的作用域

      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 
      

5.6 基本包装类型

  • Boolean、Number 和 String

  • 实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们 能够调用一些方法来操作这些数据

    var s1 = "some text";
    var s2 = s1.substring(2); 
    // 当第二行代码访问 s1 时,访问过程处于一种读取模式,也就是要 从内存中读取这个字符串的值。而在读取模式中访问字符串时,后台都会自动完成下列处理。 
    // (1) 创建 String 类型的一个实例;
    // (2) 在实例上调用指定的方法;
    // (3) 销毁这个实例。 可以将以上三个步骤想象成是执行了下列 ECMAScript代码。 
    var s1 = new String("some text"); 
    var s2 = s1.substring(2);
    s1 = null;
    
  • 引用类型与基本包装类型的主要区别就是对象的生存期。使用 new 操作符创建的引用类型的实例, 在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一 行代码的执行瞬间,然后立即被销毁。这意味着我们不能在运行时为基本类型值添加属性和方法

    var s1 = "some text";
    s1.color = "red"; 
    alert(s1.color);  //undefined 
    

5.6.1 Boolean 类型

  • 要创建 Boolean 对象,可以像下面这样调用 Boolean 构造函数并传入 true 或 false 值。

    var booleanObject = new Boolean(true); 
    
  • 建议不要使用 Boolean 对象

5.6.2 Number 类型

  • 要创建 Number 对象,可以在调用 Number 构造函数时向其 中传递相应的数值

    var numberObject = new Number(10); 
    
  • toFixed()方法

    // 会按照指定的小数位返回数值的字符串表示,例如:  
    var num = 10;
    alert(num.toFixed(2));     //"10.00" 
    
    // 如果数值本身包含的小数位比指定的还多,那么接近指定的大小数位的值 就会舍入
    var num = 10.005; 
    alert(num.toFixed(2));     //"10.01" 
    
  • toExponential()方法

// 该方法返回以指数表示法(也称 e表示法)
// toExponential()也接收一个参数,而且该参数同样 也是指定输出结果中的小数位数
var num = 10; 
alert(num.toExponential(1));  //"1.0e+1" 
  • toPrecision()方法可能会返回固定大小(fixed)格式,也可能返回指数 (exponential)格式;具体规则是看哪种格式合适。这个方法接收一个参数,即表示数值的所有数字的 位数(不包括指数部分)

    var num = 99; 
    alert(num.toPrecision(1));  //"1e+2" 
    alert(num.toPrecision(2));  //"99"
    alert(num.toPrecision(3));  //"99.0" 
     
    

5.6.3 String 类型

  • 创建

    var str = new String("hello world");
    
  • 字符方法

    • charAt() 和 charCodeAt()

    • 这两个方法都接收一个参数,即基于 0 的字符位置

    • charAt() 方法以单字节字符串形式返回给定位置的那个字符

      var stringValue = "hello world";
      alert(stringValue.charAt(1));   //"e" 
      
    • charCodeAt() 方法获取到的是字符编码

      var stringValue = "hello world"; 
      alert(stringValue.charCodeAt(1));   //输出"101" 
      
    • 在支持的浏览器中,可以使用方括号加数 字索引来访问字符串中的特定字符

      var stringValue = "hello world"; 
      alert(stringValue[1]);   //"e" 
      
    • 三个基于子字符串创建新字符串的方法:slice()、substr()和substring()。

      // 都会返回被操作字符串的一个子字符串,而且也都接受一或两个参数。第一个参数指定子字 符串的开始位置,第二个参数(在指定的情况下)表示子字符串到哪里结束。
      //,slice()和 substring()的第二个参数指定的是子字符串后一个字符后面的位置。而 substr()的第二个参数指定的则是返回的字符个数
      var stringValue = "hello world"; 
      alert(stringValue.slice(3));         //"lo world" 
      alert(stringValue.substring(3));     //"lo world" 
      alert(stringValue.substr(3));        //"lo world"
      alert(stringValue.slice(3, 7));      //"lo w" 
      alert(stringValue.substring(3,7));   //"lo w"
      alert(stringValue.substr(3, 7));     //"lo worl" 
      
      
      // 传入负值
      // slice()方法会将传 入的负值与字符串的长度相加,substr()方法将负的第一个参数加上字符串的长度,而将负的第二个 参数转换为 0。后,substring()方法会把所有负值参数都转换为 0。
      var stringValue = "hello world";
      alert(stringValue.slice(-3));          //"rld" 
      alert(stringValue.substring(-3));     //"hello world" 
      alert(stringValue.substr(-3));        //"rld" 
      alert(stringValue.slice(3, -4));       //"lo w"
      alert(stringValue.substring(3, -4));   //"hel" 
      alert(stringValue.substr(3, -4));      //""(空字符串) 
      
  • 字符串位置方法

    • indexOf() 和 lastIndexOf()

    • 从 一个字符串中搜索给定的子字符串,然后返子字符串的位置(如果没有找到该子字符串,则返回-1)。

      var stringValue = "hello world"; 
      alert(stringValue.indexOf("o"));             //4 
      alert(stringValue.lastIndexOf("o"));         //7 
       
      
      // 找出所有匹配字符串
      var stringValue = "Lorem ipsum dolor sit amet, consectetur adipisicing elit";
      var positions = new Array(); 
      var pos = stringValue.indexOf("e"); 
       
      while(pos > -1){     
          positions.push(pos);     
          pos = stringValue.indexOf("e", pos + 1); 
      }     
      alert(positions);    //"3,24,32,35,52" 
      
  • trim() 方法

    • 该方法会创建一个字符串副本,删除开头和末尾的所有空格,然后返回结果

      var stringValue = "   hello world   "; 
      var trimmedStringValue = stringValue.trim(); 
      alert(stringValue);            //"   hello world   " 
      alert(trimmedStringValue);     //"hello world"
      
  • 字符串大小写转换方法

    • toLowerCase()、toLocaleLowerCase()

    • toUpperCase()和 toLocaleUpperCase()

      var stringValue = "hello world"; 
      alert(stringValue.toLocaleUpperCase());  //"HELLO WORLD" 
      alert(stringValue.toUpperCase());        //"HELLO WORLD" 
      alert(stringValue.toLocaleLowerCase());  //"hello world" 
      alert(stringValue.toLowerCase());        //"hello world" 
      
  • 字符串模式匹配方法

    • match() 方法,只接受一个参数,要莫是一个正则表达式,要莫是一个 RegExp 对象

      var text = "cat, bat, sat, fat"; 
      var pattern = /.at/; 
       
      //与 pattern.exec(text)相同 
      var matches = text.match(pattern);       
      alert(matches.index);            //0
      alert(matches[0]);                //"cat"
      alert(pattern.lastIndex);         //0 
      
    • search() 方法 ,参数同上

      //search()方法返回字符串中第一个匹配项的索引;如果没 有找到匹配项,则返回-1。而且,search()方法始终是从字符串开头向后查找模式。
      var text = "cat, bat, sat, fat";  
      var pos = text.search(/at/); 
      alert(pos);   //1 
       
      
    • replace() 方法

    • 接受两个参数:第 一个参数可以是一个 RegExp 对象或者一个字符串(这个字符串不会被转换成正则表达式),第二个参 数可以是一个字符串或者一个函数。如果第一个参数是字符串,那么只会替换第一个子字符串。要想替 换所有子字符串,唯一的办法就是提供一个正则表达式,而且要指定全局(g)标志,如下所示。
    var text = "cat, bat, sat, fat";  
    var result = text.replace("at", "ond"); 
    alert(result);    //"cond, bat, sat, fat" 
     
    result = text.replace(/at/g, "ond");
    alert(result);    //"cond, bond, sond, fond" 
    
    • split()
    // 基于指定的分隔符将一个字符串分割成 多个子字符串,并将结果放在一个数组中。分隔符可以是字符串,也可以是一个 RegExp 对象(这个方 法不会将字符串看成正则表达式)。split()方法可以接受可选的第二个参数,用于指定数组的大小, 以便确保返回的数组不会超过既定大小
    var colorText = "red,blue,green,yellow"; 
    var colors1 = colorText.split(",");          //["red", "blue", "green", "yellow"]
    var colors2 = colorText.split(",", 2);       //["red", "blue"] 
    var colors3 = colorText.split(/[^\,]+/);     //["", ",", ",", ",", ""] 
     
    
  • localeCompare() 方法

    • 用来比较两个字符串,并返回下列值中的一个

      • 如果字符串在字母表中应该排在字符串参数之前,则返回一个负数(大多数情况下是-1,具体 的值要视实现而定);
      • 如果字符串等于字符串参数,则返回 0;
      • 如果字符串在字母表中应该排在字符串参数之后,则返回一个正数(大多数情况下是 1,具体的 值同样要视实现而定)。
      var stringValue = "yellow";      
      alert(stringValue.localeCompare("brick"));      //1 
      alert(stringValue.localeCompare("yellow"));      //0 
      alert(stringValue.localeCompare("zoo"));         //-1 
      
  • fromCharCode() 方法

    • 接收一或 多个字符编码,然后将它们转换成一个字符串。

      alert(String.fromCharCode(104, 101, 108, 108, 111)); //"hello" 
      

5.7 单体内置对象

5.7.1 Global 对象

  • ;所有在全局作用域中定义的属性和函数,都是 Global 对象的属性。
    • 诸如 isNaN()、isFinite()、parseInt()以及 parseFloat(),实际上全都是 Global 对象的方法
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 引用类型的值时引用类型的一个实例。在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起。有...
    cooore阅读 283评论 0 1
  • Chapter 5 引用类型 Object类型 创建Object实例new Object()var person ...
    云之外阅读 391评论 0 0
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,231评论 0 4
  • 1.Object类型: 两种创建实例的方式:1.new操作符创建——var person = new Object...
    会有猫惹阅读 210评论 0 0
  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 1,665评论 0 6