高级程序设计01

71 阅读13分钟

第一章:简介

三部分组成:

  • ECMAScript 提供核心语言功能和对象方法
  • DOM 提供访问和操作网页内容的方法和接口
  • BOM 提供与浏览器交互的方法和接口

ES的功能:语法、类型、语句、关键字、保留字、操作符、对象

DOM的功能:DOM 视图、DOM 事件、DOM 样式、DOM 遍历和范围

BOM的功能:

  • 弹出新浏览器窗口的功能;
  • 移动、缩放和关闭浏览器窗口的功能;
  • 提供浏览器详细信息的 navigator 对象;
  • 提供浏览器所加载页面的详细信息的 location 对象;
  • 提供用户显示器分辨率详细信息的 screen 对象;
  • 对 cookies 的支持;
  • 像 XMLHttpRequest 和 IE 的 ActiveX

第二章:使用js

1、标签位置:

2、延迟脚本:

3、异步脚本:

4、在XHTML中使用js,需要使用一个CData片段来包含js代码,这样XHTML才能正确执行。

<script>
    //<![CDATA[
    var myarr = [];
    myarr.mynumber = 10;
    myarr.mytest = function(){
        console.log(myarr.mynumber);
    }
    //]]>
</script>

5、文档模式:分为标准模式和混杂模式,

<!--HTML 5-->
<!doctype html>

第三章:基本概念

1、语法
  • 1)区分大小写(变量、函数名和操作符)
  • 2)标识符,第一个字符必须是字母、_下划线或美元符号$
  • 3)严格模式use strict,是一个编译指示,让js引擎切换到严格模式,支持浏览器IE10+\Firefox 4+\Safari 5.1+\Opera 12+和Chrome
2、变量

es的变量是松散类型的,变量可以保存任何类型的数据。

var message;            //已声明,未初始化,变量保存特殊的值 undefined
var message = 'hi';     //初始化,字符串值'hi'
3、数据类型

基本类型:Number、String、Boolean、Null、Undefined和复杂类型:Object

使用 typeof 操作符的返回结果:

"undefined"——如果这个值未定义;

"number"——如果这个值是数值;
"string"——如果这个值是字符串;
"boolean"——如果这个值是布尔值;

"object"——如果这个值是对象或 null"function"——如果这个值是函数。

1)Undefined只有一个值,就是Undefined。 使用var声明了变量但未初始化时,变量的值就是Undefined。

2)Null值也是只有一个值,就是null。

null值表示一个空对象指针,typeof检测null会返回"object"。

var car = null;
alert( typeof car);      //"object"

所以定义的变量将来准备用于保存对象,最好将变量初始化为null而不是其他值。

直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用。

3)Boolean类型,true or false,转型函数Boolean( )。

隐性转换,使用"取反!,或||,并&&"

4)Number类型 数值转换方法,Number( )、parseInt( )、parseFloat( )

隐性转换,使用乘1 "value * 1";
var num1 = Number("Hello world!"); //NaN 
var num2 = Number("");          //0 
var num3 = Number("000011");    //11 
var num4 = Number(true);        //1 

Number()函数的转换规则如下:

  • 如果是 Boolean 值,true 和 false 将分别被转换为 1 和 0。
  • 如果是数字值,只是简单的传入和返回。
  • 如果是 null 值,返回 0。
  • 如果是 undefined,返回 NaN。
  • 如果是字符串,取有效数字;如果是空字符串,转换为0;如果是纯字符串,返回NaN。

5)String 类型 字符串转换方法,toString( )和 string( )

隐性转换,使用加字符串空值  + "" ;
var age = 11; 
var ageAsString = age.toString(); // 字符串"11"

6)Object 类型

  • constructor:保存着用于创建当前对象的函数。
  • hasOwnProperty( ):用于检查给定的属性在当前对象实例中是否存在。 如:obj.hasOwnProperty("name")
  • isPrototypeOf:用于检查传入的对象是否是传入对象的原型
  • propertyIsEnumerable( ):用于检查给定的属性是否能够使用 for-in 语句 (本章后面将会讨论)来枚举。
  • toString():返回对象的字符串表示
  • valueOf():返回对象的字符串、数值或布尔值表示。
