JavaScript高级程序设计(第三本子)学习笔记1~5章

第2章,在html中使用JavaScript

Html引入外部js脚本

<script type=”text/javascript”
src=”test.js”>两个</script>之间无应加大脚本,因为并无会见被执行</script>

<script>标签有一个defer属性可以顺延脚论实施,但是连无保证会按脚本排列顺序执行

建议:将脚本引入放在<body>标签的兼具情节后,而无在<head>标签中开展引入,加快页面响应

<noscript></noscript>标签中的内容会于浏览器不支持脚本或脚本被剥夺的下输出,启用了本子的浏览器将未会见视标签中的内容

第3章,基本概念

标识符

率先独字符必须是字母,下划线(_)或美元符号($),有效命名为字母、数字、下划线和美元符号构成的

利用驼峰命名法:第一单字母小写,后面的每个单词首假名大写

单行注释:

//这是单行注释

大多推行注释:

/*这是
多行
注释
*/

typeof 操作符

typeof – 判断为一定变量的数据类型

返回:

“undefined” – 未定义之数据类型

“boolean” – 布尔值

“string” – 字符串

“number” – 数值

“object” – 对象或NULL

“function” – 函数

横流:函数在js中凡是目标,不是数据类型,因此用typeof区分函数和目标是发出必要的

  typeof于稍微时候会回来令人迷惑但技术达到确实是不错的价值,例如,null和目标,两者都见面回到“object”

  null和undefined是相等的,null == undefined 将回来true

开展算术计算时,所有的八进制和十六进制都以移成为十进制

 

Infinity 无穷大,有正负无穷大,可以利用isFinite()判断是否无穷大

Number.MAX_VALUE,Number.MIN_VALUE分别保存在数值类的太酷价值与无限小值

Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY分别保存着靠和正无穷大

NaN 非数值,可以使isNaN判断一个变量是否非数值

 

数值转换

强制转换Number(),但是结果连无客观,建议使用parseInt()函数,并带需要转移的基数

例:

parseInt(“10”,2);    //以二进制解析
parseInt(“10”,8);    //以八进制解析

不带基数意味着被parseInt自己支配哪些剖析字符串,这会当好几时候造成错误

parseFloat()与parseInt()基本相同,将字符串解析成浮点数,始终忽略前导零,只分析十向前制值,十六进制将于分析成0,因此他莫第二只参数

 

字符串类型

字符串类型变量是不可变,亦即字符串变量是为一个常量,可以用单引号(’),也得以用对引号(”)定义字符串变量,但要配合,如果要混用,建议加上转义字符(\)

应用toString()函数将一个价值转换为字符串,数值则足以应用基数值进行转换

例:

var num = 10;

num.toString(“2”);  //”1010”

num.toString(“8”);  //”12”

 

啊足以利用String()进行强制转换

 

Object类型

constructor:构造函数

hasOwnProperty(propertyName):检查给定的性在目前目标吃是不是在

isPrototypeOf(object):检查传入的靶子是不是是传播对象的原型

propertyIsEnumerable(propertyName):检查给定的性质是否能够使用for-in语句来枚举,与hasOwnProperty一样,给得的特性名必须坐字符串的款式指定

toLocalString():返回对象的字符串表示,与执行环境之地带对应

toString():返回对象的字符串表示

valueOf():返回对象的字符串、数值或布尔值表示。通常与toString返回相同

 

操作符

按位非:~,按个与:&,按位或:|,按位异或:^,左移:<<,有记号右变:>>(以符号位填充),无符号右变:>>>(以零填充),逻辑非:!,逻辑与:&&,逻辑或:||

干操作符:<,>,<=,>=

相当和未顶:==,!=,先易再于

全等和免都当:===,!==,只比较,不变换,类型不同则不同

法操作符:? :,三观望运算符

逗号操作符:(,),返回最后一个表达式的价值:var num = (3,5,6,2),num = 2

 

语句

if{},do{}while();,while(){},for(;;){}

for-in语句:

精准的迭代语句,可以据此来枚举对象的性能

for(property in expression) statement

 

例:

for(var propName in window){

         document.write(propName);

}

 

流动:当目标的变量值为null或者也undefined时,for-in会发生错误,虽然ECMAScript5重新改了立即无异错,不过,为了最酷限度的保险兼容性,在运用for-in循环之前,先检测该目标的价未是null或者undefined

 

label语句:标签语句

start:for(var I = 0;i<count;i++){
    statement
}

