第五章 引用类型

152 阅读24分钟

1、Array类型

length属性

数组的 length 属性可读可写。因此,可以通过设置这个属性,从数组的末尾移除项或向数组中添加新项;利用 length 属性也可以方便地在数组末尾添加新项

var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
colors.length = 2;
alert(colors[2]); //undefined

var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
colors.length = 4;
alert(colors[3]); //undefined

var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
colors[colors.length] = "black"; //(在位置 3)添加一种颜色
colors[colors.length] = "brown"; //(在位置 4)再添加一种颜色

var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
colors[99] = "black"; // (在位置 99)添加一种颜色
alert(colors.length); // 100 

检测数组

  • instanceof 操作符

    if (value instanceof Array){
     	//对数组执行某些操作
    } 
    

    instanceof 操作符只适用于只有一个全局执行环境的情况。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的 Array 构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。

  • Array.isArray()方法

    Array.isArray()方法目的是确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的,因此适用于任何情况。

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

转换方法

  • toLocaleString():创建一个字符串,该字符串为数组各个值以逗号分隔。为了取得每一项的值,调用的是每一项的 toLocaleString()方法
  • toString():创建一个字符串,该字符串为数组各个值以逗号分隔。为了取得每一项的值,调用的是每一项的 toString()方法
  • valueOf():返回数组各项的值(还是一个数组)
  • join():接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串
var colors = ["red", "green", "blue"];
alert(colors.toString()); // red,blue,green
alert(colors.valueOf()); // red,blue,green
alert(colors); // red,blue,green 
alert(colors.join(",")); //red,green,blue
alert(colors.join("||")); //red||green||blue 

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

栈方法

  • push():接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度
  • pop():从数组末尾移除最后一项,减少数组的 length 值,并返回移除的项

队列方法

  • shift():移除数组中的第一个项并返回该项,同时将数组长度减 1
  • unshift():在数组前端添加任意个项并返回新数组的长度

重排序方法

  • reverse():反转数组项的顺序

  • sort():默认按升序排列数组项,sort()方法会调用每个数组项的 toString()转型方法,然后比较得到的字符串,以确定如何排序。可以接收一个比较函数作为参数,比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回 0,如果第一个参数应该位于第二个之后则返回一个正数。

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

操作方法

  • concat():数组拼接,基于当前数组中的所有项创建一个新数组。如果传递给 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()方法返回从该参数指定位置开始到当前数组末尾的所有项。如果有两个参数,该方法返回起始和结束位置之间的项(不包括结束位置项)。slice()方法不会影响原始数组。

  • 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"。
    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,返回的数组中只包含一项
    

位置方法

  • indexOf():从数组开头查找,返回要查找的项在数组中的位置,没找到返回-1。接受两个参数——要查找的项和表示查找起点位置的索引(可选)。
  • lastIndexOf():从数组的末尾开始查找,返回要查找的项在数组中的位置,没找到返回-1。接受两个参数——要查找的项和表示查找起点位置的索引(可选)

迭代方法

迭代方法都接收两个参数:要在每一项上运行的函数和 (可选的)运行该函数的作用域对象——影响 this 的值。传入这些方法中的函数会接收三个参数:数 组项的值、该项在数组中的位置和数组对象本身。

迭代方法不会修改原数组中的值

  • every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true。
  • some():对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true。
  • filter():利用指定的函数确定是否在返回的数组中包含某一项。对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。
  • map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组,该数组的每一项都是在原始数组中的对应项上运行传入函数的结果。
  • forEach():对数组中的每一项运行给定函数。这个方法没有返回值。

归并方法

归并方法都接受两个参数:每一项上调用的函数和作为归并基础的初始值(可选)。传给归并方法的函数接收 4 个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数就是数组的第二项。

  • reduce():从数组的第一项开始,逐个遍历到最后,然后构建一个最终返回的值。

  • reduceRight():从数组的最后一项开始,向前遍历到第一项,然后构建一个最终返回的值。

    //使用 reduce()方法可以执行求数组中所有值之和的操作,比如:
    var values = [1,2,3,4,5];
    var sum = values.reduce(function(prev, cur, index, array){
     	return prev + cur;
    });
    alert(sum); //15
    

