JavaScript高级程序设计第三版笔记(基础部分)

三.基本概念
3.4数据类型
5种简单数据类型:undefined,boolean,number,string,null.还有一种复杂的数据类型:object.
由于不像c语言一样区分各种数据类型,所以使用var新建的数据可以使用typeof返回数据类型,如
var message=”hello”;alert(typeof(message));.

boolean值,可以对任何数据类型的值调用boolean()函数,返回true或者false.
number值,不要使用浮点数做测试,存在误差,如if(a+b==0.3){alert(“you got 0.3”) },这样是不能得到你想要的结果的.isFinite()函数可以测试数值是否在Infinity和-Infinity之间,只有在这之间的数值才能参与下一次的计算.
NaN,not a number,NaN和任何数字都不相等(包括其自身),alert(NaN==NaN);//false.

3.5操作符,
1.按位非(NOT),返回数值的反码,其实就是负值减一;
2.按位与(AND),两个数值进行按位与操作;
3.按位或(OR),两个数值进行按位或操作;
4.按位异或(XOR),两个数值进行按位异或操作,与按位或的不同之处在于1按位异或1等于0;
5.逻辑非(!),boolean操作符,把!true=false;
6.逻辑与(&&),真真为真,真假为假,假假为假;
7.逻辑或(||),真真为真,真假为真,假假为假;
条件操作符,var max=(num1>num2)?num1:num2;等同于if(num1>num2){return num1};else{return num2};
3.6语句
1.if语句,if(condition){代码块};else if(condition){代码块};else{代码块};
2.do..while语句,do{代码块}while(expression);
3.while语句,while(expression){代码块};和do…while不同的是,do..while会先执行一次循环,而while只有当语句成立时才执行代码块;
4.for语句,for(var i=0;i<10;i++){代码块};这段代码的意思是,初始化i=0,当i<10时为true,然后执行一次代码块,且i自加1,如果写成for(;;){代码块};就会创建一个无限循环;
5.for in语句,for(var propName in window){document.write(propName)};可以枚举对象的属性,这段代码枚举了window对象中的所有属性;
6.label语句,可以在代码中添加标签,以便将来使用,label:statement,如start:for(i=0;i<10;i++){alert(i)};label一般是用在for循环中,方便以后使用break和continue语句控制;
7.break和continue语句,break停止整个代码,continue停止当前代码,接着执行后面的代码;
8.with语句,with的作用是把代码的作用域设定到特定的对象中,with(expression){statement};
9.switch语句,switch(expression){case value1:statement break;case value2:statement break;…..default:statement;}
3.7函数
位于return语句之后的任何代码都不会被执行,ECMAscript和其他语言有所区别,函数的参数可以调用任意多个,即使没有定义这么多个,因为实际上函数是调用的一个参数数组,所以我们也可以通过访问argruments[0],arguments[1],….等来访问函数的参数,如:function sayHi(){alert(“hello”+arguments[0]+arguments[1])},也就是说,ECMAscript中对函数参数的命名并不是必须的,只是为了提供方便.
ECMAscript定义函数没有重载,函数属于后定义,即后面一个相同名字的函数会覆盖前面一个函数.当调用时,会调用后面定义的函数.

四.变量,作用域,内存问题
4.1基本类型和引用类型
ECMAscript包含两种类型的值,基本类型值和引用类型值,对这两种类型值的操作也大相径庭,基本类型值的复制不会改变原有变量,以后所做的操作也是互相独立的,但是引用类型值复制的是对象的指针,指向同一个对象,所以对其中一个对象进行操作也会影响到另外一个对象,如:var Obj1=new object();Obj2=Obj1;Obj2.name=copyFromObj1;alert(Obj1.name);//显示copyFromObj1.
函数参数的传递,所有函数的参数都是按值传递的,
检测类型,使用typeof检测数据的类型,如果要知道是何种对象,就需要使用instanceof
4.2执行环境及作用域
作用域链只能向上搜索,不能向下搜索,详细解释见书本.函数参数也被当作变量来对待,因此其访问规则同执行环境中的其他变量相同.
4.3垃圾收集
JavaScript有别于C和C++等一些语言,其实现了垃圾的自动管理,不需要人为的跟踪内存,大多数浏览器都采用标记清除方式.