4、操作符

1)相等操作符 == 和 != 返回true和false,先转换操作数(强制转型),然后再比较他们的相等性。

基本规则如下:

  • a、布尔值,转换为0或者1;
  • b、字符串--数值,字符串转为数值;
  • c、对象--其他,
  • d、null和undefined是相等的;

2)条件操作符

var max = (num1 > num2)? num1 : num2;
5、语句

1)for-in语句,用来枚举对象的属性和值。

for(var val in window){
    document.write(val+':'+window[val]+'<br>')  //打印window对象的属性和值
 }

2)break和continue语句

  • break 语句会立即退出循环,强制继续 执行循环后面的语句。
  • continue 语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行。

3)with语句

with 语句的作用是将代码的作用域设置到一个特定的对象中。with 语句的目的主要是为了简化多次编写同一个对象的工作。

严格模式下不允许使用 with 语句,否则将视为语法错误。

6、函数

这个函数会在执行完 return 语句之后停止并立即退出。

function diff(num1, num2) { 
     if (num1 < num2) { 
        return num2 - num1; 
     } else { 
        return num1 - num2;
     }
}

第四章 变量、作用域和内存

一、基本类型和引用类型的值

js语言的定义变量不分数据类型,变量的值及其数据类型可以在脚本的生命周期内改变。

1、基本类型\引用类型

基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。

基本类型:undefined、null、boolean、number和string.是按值访问的,可以操作保存在变量中的实际的值。

引用类型:保存在内存中的对象(实际上是在操作对象的引用而不是实际的对象)

引用类型的值,可以为其添加属性和方法,也可以改变其属性和方法

2、复制变量
  • 复制基本类型时,num1 = num2, 这两个变量可以参与任何操作而不会互相影响。
  • 复制引用类型时, obj1 = obj2, 这两个变量实际上是引用同一个对象,改变其中一个变量,就会影响另一个变量。
3、传递参数
  • 向参数传递基本类型的值时,被传递的值会被复制给一个局部变量。
  • 向参数传递引用类型的值时,会把这个值在内存中的地址复制给局部变量,因此局部变量的变化会反应在函数的外部。 例子:
var num1 = 10;
var obj01 = {
    'name':'Nixi'
}
function change(number,obj){
    obj.name = 'flyting';
    number = 20
}
change(num1,obj01);

console.log(num1);          //10 不改变
console.log(obj01.name);    //flyting 已改变
  • 向参数传递引用类型的值时,当在函数内部重写obj时,这个变量引用的就是一个局部对象了,这个局部对象会在函数执行完毕后立即销毁。 例子:
var obj01 = {
    'name':'Nixi'
}
function change(obj){
    obj.name = 'flyting';
    obj = new Object();
    obj.name = 'lily';
}
change(obj01);

console.log(obj01.name);    //flyting,而不是lily
4、检测类型

typeof操作符,在变量是一个对象或null时,都返回"object";

instanceof 检测引用类型

在检测一个引用类型值和 Object 构造函数时,instanceof 操作符始终会返回 true。

var person = {
                'name':'ting'
            }
var colors = ['red','blue','white']
var pattern = new RegExp();
console.log(person instanceof Object);       //true
console.log(colors instanceof Array);       //true
console.log(pattern instanceof  RegExp);    //true

二、执行环境及作用域

执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。

每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中, 我们编写的代码无法访问这个对象,但解析器在处理数据时会在后台使用它。

当代码在一个环境中执行时,会创建变量对象的一个作用域链。

作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。

  • 1)作用域链的前端,是当前执行的代码所在环境的变量对象
  • 2)全局执行环境的变量对象始终都是作用域链中的最后一个对象
  • 3)标识符解析:沿着作用域链一级一级,逐级向后回溯,直至找到标识符为止(如果找不到,通常会导致错误发生) 配图
1、延长作用域链

执行环境的类型--全局和局部(函数), 有些类型可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。

  • try-catch语句的catch块
  • with语句

对with语句来说,会将指定的对象添加到作用域链中

对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。

例子:

function buildUrl(){
   var qs = "?debug=true";
   with(location){
       var url = href + qs;
   }
   return url;
}
var getUrl = buildUrl();
console.log(getUrl);   //http://localhost:63342/JavaScript/Ch21/00.html?debug=true
2、没有块级作用域

在js中,for(){ ... } 以及 if(){ ...} ,没有自己的作用域,会存在循环外部的执行环境中。

1)声明变量

使用var声明的变量会自动添加到最接近的环境中。在with语句中,最接近的环境是函数环境。

如果初始化变量时没有使用var声明,该变量会自动添加到全局环境。

2)查询标识符

查找标识符,搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。

三、垃圾收集

垃圾收集机制:找出那些不再继续使用的变量,然后释放其占用的内存,按照固定的时间间隔(或代码执行中预定的收集时间)。

1)标记清除, 当变量进入环境(如在函数中声明一个变量),此变量标记为“进入环境”,当变量离开环境时,其标记为“离开环境.....

2)引用计数 弊端:循环引用,对象A中包含一个指向对象B的指针,而对象B中也包含一个指向对象A的引用。 为了避免类似的循环引用问题,在不使用它们的时候手工断开原生JS对象与DOM元素之间的连接。 例子:

var element = document.getElementById("some_element");
var myObj = new Object();
myObj.element = element;
element.someObj = myObj;

myObj.element = null;
element.someObj = null;

性能问题: 频繁的触发垃圾收集器运行,会引发严重性能问题。

IE7的js引擎来及收集例程的工作方式,触发垃圾收集的变量分配、字面量和数组元素的临界值被调整为动态修正。

管理内存: 优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据,一旦数据不再有用,最好通过值=null来释放其引用,即解除引用。

适用于大多数全局变量和全局对象的属性,局部变量会在它们离开执行环境时自动被解除引用。 如:

function createPerson(name){
    var localPerson = new Object();
    localPerson.name = name;
    return localPerson;
}
var globalPerson = createPerson('flyting');

//手工移除globalPerson的引用
globalPerson = null;
  • 在 ES 中,引用类型是一种数据结构,用于将数据和功能组织在一起。
  • 它也常被称为类,但它不具备传统的面向对象语言所支持的类和接口等基本结构。
  • 引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。
  • 对象(引用类型的值)是引用类型的一个实例

第五章 引用类型

一、Object类型

1、创建Object类型的两种方式

    //方式 1,new操作符
    var obj1 = new Object();
    obj1.name = 'lily';
    obj1.age = 30;
    
    //方式 2,对象字面量表示法
    var obj2 = {
        name : 'flyting',
        age : 30
    }

2、访问对象属性时,使用点表示法和方括号表示法。

使用[]表示法,可以通过变量来访问属性,并且变量内的值,可以包含非字母非数字

console.log( person.name );
console.log( person["name"] );

二、Array类型

ECMAScript数组的每一项可以保存任何类型的数据。(如字符串,数值,对象等)

var colors = ["red",20,{"age":20},3];
colors[99] = 'black';
console.log(colors.length);   //100

数组的长度是100,位置3到98的实际上是不存在,访问它们都将返回undefined。

1、检测数组

Array.isArray( colors ) ,这个方法的目的是确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。

2、转换方法

toString():返回由数组值,字符串的形式,用逗号分隔

valueOf(): 返回的还是数组

var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
alert(colors.toString());   // red,blue,green 字符串
alert(colors.valueOf());    // red,blue,green 数组
3、栈方法(LIFO 后进先出)

栈是一种LIFO的数据结构,就是最新添加的项被最早移除,插入和移除只发生在一个位置---栈的顶部。

push(): 添加到数组末尾, 返回值是修改后数组的长度

pop(): 从数组末尾移出最后一项,返回值是移除的项

var colors = ['red','green'];
var count = colors.push('black');

console.log(colors);    // ["red", "green", "black"]
console.log(count);     // 3
4、队列方法(FIFO 先进先出)

队列是一种FIFO的数据结构,就是队列在列表的末端添加项,从列表的前端移除项。

push(): 添加到数组末尾

shift(): 从数组中的第一个项移除,并返回该项。

unshift():添加到数组第一项,返回值是新数组的长度。

var colors = ['red','green'];
var count = colors.unshift('black','white');