方法总结

  • 检测数组
    • Array.isArray():确定某个值是否为数组
  • 转换方法
    • toLocaleString():返回一个数组各项的值并以逗号分隔的字符串
    • toString():返回一个数组各项的值并以逗号分隔的字符串
    • valueOf():返回数组各项的值(还是一个数组)
    • join():接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串
  • 栈方法
    • push():接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度
    • pop():从数组末尾移除最后一项,减少数组的 length 值,并返回移除的项
  • 队列方法
    • shift():移除数组中的第一个项并返回该项,同时将数组长度减 1
    • unshift():在数组前端添加任意个项并返回新数组的长度
  • 重排序方法
    • reserve():反转数组项的各项
    • sort():默认按升序排列数组项,也可以接收一个比较函数(定义排序方法)作为参数
  • 操作方法
    • concat():数组拼接,基于当前数组中的所有项创建一个新数组
    • slice():基于当前数组中的一或多个项创建一个新数组
    • splice():可以根据传入的参数删除、插入、替换原数组中的项
  • 位置方法
    • indexOf():从数组开头查找,返回要查找的项在数组中的位置,没找到返回-1
    • lastIndexOf():从数组末尾查找,返回要查找的项在数组中的位置,没找到返回-1
  • 迭代方法
    • every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true
    • some():对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true
    • filter():利用指定的函数确定是否在返回的数组中包含某一项。对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组
    • map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组,该数组的每一项都是在原始数组中的对应项上运行传入函数的结果
    • forEach():对数组中的每一项运行给定函数(这个方法没有返回值)
  • 归并方法
    • reduce():从数组的第一项开始,逐个遍历到最后,然后构建一个最终返回的值
    • reduceRight():从数组的最后一项开始,向前遍历到第一项,然后构建一个最终返回的值

2、RegExp类型

正则表达式

(1)、字面量正则表达式

var expression = / pattern / flags ;

pattern为正则表达式,flags为标志,每个正则表达式可以带有一个或多个标志。

  • flags
    • g:全局匹配
    • i:不区分大小写
    • m:多行匹配

(2)、构造函数正则表达式

var expression = new RegExp("pattern","flags");

由于 RegExp 构造 函数的模式参数是字符串,所以在某些情况下要对字符进行双重转义。所有元字符都必须双重转义,已经转义过的字符也是如此,如:

使用正则表达式字面量和使用 RegExp 构造函数创建的正则表达式不一样。在 ECMAScript 3 中, 正则表达式字面量始终会共享同一个 RegExp 实例,而使用构造函数创建的每一个新 RegExp 实例都是一个新实例。

实例方法

(1)、RegExp.exec()

  • 该方法是专门为捕获组而设计的。exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null。 返回的数组虽然是 Array 的实例,但包含两个额外的属性:index 和 input。其中,index 表示匹配项在字符串中的位置,而 input 表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。

  • 对于 exec()方法而言,即使在模式中设置了全局标志(g),它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用 exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用 exec()则都会在字符串中继续查找新匹配项

    var text = "cat, bat, sat, fat";
    var pattern1 = /.at/;
    
    var matches = pattern1.exec(text);
    alert(matches.index); //0
    alert(matches[0]); //cat
    alert(pattern1.lastIndex); //0
    
    matches = pattern1.exec(text);
    
    alert(matches.index); //0
    alert(matches[0]); //cat
    alert(pattern1.lastIndex); //0
    
    var pattern2 = /.at/g;
    var matches = pattern2.exec(text);
    
    alert(matches.index); //0
    alert(matches[0]); //cat
    alert(pattern2.lastIndex); //3 
    
    matches = pattern2.exec(text);
    
    alert(matches.index); //5
    alert(matches[0]); //bat
    alert(pattern2.lastIndex); //8 
    

(2)、RegExp.test()

  • 接受一个字符串参数。在模式与该参数匹配的情况下返回 true;否则,返回 false。

构造函数属性

RegExp 构造函数包含一些属性。这些属性分别有一个长属性名和一个短属性名。

var text = "this has been a short summer";
var pattern = /(.)hort/g;
/*
 * 注意:Opera 不支持 input、lastMatch、lastParen 和 multiline 属性
 * Internet Explorer 不支持 multiline 属性
 */