五.引用类型
5.1.Object类型,使用var obj=new object()创建新对象,也可以使用对象字面法创建新对象:var obj={name:cc,age:25},花括号中包含属性,属性用逗号隔开,最后一个属性不能使用逗号,推荐使用对象字面法,这样代码更简介,给人封装数据的感觉,同时方便函数进行大量传参(直接传递给函数带有大量属性的对象).
5.2.Array类型,使用var Arr=new Array()创建新数组,new可以省略,创建的同时还可以直接指定数组的项数,通常情况下不用指定,ECMAscript中数组容量是动态的,且数组中每一项可以保存任意的数据类型,这和其它语言是有区别的,也可以使用var Arr=new Array(“red”,”blue”,”black”),直接指定数组项的内容,和Object类型类似,Array类型也可以使用数组字面法创建新数组:var Arr=[“red”,”blue”,”black”],中间用逗号隔开,这样的做法和Object类型一样不会调用Array()方法,使代码更简洁.Array类型也有默认的方法,push(),pop(),shift(),push()和pop()是模拟
栈方法(LIFO,后进先出),而push()和shift()方法是模拟
队列方法(FIFO,先进先出).数组还有
重排序方法,reverse(),和sort(),reverse()顾名思义就是倒序,sort()方法默认采用升序,但是sort()方法通过调用toString()方法,然后比较字符串来决定排序的,这样也许得不到我们想要的结果,如果我们希望比较数值的大小,可以给sort方法传递一个比较大小的函数作为参数

function compare(value1,value2)
{
return value2-value1;
}

然后使用,Arr.sort(compare),即可把数组中的数值大小以升序排列,如果希望降序,函数就改为value2-value1.
操作方法,concat()方法,用于连接数组,slice(起始位置,结束位置),切割数组中的一部分并建立新数组,对原数组不会产生影响.splice()方法,splice(起始位置,要删除项数,要插入的项)
位置方法,indexOf和lastIndexOf,indexOf(要查找的项,起始位置(可选)),lastIndexOf()同理,只是反过来查询.
迭代方法,都接收两个参数,要在每一项上运行的函数,运行该函数的作用域对象(可选)–影响this的值,对数组中每一项运行给定函数,every(),如果所有返回结果为true,则为true;filter(),返回运行结果为true的项,forEach(),对数组中每一项运行给定函数,没有返回项;map(),返回所有运行结果,相当于一次遍历;some(),只要有一项返回true,则返回true.
归并方法,reduce()和reduceRight(),value.reduce(function(pre,cure,index,array)).
5.3.Data类型,遵循UTC时间,(UTC指Coordinated Universe Time,国际协调事件),1970年1月1日午时(零时)开始经过的毫秒数来保存日期,var now=new Date(),创建新日期.
5.4.RegExp正则表达式,var pattern1=/.at/gi和var pattern2=new RegExp(“.at”,”gi”)等价,RegExp()接收的参数以字符串的形式传递,所以需要使用双引号.RegExp提供exec()方法,exec()方法接收字符串,返回包含第一个匹配项的数组.test()方法,接收一个字符串参数,在模式与参数匹配的时候返回true.
5.5function类型,函数实际上是对象,每个函数都是function类型的实例,由于函数是对象,所以函数名实际上是指向函数对象的指针,函数拥有arguments对象,使用arguments.callee来代替函数名(arguments.callee指向拥有arguments对象的函数)可以消除函数执行和函数名之间的紧密耦合.
函数的属性和方法,函数拥有length和prototype属性,length属性返回传入参数的个数,函数拥有两个非继承的方法,apply()和call(),apply()接受两个参数,一个是在其中运行函数的作用域,一个是Array的实例或者arguments,call()和apply()的作用差不多,只不过接收参数的方法有点不同,call()第一个参数也是接收在其中运行的函数的作用域,另外的参数则接收在其中运行的函数具体的参数.表面上看,apply()和call(),都是传递函数的参数之用,但事实上,这两个方法的的真正强大之处却在它们能够扩充函数赖以运行的作用域.ECMAScript5增加了bind()方法.
5.6基本包装类型,ECMAScript提供了三个特殊的引用类型,Number,Boolean,String,让这三个基本数据类型像对象一样具备方法和属性,当然和真正的饿引用类型还是有区别的
string类型,除了一些基本的方法外,ECMAScript5还定义了trim()方法,这个方法会创建一个字符串副本,删除前置和后缀的所有空格,然后返回结果;大小写转换,toLowerCase()和toLacaleLowerCase()转换为小写,toUpperCase()和toLocaleUpperCase()转换为大写,通常情况下不带Locale并没有什么影响,但有些国家会为Unicode大小写应用特殊的规则,所以需要加上Locale.
六.面向对象的程序设计
创建对象,组合使用构造函数模式和原型模式是目前最常见的.(详细内容单独学习研究)
继承,OO语言支持接口继承和实现继承,ECMAScript只支持实现继承.(详细内容单独学习研究)

你可能感兴趣的:(javascript,web前端)