以此start标签可以以今后的break和continue语句被运用,标签语句一般与循环语句子一起行使

with语句:

拿代码的作用域设置及一个一定的目标被

with(expression) statement;

从严模式下未同意下with语句,否则用给视为语法错误

大气利用with语句会导致性降低和代码调试困难,建议大型应用程序的付出不行使with语句

switch语句

switch(expression){
    case selection:statement;
         break;
     ……
    default:statement;
            break;
}

函数

严酷模式对函数限制:

函数不克命名为eval和arguments

参数不可知命名吧eval和arguments

免克冒出零星单命名参数同名的场面

晓函数参数

js中的函数并无在意传上多少个函数参数,即使与定义的情形例外,因为以函数接收到的永远都是一个近似数组形式之参数,函数并无关注数组包含的参数。可以当函数体内通过arguments对象来走访这个参数数组。

arguments只是和数组类似,因为好用方括号来访问它的因素,使用length来确定传上的参数只数。arguments中的参数顺序与传进来之参数顺序一致,并且是手拉手转移的。

流淌:没有传递值的命名参数,将会给赋值为undefined值。

  严格模式对arguments对象作出了一部分限量:在函数中针对arguments进行赋值将会晤变换得不算,重写arguments值将见面促成语法错误

  使用arguments对参数的类及数量进行判定,可以如法炮制重载

第4节,变量、作用域和内存问题

流淌:js中兼有函数的参数还是按照值传递的

检测类别:instanceof

instanceof操作符,只能操作引用类型,即对象,对基本数据列的测试始终返回true,因为基本数据列不是目标

result = variable instanceof constructor

要变量是加的援类型,则赶回true

例:

person instanceof Object;        //person是Object类型吗?
color instanceof Array;             //color是Array类型吗?

从未有过块级作用域

if(true){
     var j = “blue”;
}
alert(j);
//将会得到输出blue

苟以C/C++中以会面世错误,而js并无会见油然而生谬误,在片里面定义的变量将会见加加至手上的花括号之外的作用域中。

垃圾收集

标志清除

引用计数

第5段,引用类型

Object类型

个别种创建实例方式:

同一、使用new操作符后和Object构造函数

var obj = new Object();
obj.name = “name”;
obj.age = 23;

次、使用对象字面量(通过对象字面量定义对象时,实际上并无会见调用Object构造函数)

var obj = {
      name : “name”;
      age : 23
}

可以使用点表示拟与方括号表示拟访问对象的性质

接触表示法:                                         
方括号表示拟:(必须坐字符串的形式表示只要拜的属性名)

obj.name                                           obj[“name”]

流淌:当属于性名包含会导致语法错误的字符,或属性名使用的凡重中之重字或保留字时,可以行使方括号表示拟,还可由此变量访问属性

提议:除非必须使变量访问属性,否则极好用点表示法

Array类型

缔造方式:

相同、使用Array构造函数

var arr = new Array();    //创建一个空数组
var arr = new Array(20);    //创建一个包含20个项的数组
var arr = new Array(“one”,”two”,”three”);     //创建包含one,two,three三项的数组

尚可将new操作符省不怎么

第二、使用频繁组字面量表示法

var color = [“red”,”blue”];    //创建包含两个项的数组
var color = [“yellow”,”green”,];    //不要这样创建数组,浏览器的解析不同,结果会不同

流淌:使用频繁组字面量创建数组时,也无会见调用Array构造函数

arr.length,将见面回到数组的项数,即将返回数组的轻重缓急

本着arr.length进行赋值,将见面动态改表数组大小,赋值大于原数组大小将扩大数组,新增项获得undefined的价,小于原数组大小,将保留前面的数值,多的数值将吃移除

数组检测:

对只有来一个大局作用域而言,instanceof可以老有利的检测某个变量是否是几度组,但对于多单框架的网页而言,则在多只不等的本的Array构造函数,instanceof将未可知满足要求,为夫引入Array.isArray(value)方法,这个点子可以最终确定有值是否是反复组,而随便是何人框架结构之。支持之浏览器也:IE9+,Firefox4+,Safari5+,Opera10.5+,chrome。

转换方法:

调用数组的toString()方法,将见面回去由数组中每个值的字符串形式拼接而成的坐逗号分隔的字符串,valueOf()方法返回的尚是屡组,与toString()是如出一辙的结果