if (pattern.test(text)){
 	alert(RegExp.input); // this has been a short summer
 	alert(RegExp.leftContext); // this has been a
 	alert(RegExp.rightContext); // summer
    alert(RegExp.lastMatch); // short
 	alert(RegExp.lastParen); // s
 	alert(RegExp.multiline); // false
} 

3、Function类型

由于函数是对象,因此函数名实际上是一个指向函数对象的指针,不会与某个函数绑定

函数内部属性

在函数内部,有两个特殊的对象:arguments 和 this。

  • 函数本身的caller属性

    保存着调用当前函数的函数的引用, 如果是在全局作用域中调用当前函数,值为 null

  • arguments

    callee属性:指针,指向拥有这个arguments对象的函数。在严格模式下运行时,访问该属性会导致错误

    caller属性:在严格模式下访问会导致错误,在非严格模式下这个属性始终是 undefined

函数的属性和方法

(1)、属性

  • length:函数希望接收的命名参数的个数
  • prototype:不可枚举,使用for-in无法发现

(2)、方法

  • apply():在特定的作用域中调用函数,即设置函数体内this对象的值。接收两个参数:运行函数的作用域、参数数组

  • call():在特定的作用域中调用函数,即设置函数体内this对象的值。接收的参数:运行函数的作用域、其余参数都直接传递给函数(逐个列举出来)

    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 
    
    function sum(num1, num2){
     	return num1 + num2;
    }
    function callSum(num1, num2){
     	return sum.call(this, num1, num2);
    }
    alert(callSum(10,10)); //20 
    

    apply()和call()真正强大的地方是能够扩充函数赖以运行的作用域。使用 call()(或 apply())来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。

    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 
    //注意与以下的区别
    window.color = "red";
    var o = { color: "blue" };
    function sayColor(){
     	alert(this.color);
    }
    sayColor(); //"red"
    o.sayColor = sayColor;
    o.sayColor(); //"blue" 
    
  • bind():创建一个函数的实例,其 this 值会被绑定到传给 bind()函数的值。

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

4、String类型

length属性

String 类型的每个实例都有一个 length 属性,表示字符串中包含字符的数目。即使字符串中包含双字节字符,每个字符也仍然算一个字符。

字符方法

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

  • charAt():返回给定位置的字符;也可以使用方括号加数字索引来访问字符串中的特定字符
  • charCodeAt():返回给定位置的字符的编码
  • fromCharCode():接收一或多个字符编码,然后将它们转换成一个字符串。从本质上来看,这个方法与实例方法 charCodeAt() 执行的是相反的操作
var stringValue = "hello world";
alert(stringValue.charAt(1)); //"e" 
var stringValue = "hello world";
alert(stringValue[1]); //"e" 
var stringValue = "hello world";
alert(stringValue.charCodeAt(1)); //输出"101" 
alert(String.fromCharCode(104, 101, 108, 108, 111)); //"hello" 

字符串操作方法

下列方法不改变原字符串

  • concat():将一或多个字符串拼接起来, 返回拼接得到的新字符串。可以接受任意多个参数,即可以拼接任意多个字符串。也可以用”+“号拼接字符

  • slice():返回被操作字符串的子字符串。接收两个参数,第一个指定子字符串开始的位置,第二个参数指定子字符串最后一个字符后面的位置(可省略该参数,到结尾,若指定则不包括被指定的位置)。若传入的参数为负数,处理时将负值与字符串的长度相加。

  • substring():返回被操作字符串的子字符串。接收两个参数,第一个指定子字符串开始的位置,第二个参数指定子字符串最后一个字符后面的位置(可省略该参数,到结尾,若指定则不包括被指定的位置)。若传入的参数是负数,处理时将负值转换为0。

  • substr():返回被操作字符串的子字符串。接收两个参数,第一个参数指定子字符串开始的位置,第二个参数指定返回的字符的个数。若传入的参数是负数,第一个参数为负处理时加上字符串的长度,第二个参数为负数时转换为0。

    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" 
    
    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",substring(3,0)(将较小的数作为开始位置,将较大的数作为结束位置)→substring(0,3)
    alert(stringValue.substr(3, -4)); //""(空字符串)
    

