第三章总结(数据类型)
一、语法
1.ECMAScript中一切(变量名、函数名、操作符都区分大小写)
2.标识符:
- 第一个字符必须是 字母 或 _ 或 $
- 其他字符可以是字母、下划线、美元符号、数字
3.注释:
// 单行注释
/* 多行注释 */
4.语句后最好加上分号
5.语句块用 { } ,单条语句最好也用 { }
二、关键字和保留字
1.关键字和保留字最好不要作为标识符和属性名。
三、变量
1.ECMAscript的变量类型是松散类型,它可以保存任意类型的数据;它保存的数据也可以进行二次更变即使保存的数据类型发生了改变(但我们并不推荐改变保存数据的数据类型)
2.定义变量用 var 变量名 = 数据;
注:
- 如果不对变量名进行初始化,变量会保存undefined;
- 如果使用var定义变量,定义的是局部变量;如果省略var,则定义了一个全局变量。(不推荐定义全局变量,严格模式会有错误)。如果在函数中定义了一个全局变量,需要在调用了一次该函数后,该全局变量才会有定义。
- 同时定义多个变量:
var messsage = "hi",
found = false, /*逗号分离*/
age = 29; /*分号结束*/
- 严格模式下不能将变量名命名为eval、arguments.
四、数据类型
1.typeof操作符(查看变量的数据类型)
(1)书写格式: typeof 变量名/要检测的数据;
- typeof是操作符不是函数,因此变量名左右不需要带圆括号。
- 当变量名未进行定义或初始化时使用typeof操作符都显示undefined;
2.undefined类型
(1) 值:undefined
注: - 可以在定义变量时将其初始化为undefined。
- 对于未声明的变量只能使用typeof操作符,其他操作都会有错。
3.Null类型
(1)值:null (表示一个空对象指针)
在使用typeof操作符会返回object。
注: - 如果定义的变量想在将来用来保存对象,最好在定义该变量的时候初始化为null,这样有利于后续操作。
if(car!=null){
...
}
- 由于undefined派生于null,因此在测试undefined与null是否相等时,要返回true
alert(null == undefined); /*true*/
4.Boolean类型
(1)值:true、false
true和false与数值不同,因此true不一定等于1,false不一定等于0,。
(2)转型函数: Boolean(变量名);
使用该函数任何数据都会转化为true、false。
(3)对于理解控制流语句(如if语句)会自动执行Boolean转换
var message = "hi";
if(message){
alert("value is true");
}
/*value is true*/
5.Number类型
(1)表示整数数值和浮点数值
- 整数数值:
十进制: var num = 23;
八进制: var num = 070; //第一位必须为0,如果数字超过范围会当做十进制处理
十六进制: var num = 0xAf; //前两位必须是0x,后面的字母大小写都可以 - 浮点数值:
数值中必须有小数点,小数点后必须有一位数字,小数点前可以没有数字(但不推荐);
对于极大或极小的值,可以用e表示法表示数值
(2)数值范围
正无穷:Infinity
负无穷:-Infinity
最大值:Number.MAX_VALUE
最小值:Number.MIN_VALUE - 判断一个数值是不是位于最大值和最小值之间:
isFinite(变量名),如果在最大值最小值之间,返回true。
(3)NAN (非数值Not a Number)
任何数值除以非数值会返回NAN - 任何涉及NAN的操作都会返回NAN
- NAN与任何数值都不相等,包括NAN本身
- 判断一个数据是不是数值:isNAN(数据);
如果该数据可以转化为数值,返回false
如果不能转化为数值,返回true
(4)数值转换(把非数值转化为数值)
Number()、parseInt()、parseFloat()
6.String类型
(1)字符串可用双引号(")或单引号(’)表示。
字符串的长度可通过length属性获得:变量名.length;
(2)特点 - 字符串不可变,只能先销毁原来的字符串、再用另一个新的字符串填充该变量。
var lang = "JAVA";
lang = lang + "Script";
(3)其他数据转化为字符串
toString()、String()
7.Object类型
var o = new Object();/*可以省略圆括号,但不推荐*/
五、操作符
1.一元操作符
(1)递增递减操作符
a++ 、 a-- 、 ++a 、 --a
这四个操作符对字符串、布尔值、浮点数值和对象都有作用。
(2)一元加和减操作符
- 一元加操作符:s1= +s2; //会将s2转换为数值、赋值给s1
- 一元检测操作符:s1= -s2; //会将s2转换为数值、再添一个负号.
2.位操作符
(1)非(NOT)
用 ~ 表示
(2)与(AND)
用 & 表示
(3)或(OR)
用 | 表示
(4)异或(XOR)
用 ^ 表示,只在真值表为1 0、0 1时返回 1
(5)左移
用 << 表示
(6)有符号右移
用 >> 表示
(7)无符号右移
用 >>> 表示
3.布尔操作符
(1)逻辑非 ( ! )
(2)逻辑与 (&&)
(3)逻辑或 ( || )
4.乘性操作符
操作符在非数值的情况下会自动执行类型转换
(1)乘法(*)
(2)除法 (/)
(3)求模(%)
5.加性操作符
(1)加法(2)减法
6.关系操作符
(1)小于< (2)大于> (3)大于等于>= (4)小于等于<=
7.相等操作符
(1)相等(= =)和不相等(!=)
先进行转化,转化后再看等不等于
(2)全等和不全等
全等 (= = =)
两个操作数未经转换直接比较,相等返回true,否则返回false.
8.条件操作符
s1 = (num1>num2)?num1:num2;
9.赋值操作符
var s1 = 22;
10.逗号操作符
逗号操作符总返回表达式的最后一项。
var num = (5,1,4,8,0); //num值为0.
六、语句
1.if语句
2.do-whie语句
3.while语句
4.for语句
5.break、continue语句
6.switch语句
switch比较时用的是全等操作符,不会自动进行类型转换。
(上面六个和c语言一样)
7.for-in语句
for-in语句是一种精准的迭代语句,可以用来枚举对象。
当迭代的对象变量是null或undefined时,会停止循环循环体。因此为保证兼容性,在使用for-in语句之前要保证该对象的值不是null或undefined.
for (var propName in window) { /*var保证使用了局部变量*/
document.write(propName);
document.write("<br />");
}
8.label语句
标签名:statement
label语句通常与for语句配合使用。
var num = 0;
outermost:
for (var i=0; i < 10; i++) {
for (var j=0; j < 10; j++) {
if (i == 5 && j == 5) {
break outermost; //直接退出最外层循环
}
num++;
}
}
alert(num); //55
var num = 0;
outermost:
for (var i=0; i < 10; i++) {
for (var j=0; j < 10; j++) {
if (i == 5 && j == 5) {
continue outermost;
}
num++;
}
}
alert(num); //95
9、with语句
将代码的作用于设置到一个特定的对象中。严格模式下不允许使用with语句。
七、函数
函数使用function来声明。
注:
- return可以不带返回值,即 return;这种情况函数会在停止循环后返回undefined。一般用于需要提前停止函数又不需要有返回值的情况。(推荐让函数始终都有返回值)
1.即便定义函数是只让接受两个参数,但你也可以接受一个、三个甚至更多。
<script type="text/javascript">
function aa(a,b){
alert(a); //输出1
alert(arguments[2]); //输出3
}
aa(1,2,3);
</script>
- 可以用length属性获得有多少个参数传递给了函数
function howManyArgs() {
alert(arguments.length);
}
howManyArgs("string", 45); //2
howManyArgs(); //0
howManyArgs(12); //1
- 没有传地址的命名参数自动被赋予undefined.
- arguments的值与命名参数保持一致,不论改变哪个,另一个都随之改变,但在严格模式下,对arguments赋值,命名参数不改变
2.没有重载
如果定义了两个同名的函数、那么这个名字只属于后定义的函数
第四章总结 (变量、作用域、内存)
一、执行环境和作用域
1.活动最开始质包含一个变量-- arguments对象。
2. 内部环境可以通过作用域链依次访问左右外部环境,但是外部环境不能访问内部环境中的任何变量 。(比如内部又有一个函数的话,就不能访问内部环境里的变量了)
3. JS没有块级作用域,在if或者for语句中定义的变量,出了if和for语句仍然可以访问。如果是在函数当中,那么该变量只会添加在当前环境中(即该函数内部),出了该函数不可以引用。
4. 检测该变量是什么基本类型用 typeof 变量;
判断该变量是不是某一种引用类型用 变量 instanceof 引用类型
第五章总结 (引用类型)
一、Object类型
1.定义格式
var o = new Object();
o.name = "123abc";
o.age = 12;
var o = {
name:"123abc",
age:12
};
2.访问属性
(1)对象 . 属性
(2)对象[ "属性 "] (属性名字中有空格时必须用第二种方法)
二、Array类型
1.创建数组
(1)通过Array构造函数
var colors = new Array(3); //创建包含三个元素的数组
var names = new Array("Greg"); //创建包含“Grey”一个元素的数组
(2)通过数组字面表示法
var colors = ["red", "blue", "green"]; //创建包含三个元素的数组
var names = []; //创建一个空数组
var values = [1,2,];
//别这么写,可能包含两个元素也可能包含三个元素
2.属性
(1)数组长度:==数组名 . length ==
(2)改变元素之间的分隔符:数组名 . join(“ || ”);
// red || green || blue
3.栈方法(后进后出)
(1)push ( ) 方法: 数组名 . push(“red”,“black”);
把元素一次加在数组末尾
(2)pop ( ) 方法: 数组名 . pop();
移除末尾最后一项
4.队列方法(先进先出)
(1)shift ( )方法:数组名 . shift();
移除数组第一项,并返回第一项
(2)unshift()方法:数组名 . unshift(“red”,“green”);
在数组首部添加元素
5.重排序
(1)把数组元素翻转:数组名 . reserve();
(2)升序排序:数组名 . sort(); (先把数组元素用toString方法转换成字符,再进行比较)
6.方法:
(1)var 变量名 = 数组名 . splice(1);
splice返回值为一个数组,新数组存的是原数组从第一位开始的元素
(2)var 变量名 = 数组名 . splice(1,4);
新数组存的是原数组从第一位开始到第四位(不包含第四位)的元素
(3)数组名 . indexof(元素名称);
找该元素名称在数组中的位置,indexof从前往后找;lastIndexof从后往前找,角标都一样
三、Date类型
1.创建一个日期和对象
var now = new Date();
2.方法:
Date.UTC();
Date.parse();
四、RegExp类型
ECMAScript通过该类型来支持正则表达式。
1.匹配模式
g : 全局模式,即该模式会被应用到所有字符串
i : 不区分大小写模式,在匹配项时忽略大小写
m : 多行模式,到该行行末时会继续下一行查找
五、Function类型
1.创建函数
//第一种
function 函数名(参数列表){
语句;
}
//第二种
var sum=function(参数列表){
语句;
};
//第三种,不推荐
var sum = new function("参数列表","返回值");
2.没有重载(相同的函数名,第二个会覆盖第一个)
3.直接用function声明函数,及时在声明前调用该函数也不会有错误;如果是用函数表达式,则必须在该表达式后再调用,否则会有错误。
4.函数内部有两个特殊的对象arguments 、 this
(1)arguments . callee指向拥有这个arguments对象的函数;arguments主要是保存函数参数;
如果一个函数内部又调用了当前函数,把内部调用的函数换成arguments.callee,那么如果这个函数的内容进行了改变,保存了原函数的变量仍然能够起到原函数的作用,后面的函数作用才会发生改变。
(2)this引用的是函数的执行对象。
6.一些方法和引用
(1).caller:指向调用当前函数的函数。
(2)length:返回当前函数形参的个数
7.基本包装类型(特殊的引用类型)
有Boolean、Number、String
(1)Boolean类型
建议不要用引用类型的Boolean对象
var booleanObject=new Boolean(false);
(2)Number类型
var numberObject=new Number(10);
可以使用toString()方法、toLocalString()方法、Valueof()方法、
toFixed(数字):可以保证数字后面的小数点位数
toExponential(数字):把数值进行e指数表示法,数字表示e 前面数字的小数点位数
toPrecision(数字):自动选择更合适的表示方法(小数点或者指数形式),数字表示所有位数
(3)String类型
var stringObject= new String('hello");
string 具有.length属性,返回字符串长度;
字符方法:
==charAt( 数字 ) ==:返回盖好数字所在位置的字符
carCodeAt(数字):返回该位置所在字符的ASCLL码
源字符串 . cancat(“字符串”):在源字符串末尾加新的字符串
原字符串 . slice(数字):从数字位置开始返回字符,如果是负数则加上字符串长度,开始返回
原字符串 . substring(数字):从数字位置开始返回字符,如果是负数则从0开始返回
原字符串 . substr(数字1,数字2):从数字位置开始返回字符,返回长度为 数字2 的字符串
reim(),删除前置和后置所有空格
toLowerCase(),toLocalLowerCase(),toUpperCase(),toLocalUpperCase():转换大小写字母
==原字符串 . localCompare(“要对比的字符串”):返回-1,0,1
六、单置内体对象
1.Global对象
(1)方法:
encodeURI(网址):不会对本身属于URI的特殊字符进行编码
encodeURICpomponent():会对本身属于URI的特殊字符进行编码
(2)eval():在eval中创建的任何变量或函数都不会被提升,因为在解析代码的时候它们被包含在每一个字符中。他们只在eval()执行时创建。
2.Math对象
min(数字1,数字2,…):返回最小的一位
max(数字1,数字2,…):返回最大的一位
apply(Math,values):找数组的最大或最小,Math.max.apply(Math,数组名);
random()返回随机数
第六章总结 (面向对象程序设计)
ECMAScript将对象定义为无序属性的集合,其属性可以包含基本值、对象或者函数。每个对象都是基于一个引用类型创建的,这个引用类型可以是第五章(引用类型那章)讨论的原生类型也可以是开发人员定义的类型。
一、理解对象
1.属性类型:
(1)数据属性:包含一个数据值得位置,该位置可以读取和写入值。
Configurable:能否通过delete删除属性从而重新定义属性 。
Enumerable:能否通过for-in循环返回属性
Writable:能否修改属性值
Value:包含这个属性 的数据值,读取或写入时都从这开始进行
(2)访问器 属性:
Configurable:能否通过delete删除属性从而重新定义属性 。
Enumerable:能否通过for-in循环返回属性
Get:在读取数据时调用的函数
Set:在写入函数时调用的函数
- 包含getter和setter函数。
getter:在读取访问器属性时,该函数负责返回有效的值
setter:在写入访问器属性时,该函数负责如何处理数据
二、创建对象
1.工程模式:使用简单函数创造对象、对对象添加属性和方法,然后返回对象
2.构造函数模式:通过创造自定义引用类型,可以像创建内置对象实例一样使用new操作符。
任何函数只要通过new操作符调用,就可以作为构造函数
comstructor用来标识对象类型
3.原型模式:使用prototype属性指定那些应该共享的属性和方法。
一旦创建了一个新函数就会有prototype属性,这个属性指向函数的原型对象。constructor指向prototype属性所在的指针。
可以通过isPrototypeOf()来判断是否有这样的关系爱存在
**hasOwnPropert()**来看某个属性是存在在实例中还是原型中。
三、继承
实例(指向)->原型对象(指向)->构造函数(包含)->原型对象
1.原型式继承
可以在不必预先构造函数的情况下实现继承
2.寄生式继承
基于某个对象或某些信息创建一个对象,然后增强对象最后返回对象。
3.寄生组合式继承
是基于类型继承的最有效方式。
第七章总结(函数表达式)
函数声明提升:在执行代码之前会先进行读取函数声明,这意味着函数声明可以在调用语句的后面。
一、闭包
定义了函数要调用才会执行啊!
1.函数的闭包:如果在一个内部函数里,对在外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就被认为是闭包。
2.如何创建闭包:
常见方式:在一个 函数内部 创建另一个函数。
例:
function createComparsionFunction(propertyName){
return function(object1,object2){
//下面这两行代码虽然在函数内部,
但是可以调用该函数外部的变量,即porpertyName
//之所以能访问是因为内部函数的作用域链包含了createComparsionFunction的作用域
var value1=object[propertyName];
var value2=object[propertyName];
if(value1<value2){
return -1;
}
else if(value1>value2){
return 1;
}
else{
return 0;
}
};
}
3.为什么要有闭包
由于作用域,我们无法在函数外访问函数里的变量,但我们有时又会需要使用,这时就可以用到闭包。
4.闭包的作用:
(1)可以读取整个父级作用域函数内部的变量。
(2)让这些变量的值始终保持在内存中。
(3)避免使用过多的全局变量,从而使得全局变量污染。
注意:
(1)闭包会携带包含它的函数的作用域,因此会比其他函数更占内存,过多使用闭包会使占用内存过大,从而在IE中可能导致内存泄露。因此在使用闭包后最好将当前不需使用的变量删除,如将这些值设为null,从而解除引用。
(2)闭包只能取得闭包函数中任何变量的最后一个值,前面的会与后面的值保持一致。
二、模仿块级作用域
Js没有会计作用域的概念。比如变量i是在某函数的if语句中定义的,那么在该函数中随处都可以调用。
//函数要带()转化为函数表达式
(function(){
//这里是块级作用域
})();
三、私有变量
JS中没有私有变量的概念,不过所有在函数内部定义的变量都可以当做私有变量。
特权方法:有权访问私有变量和私有函数的公有方法。比如使用this来访问属性。
闭包可以使用构造函数模式、原型模式来实现自定义特权的方法,也可以使用模块模式、增强的模块模式来实现单例的特权方法。