toLocaleString()返回的通常和toString()和valueOf()返回结果是同一的,但连无连续这样,使用toLocaleString()方法,则会错过调用数组中各个一样起的toLocaleString()方法,而不是toString()方法。

join方法

join方法接受一个参数,即作分隔符的字符串

例:

var arr = [“one”,”two”];
arr.join(“|”);    //one|two

若果非叫join传递参数,则回以逗号作为分隔的字符串

流动:如果数组中有同项之值为null或者undefined,则调用join,toLocaleString(),toString(),valueOf()返回的结果虽动用空字符串代表

屡组的栈方法

var arr = new Array();

arr.push(),在频繁组末尾添加数据,可以流传多个参数,并回到修改后的数组长度

arr.pop(),从数组末尾移除最后一个数码,减少数组的length值,并赶回该项的价

再三组的行列方法

var arr = new array();

arr.shift(),移除数组的首先码,减少数组的length值,并赶回该项的值

arr.unshift(),在数组的前端添加任意个宗,并返修改后底数组长度

动用shift和push结合,可以学队列操作

用unshift和pop结合,可以由反方向模拟队列

重排序方法:

var arr = new Array();

arr.reverse(),翻转数组的项,即首尾顺序调转

arr.sort(),默认情况下升序排列,注:排列顺序是多次组值转换成字符串之后的升序排列,通常不是所急需之排序

sort方法好承受一个较函数作为参数,实现所欲的排序方法,方法返回负数则按升序排列,返回整数则随降序排列,注:可以适应大多数排序情况

操作方法:

var arr = new Array();

arr.concat(),进行数组连接,并回连接后底勤组,可传唱多独参数

arr.slice(),可以依据当前数组中的一个要么多独价值创造一个初数组返回,接受一个要少于单参数,即返原数组的前奏位置与收位置之间的备项,不带有了位置的宗,只出一个参数则赶回从该参数指定位置及最后的有着项。

横流:如果参数是负数,则会以反复组的长加上这负数得到的结果来规定位置。结束位置小于起始位置则归空

splice()方法:

去:指定两只参数,要删减的序曲位置及苟去除的项数,例:splice(0,2);

栽:指定三只参数,起始位置,要刨除的项数(0),要插入的项,插入的起可以是多单宗

         例:splice(2,0,”red”,”green”);                 
//从位置2插入red,green

轮换:与插入相同,第二个参数有变,起始位置,要删减的项数,要插入的项,插入的项数可以是大半独宗

位置方法:

indexOf(),lastIndexOf(),都接受两只参数,要寻找的宗和摸索起点位置索引indexOf从数组头开始查找,lastIndexOf从数组末尾开始查找。若没找到则回-1.

注:查找时进行的比使用的是全等操作符,就如以“===”一样

迭代法:

ECMAScript5定义了5单迭代方法,全部接收两只参数:每一样桩达到运行的函数,运行该函数的作用域对象—影响this的价。函数则接受三只参数:数组项的值,该项在反复组吃之职,和数组对象自我

var arr = new Array();

every(),对数组中列一样件运行为定函数,每一样码都回去true,则赶回true

filter(),对数组每一样桩运行为定函数,返回该实施函数返回true的项整合的数组

例:

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

forEach(),对数组中列一样起运行为定函数,没有回到值,本质上及for循环迭代数组一致

map(),对数组中列一样件运行为定函数,返回每次函数调用的结果成的结果

some(),对数组中列一样桩运行为定函数,只要随便一项之函数结果是true,则归true

流淌:以上所有函数并无见面指向数组进行改动

例:

var num = [1,2,3,4,5,4,3,2,1];
    var mapResult = num.map(function(item,index,array(){
    return item * 2;
});
//以上代码返回数组每一项都乘2以后的数组

由并道:

reduce()和reduceRight()

片只函数都见面迭代数组的有所项,然后构建一个末回到的值,其中reduce从数组第一起开始,reduceRight从数组最后一宗开始

即时有限独点子都接到2个参数:一个每当各国一样桩达到且调用的函数和(可选的)作为联合基础的初始值。传递的函数需要接受4个参数:前一个值,当前值,项之目和数组对象。这个函数的回值会作为第一个参数传递给下一致项,第一蹩脚迭代发出在多次组的次码上,因此首先独参数是频繁组的首先宗,第二个参数是屡组的第二桩。

例:

var value = [1,2,3,4,5];
    var sum = value.reduce(function(prev,cur,index,array){
    return prev + cur;
});    //sum = 15
//第一次执行回调函数,prev = 1,cur = 2,第二次,prev = 3(第一次函数返回结果1+2),cur = 3(当前数组项)。这个过程会把数组每一项都访问一遍。reduceRight除了方向不一样,其他都一样。

Date类型

Date类型使用自UTC1970.1.1午夜零时初步通过的毫秒数来保存日期,可以以日期精确到1970.1.1之前要之后100
000 000(一亿)年。

下Date构造函数而休招参数,新目标会获得当前日期及岁月,要创特定日期时,必须传入表示该日期的毫秒数,ECMAScript提供了片只方法Date.parse和Date.UTC方法来简化操作。

Date.parse方法接收一个代表日期的字符串参数。这个主意为实现而异,而且一般为所在而异。美国所在的浏览器支持以下格式:

月/日/年,如6/13/2004

英文月名 日,年,如January 12,2004

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

ISO
8601恢弘格式YYYY-MM-DDTHH:mm:ss.sssZ,如2004-05-25T00:00:00,只有支持js5的兑现支持这种格式

Date.UTC也一致返回表示日期毫秒数,参数分别吗:年份、基于0的月度(一月份是0)、月被哪一样上(1-31)、小时数(0-23)、分钟、秒和毫秒数,其中只有前少独参数是必须的。

例:

var someDate = new Date(Date.UTC(2000,0));    //2000年1月1日0时0分0秒
var someDate = new Date(Date.UTC (2000,0,1,15,23,23));    //2000年1月1日15时23分23秒

Date构造函数会模仿Date.parse和Date.UTC函数。

Date.now方法返回调用这个函数时之日子以及时空毫秒数。在不支持的浏览器上面,可以应用+操作符获取Date对象时戳

var start = +new Date();

var stop = +new Date();

日期格式化方法

toDateString—以特定于实现之格式显示星期几、月、日、年

toTimeString—以一定于贯彻之格式显示时、分、秒和时区

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

toLocaleTimeString—以一定于贯彻之格式显示时、分、秒

toUTCString—以一定于贯彻之格式完整的UTC时间

跟toLocaleString和toString一样,以上办法无一个能用来以用户界面被显示平的日子信息。

RegExp类型,正则

语法:类似于Perl语法

var expression = / pattern  /flags;

模式(pattern)部分足是粗略或复杂的正则表达式,每个表达式可以应用一个或者多独标识符,支持以下3独标识符

g:全局模式,将受下为拥有字符串,而休是当配合到第一独字符串后虽终止,

i:表示不区分轻重缓急写,

m:表示多实施模式,即达标一行文本末尾时,会持续查找下一行

流动:模式被具备元字符都需要转义

元字符:( [ { \ ^ $ | } ? * + .
] )

上述办法是坐字面量模式创造正则表达式

采用RegExp构造正则表达式

var partten = new RegExp(“bat”,”I”);

流动:使用RegExp构造函数,所有元字符必须再次转义

例:/\[bc\]at/  ===> “\\[bc\\]at”

RegExp实例属性

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

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

lastIndex:整数,表示开搜的产一个匹配项的字符位置,从0算打

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

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

RegExp对象的第一方法是exec(),exec()接收一个参数,即要采取模式之字符串,返回一个匹配配项(即使设置了g标志),有没有来安g标志的别在,没有装则连回到跟一个结果,设置了则回下一个郎才女貌

test方法,接收一个字符串,只回去是否配合,不返结果

Function类型

函数是目标,函数名为是指针

定义方法:

//函数声明的形式
function sum(num1,num2){
    return num1 + num2;
}
//函数表达式的形式
var sum = function(num1,num2){
    return num2 + num2;
}
var sum = new Function(“num2”,”num2”,”return num1 + num2”);         //不建议,性能渣,但能更好的理解函数是对象的思想。

function add(num){
    return num + 100;
}
function add(num1,num2){
    return num + 200;
}
//实际如同下面的代码
function add(num){
    return num + 100;
}
add = function(num){
    return num + 200;
}

所以函数没有重载。

函数内部属性

函数内部生一定量独奇特对象,arguments和this

arguments有一个特性callee,指向拥有这个arguments的函数

概念递归函数时,最好用arguments.callee()来代替函数称呼,降低耦合,减少题材的出现

例:

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);
}

this对象

函数的this对象引用的凡部数据为执行之条件目标

ECMAScript5正规定义了另一个函数对象的特性:caller,保存着调用当前函数的函数的援