字符串位置方法

以下两个方法接收两个参数,第一个参数指定搜索的子字符串,第二个参数指定开始搜索的位置(可省略,默认从第一位或最后一位开始搜索)。

  • indexOf():从字符串开头向后搜索给定的子字符串,然后返子字符串的位置(如果没有找到该子字符串,则返回-1)
  • lastIndexOf():从字符串末尾向前搜索给定的子字符串,然后返子字符串的位置(如果没有找到该子字符串,则返回-1)

trim()方法

这个方法会创建一个字符串的副本,删除前置及后缀的所有空格,然后返回结果。不改变原字符串

非标准的还有 trimLeft()和 trimRight()方法,分别用于删除字符串开头和末尾的空格。

字符串大小写转换方法

以下方法改变原字符串

  • toLowerCase()、toLocaleLowerCase():把字符串转换为小写,两个方法大多数情况下结果一样,第二个方法是针对特殊地区的实现
  • toUpperCase()、 toLocaleUpperCase():把字符串转换为大写,两个方法大多数情况下结果一样,第二个方法是针对特殊地区的实现

字符串模式匹配方法

  • match():只接受一个参数(正则表达式或RegExp对象),本质上与调用 RegExp 的 exec()方法相同。

    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():只接受一个参数(正则表达式或RegExp对象),返回字符串中第一个匹配项的索引;如果没有找到匹配项,则返回-1。查找时从字符串开头向后查找。

    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" 
    

    如果第二个参数是字符串,那么还可以使用一些特殊的字符序列,将正则表达式操作得到的值插入到结果字符串中。

var text = "cat, bat, sat, fat";
result = text.replace(/(.at)/g, "word ($1)");
alert(result); //word (cat), word (bat), word (sat), word (fat) 

replace()方法的第二个参数也可以是一个函数。在只有一个匹配项(即与模式匹配的字符串)的情况下,会向这个函数传递 3 个参数:模式的匹配项、模式匹配项在字符串中的位置和原始字符串。在正则表达式中定义了多个捕获组的情况下,传递给函数的参数依次是模式的匹配项、第一个捕获组的匹配项、第二个捕获组的匹配项……,但最后两个参数仍然分别是模式的匹配项在字符串中的位置和原始字符串。这个函数应该返回一个字符串,表示应该被替换的匹配项使用函数作为 replace()方法的第二个参数可以实现更加精细的替换操作

function htmlEscape(text){
 	return text.replace(/[<>"&]/g, function(match, pos, originalText){
 	switch(match){
 	case "<":
 	return "&lt;";
 	case ">":
 	return "&gt;";
 	case "&":
 	return "&amp;";
 	case "\"":
 	return "&quot;";
 	}
 	});
}
alert(htmlEscape("<p class=\"greeting\">Hello world!</p>"));
//&lt;p class=&quot;greeting&quot;&gt;Hello world!&lt;/p&gt; 
  • 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,具体的值同样要视实现而定)。

方法总结

  • 字符方法
    • charAt():返回给定位置的字符;也可以使用方括号加数字索引来访问字符串中的特定字符
    • charCodeAt():返回给定位置的字符的编码
    • fromCharCode():接收一或多个字符编码,然后将它们转换成一个字符串
  • 字符串操作方法
    • concat():将一或多个字符串拼接起来, 返回拼接得到的新字符串

    • slice():返回被操作字符串的子字符串

    • substring():返回被操作字符串的子字符串

    • substr():返回被操作字符串的子字符串

  • 字符串位置方法
    • indexOf():从字符串开头向后搜索给定的子字符串,然后返子字符串的位置(如果没有找到该子字符串,则返回-1)
    • lastIndexOf():从字符串末尾向前搜索给定的子字符串,然后返子字符串的位置(如果没有找到该子字符串,则返回-1)
  • trim()方法:创建一个字符串的副本,删除前置及后缀的所有空格
  • 字符串大小写转换方法
    • toLowerCase()、toLocaleLowerCase():把字符串转换为小写
    • toUpperCase()、 toLocaleUpperCase():把字符串转换为大写
  • 字符串模式匹配方法
    • match():本质上与调用 RegExp 的 exec()方法相同
    • search():返回字符串中第一个匹配项的索引(如果没有找到匹配项,则返回-1)
    • replace():替换字符串
    • split():基于指定的分隔符将一个字符串分割成多个子字符串,并将结果放在一个数组中
  • localeCompare()方法:比较两个字符串,并返回下列值中的一个:
    • 如果字符串在字母表中应该排在字符串参数之前,则返回一个负数

    • 如果字符串等于字符串参数,则返回 0

    • 如果字符串在字母表中应该排在字符串参数之后,则返回一个正数