console.log(colors);    // ["black", "white", "red", "green"]
console.log(count);     // 4
5、重排序方法

reverse(): 反转数组项

sort(): 按升序排列数组项

var values = [1, 0, 3, 4, 5];

values.reverse();
console.log(values);  // 5, 4, 3, 0, 1

values.sort();
console.log(values);  //0, 1, 3, 4, 5
6、操作方法

concat(): 添加数组(参数可以是数组或其他)

slice(): 截取数组。 两个参数时,返回起始和结束位置之间的项;一个参数时,返回指定位置开始到末尾的所有项(不包括结束位置的项)

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

splice(起始位置,删除的项数,插入的项数)

  • 删除:splice(0,2)会删除数组中的前两项
  • 插入:splice(2,0,"red","green")会从当前数组的位置 2 开始插入字符串"red"和"green"。
  • 替换:splice (2,1,"red","green")会删除当前数组位置 2 的项,然后再从位置 2开始插入字符串"red"和"green"
var colors = ["red", "green", "blue"]; 
var colors2 = colors.concat("yellow", ["black", "brown"]); 

console.log(colors);    //red,green,blue
console.log(colors2);   //red,green,blue,yellow,black,brown
var colors = ["red", "green", "blue", "yellow", "purple"]; 
var colors2 = colors.slice(1); 
var colors3 = colors.slice(1,3); 

alert(colors2);     //green,blue,yellow,purple 
alert(colors3);     //green,blue
7、位置方法(查找特定项在数组中的位置)

indexOf()和lastIndexOf()

  • 两个参数,要查找的项和表示查找起点位置的索引(可选的)。
  • 返回要查找的项在数组中的位置,没找到返回-1
var numbers = [1,2,3,4,5,4];
console.log(numbers.indexOf(4));    //3
console.log(numbers.lastIndexOf(4));    //5
console.log(numbers.indexOf(10));       //-1
8、迭代方法

ES5 为数组定义了 5 个迭代方法(every,filter,forEach,map,some)。

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

[1]、every()和 some()

它们都用于查询数组中的项是否满足某个条件,

every(),传入的函数每一项都返回 true,则是true;而 some()方法某一项返回 true,就会返回 true。

例1:检查是否所有给定项大于2;

var numbers = [1,2,3,4,5,6];
var everyResult = numbers.every(function(item, index, array){
    return (item > 2);
});
var someResult = numbers.some(function(item, index, array){
    return (item > 2);
});

console.log(everyResult);   //false
console.log(someResult);    //true

[2]、filter()

它利用指定的函数确定是否在返回的数组中包含某一项,返回符合条件的数组。

var numbers = [1,2,3,4,5,6];
var filterResult = numbers.filter(function(item, index, array){
    return (item > 2);
});

console.log(filterResult); // [3,4,5,6];

[3]、map()

返回一个新数组,为数组每一项执行一个指定函数。

var numbers = [1,2,3,4,5,6];
var mapResult = numbers.map(function(item, index, array){
    return item * 2;
});

console.log(mapResult); // [2, 4, 6, 8, 10, 12]

[4]、forEach()

这个方法没有返回值, 对数组中的每一项运行传入的函数。与使用 for 循环迭代数组一样。

var numbers = [1,2,3,4,5,6]; 
numbers.forEach(function(item, index, array){ 
 //执行某些操作 
}); 
9、归并方法

reduce()和 reduceRight()

  • 这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。
  • reduce()方法从左向右,而 reduceRight()则从右向左。
  • 两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。
  • 函数接收 4 个参数:前一个值、当前值、项的索引和数组对象(prev, cur, index, array)

例子:所有值的和

var values = [1,2,3,4,5]; 
var sum = values.reduce(function(prev, cur, index, array){ 
 return prev + cur; 
}); 
alert(sum); //15 

三、Date类型(待补充)

Date类型使用自UTC(国际协调时间)1970年1月1日零时开始经过的毫秒数来保存日期。

Dare类型保存的日期可以精确到1970年之前或之后的285 616年。

Date函数不传参数的时候,获得的是当前的日期和时间。