函数包含了有限独属性:length(希望接的函数个数)和prototype,prototype不可枚举,所以for-in无法察觉他。prototype是装有援类型保存其抱有实例方法的真的所在

蕴含两单非继承而来的方:apply和call

apply方法接收两个参数:一个凡在里边运行函数的作用域,也尽管是this对象,一个凡是参数数组,可以是Array实例,也得以是arguments对象

call与apply基本相同,区别在,使用call函数,参数必须逐一个列举出

传送参数并非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函数放到o对象吃,就得使o对象能够采取sayColor函数

ECMAScript5还定义了其他一个智:bind,这个方法会创建一个函数实例,其this值会被绑定到传给bind函数的值

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

 toLocaleString和toString始终返回函数代码,但出于浏览器差异,并从未办法根据返回结果实现其他重大功能,valueOf也止回函数代码

主干包装档次

Boolean、Number、String

针对中心包装档次的实例调用typeof会返回object,而且具备的主干包装档次的实例都见面回去true,

Object构造函数也会见如工厂方法一致,根据传入的价值的类返回响应的着力包装档次的实例

例:

var obj = new Object(“some text”);
alert(obj instanceof String);    //true

下new调用基本包装档次及一直利用同名的转型函数是不平等的。例:

var value = “25”;
var num = Number(value);        //转型函数
alert(typeof num);                //”number”
var obj = new Number(value);    //构造函数
alert(typeof obj);                //”object”

Number类型

此外提供的法子

toFixed();接收一个参数,表示若因几各类小数表示手上值,当前小数各项了长则四放弃五合,此措施好象征带有0到20个小数位的数值,这才是正统兑现范围

toExponential();接收一个参数,返回指数形式表示,参数指定返回的结果丁的粗数位数

toPrecision();接收一个参数,表示有数字的位数,不包指数部分

string类型

var str = “hello world”;
str.charAt(1);    //”e”,返回字符
str.charCodeAt(1);    //”101”,返回字符编码
str.concat();//连接字符串,可以接收任意个字符串

slice(),substring(),substr(),都吸纳一或少数单参数,接收的率先只参数均代表起始位置,slice(),substring()接收的老二个参数表示已位置,substr()的第二单参数表示回去的字符个数,若未叫老二独参数,则归从开始位置及字符串结束位置的字符

携带负数表现不同:slice会将装有带的负数与字符串长度相加,substr会将首先参数加上字符串长度,第二单参数转换为0,substring()将拥有负值转为0

indexOf,lastIndexOf方法还归子字符串的职,indexOf从头查找,lastIndexOf从最终查找,没有找到归-1,两独章程都得以收第二个可选取参数,表示字符从哪开搜

trim(),返回源字符串删除前后缀有空格的结果

toLowerCase,toLocaleLowerCase,toUpperCase,toLocaleUpperCase,带有Locale的办法是对一定地方的落实。通常而言是不曾啊差别,但个别语言会也Unicode大小写转换应用非常规则,这就算必使对一定地区的落实

match(),search()这点儿只方式都收到一个参数,字符串或者RegExp对象指定的一个正则表达式

replace()方法,接收两独参数,第一独参数可以是一个RegExp对象要字符串(不见面吃移成为正则表达式),第二只参数可以是一个字符串或函数,若要替换所有字符串,则须采取正则表达式,并加全局(g)标志

split(),接收一个参数作为字符串的分隔符,返回由隔符分隔得的一再组,可以收到第二单可挑选参数,作为返回结果的数组大小

localeCompare(),比较少单字符串,关于是否别轻重缓急写,视地方而迟早

1、源字符串应革除在参数字符串之前,返回负数(具体看情况要一定,通常也-1)

2、源字符串与参数字符串相同,返回0

3、源字符串排在参数字符串之后,返回整数(具体来看情形而自然,通常为1)

fromCharCode(),接收一个或者多只字符编码,转换成字符串,与charCodeAt()执行的凡反操作

URI(通用资源标识符)

道:encodeURI,encodeURIComponent,decodeURI,decodeURIComponent,编码和解码,解码方法才能够识别各自对应之编码方法

eval(),将带的字符串参数,转换成为可尽语句,并插入到当下职务

eval创建的别变量和函数都无见面让提升,严格模式下,外部无法访问eval创建的变量和函数

流淌:尽量不动eval方法,仅属于个体意见

Math对象

min(),max(),ceil()向上舍入,floor()向下舍入,round()标准舍入,即四放弃五相符,random()返回大于等于0小为1底自由数