5、单体内置对象

Global对象

(1)、URI编码方法

​ URI编码方法可以对 URI(Uniform Resource Identifiers,通用资源标识符)进行编码,以便发送给浏览器。

  • encodeURI():主要用于整个 URI(例如,www.wrox.com/illegal value.htm),不会对本身属于 URI 的特殊字符进行编码,例如冒号、正斜杠、 问号和井字号

  • encodeURIComponent():主要用于对 URI 中的某一段(例如前面 URI 中的 illegal value.htm)进行编码,会对它发现的任何非标准字符进行编码

    var uri = "http://www.wrox.com/illegal value.htm#start";
    //"http://www.wrox.com/illegal%20value.htm#start"
    alert(encodeURI(uri));
    //"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"
    alert(encodeURIComponent(uri)); 
    
  • decodeURI():与encodeURI()方法对应,只能对使用 encodeURI()替换的字符进行解码(它可将%20 替换成一个空格,但不会对%23 作任何处理,因为%23 表示井字号(#),而井字号不是使用 encodeURI()替换的)

  • decodeURIComponent():能够解码使用 encodeURIComponent()编码的所有字符,即它可以解码任何特殊字符的编码。

    var uri = "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start";
    //http%3A%2F%2Fwww.wrox.com%2Fillegal value.htm%23start
    alert(decodeURI(uri));
    //http://www.wrox.com/illegal value.htm#start
    alert(decodeURIComponent(uri)); 
    

(2)、eval()方法

  • 只接受一个参数,即要执行的 ECMAScript(或 JavaScript) 字符串。当解析器发现代码中调用 eval()方法时,它会将传入的参数当作实际的 ECMAScript 语句来解析,然后把执行结果插入到原位置。

  • 通过 eval()执行的代码被认为是包含该次调用的执行环境的一部分, 因此被执行的代码具有与该执行环境相同的作用域链。这意味着通过 eval()执行的代码可以引用在包含环境中定义的变量。

  • 在 eval()中创建的任何变量或函数都不会被提升,因为在解析代码的时候,它们被包含在一个字符串中;它们只在 eval()执行的时候创建。

  • 严格模式下,在外部访问不到 eval()中创建的任何变量或函数,为 eval 赋值也会导致错误。

  • 代码注入:在使用 eval()时必须极为谨慎,特别是在用它执行用户输入数据的情况下。否则,可能会有恶意用户输入威胁你的站点或应用程序安全的代码。

(3)、Global对象的属性

(4)、window对象

Math对象

(1)、Math对象的属性

(2)、min() 和max() 方法

用于确定一组数值中的最小值和最大值,这两个方法都可以接收任意多个数值参数。

var max = Math.max(3, 54, 32, 16);
alert(max); //54
var min = Math.min(3, 54, 32, 16);
alert(min); //3 
//要找到数组中的最大或最小值,可以像下面这样使用 apply()方法。把 Math 对象作为 apply()的第一个参数,从而正确地设置 this 值,将任何数组作为第二个参数
var values = [1, 2, 3, 4, 5, 6, 7, 8];
var max = Math.max.apply(Math, values); 

(3)、舍入方法

  • Math.ceil():执行向上舍入,即它总是将数值向上舍入为最接近的整数
  • Math.floor():执行向下舍入,即它总是将数值向下舍入为最接近的整数
  • Math.round():执行标准舍入,即它总是将数值四舍五入为最接近的整数

(4)、random() 方法

Math.random()方法返回大于等于 0 小于 1 的一个随机数。

**值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值) **——该公式可用于某个整数范围内随机选择一个值

(5)、其他方法