console.log( Date() );          //获得当前时间,Tue Jun 12 2018 09:38:46 GMT+0800 (中国标准时间)
console.log( Date.now() );      //获得当前时间,1528772996582
console.log( Date.parse("May 20,1980"));   //转换时间,327600000000
console.log( Date.UTC(1980,5,20) )         //转换时间,330307200000
// 取得开始时间
var start = Date.now(); 
// 调用函数
doSomething(); 
// 取得停止时间
var stop = Date.now();
var result = stop –start;
1、继承的方法
2、日期格式化方法

Date类型有一些专门用于将日期格式化为字符串的方法。

3、日期/时间组件方法

一些取得和设置日期的API方法,其中,UTC日期指的是在没有时区偏差的情况下的日期值。(将日期转换为GMT时间)。

console.log( nowTime.getTime() );      //1528774418642
console.log( nowTime.getFullYear() );   //2018
console.log( nowTime.getMonth()+1 );    //6
console.log( nowTime.getUTCDate() );    //12

四、RegExp 类型(待补充)

五、Function 类型

  • 函数是对象,函数名是指针
  • 一个函数可能会有多个名字,
  • 使用不带圆括号的函数名是访问函数指针,而非调用函数。
function sum(num1, num2){ 
 return num1 + num2; 
} 

var anotherSum = sum;   // 访问函数指针
alert(anotherSum(10,10));       //20 
sum = null; 
alert(anotherSum(10,10));       //20
1、没有重载(深入理解)

当函数命名重复时,会被覆盖。

2、函数声明与函数表达式

区别:

(1)解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);

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

(2)至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。

alert(sum(10,10)); 
var sum = function(num1, num2){ 
 return num1 + num2; 
};      // 运行错误
3、作为值的函数

函数也可以作为值来使用。1)当做参数传递,2)当做函数的结果返回。

4、函数内部属性

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

(1)arguments是一个类数组对象,包含着传入函数中的所有参数;

arguments.callee,该属性是一个指针,指向拥有这个 arguments 对象的函数.

例子:无论引用函数时使用的是什么名字,都可以保证正常完成递归调用。

// 当前函数执行时,与函数名factorial紧紧耦合了,
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) 
 } 
} 

(2)this引用的是函数据以执行的环境对象——或者也可以说是this值(当在网页的全局作用域中调用函数时,this 对象引用的就是 window)。

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

newObj.sayColor = sayColor; 

sayColor();     //"red" 
newObj.sayColor();   //"blue"

当在全局作用域中调用sayColor()时,this 引用的是全局对象window;

而当把这个函数赋给对象newObj并调用newObj.sayColor()时,this引用的是对象newObj.

5、函数属性和方法

每个函数都包含两个属性:length 和 prototype

(1)length 属性表示函数的命名参数的个数

function sum(num1, num2){ 
 return num1 + num2; 
} 
alert(sum.length); //2 

(2)prototype属性

在ES5中,prototype 属性是不可枚举的,因此使用 for-in 无法发现

prototype 是保存它们所有实例方法的真正所在

每个函数都包含两个非继承而来的方法:apply()和 call()

这两个方法的用途:在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。

它们真正强大的地方是能够扩充函数赖以运行的作用域。

(1)apply()方法接收两个参数:(在其中运行函数的作用域,参数数组array或者arguments 对象)

function sum(num1, num2){ 
 return num1 + num2; 
} 
function callSum1(num1, num2){ 
 return sum.apply(this, arguments);   // 传入arguments对象或数组[num1,num2]
} 

console.log(callSum1(10,10)); //20 

(2)call()方法

与apply()方法的区别:在于接收参数的方式不同。

function sum(num1, num2){ 
 return num1 + num2; 
} 
function callSum(num1, num2){ 
 return sum.call(this, num1, num2);   //参数是列举出来的
} 

console.log(callSum1(10,10)); //20 

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

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

六、 基本包装类型

ES 还提供了 3 个特殊的引用类型:Boolean、Number 和String。

  • 基本类型值不是对象,从逻辑上讲它们不应该有方法(实际上它们有方法)
  • 每当读取一个基本类型值,后台就会创建一个对应的基本包装类型的对象,从而我们能够调用一些方法来操作这些数据。
  • 引用类型与基本包装类型的主要区别:就是对象的生存期。引用类型是作用域,基本类型是一行代码的执行瞬间。

1、Boolean类型

不建议直接实例化 Boolean类型

基本类型与引用类型的布尔值区别:

  • typeof 操作符对基本类型返回"boolean",而对引用类型返回"object"。
  • 由于 Boolean 对象是 Boolean 类型的实例,所以使用 instanceof 操作符测试 Boolean 对象会返回 true,而测试基本类型的布尔值则返回 false。

2、Number类型

不建议直接实例化 Number 类型

3、String类型

String 类型提供了很多方法,用于辅助完成对 ES 中字符串的解析和操作。

1)字符方法: charAt()和 charCodeAt():用于访问字符串中特定字符的方法

var stringValue = "hello world"; 
alert(stringValue.charAt(1)); //"e"
alert(stringValue.charCodeAt(1)); //"101" 字符编码

2)字符串操作方法

concat()它们只是返回一个基本类型的字符串值,对原始字符串没有任何影响

var stringValue = "hello "; 
var result = stringValue.concat("world", "!"); 
alert(result);      //"hello world!"

slice()、substr(), 参数是(开始位置,结束位置) substring(),参数是(开始位置,返回的字符个数)

var stringValue = "hello 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, -4));        //"lo w" 
alert(stringValue.substring(3, -4));    //"hel" 
alert(stringValue.substr(3, -4));       //""(空字符串)
  1. 字符串位置方法

indexOf()和lastIndexOf(), 参数是(要查找的元素,开始位置)

  1. trim()方法

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

  1. 字符串大小写转换方法

toLowerCase()、toLocaleLowerCase()、toUpperCase()和toLocaleUpperCase()。

  1. 字符串的模式匹配方法

match()方法只接受一个参数,返回了一个数组

search()方法只接受一个参数,返回字符串中第一个匹配项的索引;如果没有找到匹配项,则返回-1

replace()方

split()

  1. localeCompare()方法

比较两个字符串,字母表中的顺序.

var stringValue = "yellow"; 
alert(stringValue.localeCompare("brick"));      //1 
alert(stringValue.localeCompare("yellow"));     //0 
alert(stringValue.localeCompare("zoo"));        //-1 
  1. fromCharCode()方法

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

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

七、 单体内置对象

ES实现提供的、不依赖于宿主环境的对象,这些对象在 ECMAScript 程序执行之前就已经存在了。

如 Object、Array、String,以及Global 和 Math。

1、Global对象

所有在全局作用域中定义的属性和函数,都是 Global 对象的属性。

诸如 isNaN()、isFinite()、parseInt()以及 parseFloat(),实际上全都是 Global对象的方法。

(1)encodeURI()和 encodeURIComponent()方法

对 URI(Uniform Resource Identifiers,通用资源标识符)进行编码,它们用特殊的 UTF-8 编码替换所有无效的字符,从而让浏览器能够接受和理解。

有效的 URI 中不能包含某些字符,例如空格,字符。

var uri = "http://www.wrox.com/illegal value.htm#start"; 

console.log(encodeURI(uri));        //"http://www.wrox.com/illegal%20value.htm#start" 
console.log(encodeURIComponent(uri));     //"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"

(2)Global 对象的属性

(3) window 对象

Web 浏览器都是将这个全局对象作为window 对象的一部分加以实现的。

2、 Math对象

Math 对象提供的一些计算功能的方法。

(1) min()和 max()方法: 取最大值和最小值

var max = Math.max(3, 54, 32, 16);
var min = Math.min(3, 54, 32, 16);
alert(max); //54
alert(min); //3
    
    
var array = [3, 54, 32, 16];
var max = Math.max.apply(Math, array);  //54
var min = Math.min.apply(Math, array);  //3
    
// 这个技巧的关键是把 Math 对象作为 apply()的第一个参数,从而正确地设置 this 值。
然后,可以将任何数组作为第二个参数。

(2) 舍入方法

Math.ceil()、Math.floor()和 Math.round()。

(3) random()方法

返回大于等于 0 小于 1 的一个随机数。

值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值) 

第六章 集合引用类型

第七章 迭代器与生成器