1.Object类型:
创建实例的两种方式:new操作符和对象字面量表示法,比较推荐字面量表示法,因为代码量少,且有了封装数据的感觉,也是向函数传递大量可选参数的首选方式。
//方法1 new操作符
var person = new Object();
person.name = "haha";
person.age = 20;
//方法2 对象字面量表示法
var person2 = {
name : "haha",
age : 20
}
(通过对象字面量定义对象时,实际上不会调用Obect构造函数)访问对象的属性有两种方式:1.点表示法 2.方括号表示法 || 方括号表示法的优点是可以通过变量来访问属性,且属性名包含特殊字符用点语法会导致错误时也可用方括号表示法。除非必要情况否则建议用点表示法。
alert(person.name);
alert(persoon["name"]);
//通过变量访问属性
var propertyname = "name";
alert(person[propertyname]);
//属性名包含特殊字符
person["first name"] = "haha";//属性名包含空格
2.Array类型
javascript数组特点:1.数组每一项可以保存任何类型数据。2.数组大小可以动态调整,随着数据添加自动增长。
创建数组两种方式:1.Array构造函数 2.数组字面量表示法(不会调用Array构造函数)
//构造函数
var colors = new Array();
var colors = new Array(20);//预先知道数组大小,将数组大小传给构造函数,创建length为20的数组
var colors = new Array("red","blue","green");//创建包含指定值的数组
//数组字面量表示法
var names = [];//创建空数组
var colors = ["red","blue","green"];
数组的项数保存在length属性中,这个属性不是只读的,可以通过设置此属性来删除和增加数组项。利用length可以方便的在数组末尾添加新项。数组最多可包含4,294,967,295个项
检测数组:两种方法,1.instanceof检测:value instanceof Array。在网页中存在多个框架,在不同框架之间传递数组时会存在问题。2.Array.isArray()方法:为解决方法一存在的问题,Array.isArray(value)
转换方法:toString()返回由数组每项的字符串形式拼接成的以逗号分割的字符串。valueOf()返回数组本身,toLocaleString()基本上返回与toString()同样的值,不同的在于toLocaleString()调用数组每一项的toLocaleString()方法。join()方法,使用不同的分隔符构建数组字符串。(js高级程序设计 第三版 P89)
栈方法:push(),接收任意数量参数,逐个添加到数组末尾,返回修改后数组的总长度
pop(),从数组末尾移除一项,返回被移除的值
队列方法:shift(),移除数组中的第一个项并返回该项。结合push()方法可像使用队列一样使用数组。
unshift(),在数组前端任意添加多项,返回新数组长度。结合pop()可模拟反队列。
重排序方法:reverse(),反转数组项的顺序
sort(),升序排列数组项。调用每一项的toString()方法,然后比较得到的字符串。即使每一项都是数值,比较的也是字符串。->会导致排序出问题。如var value = [0,1,5,10,15],执行value.sort()后变为[ 0,1,10,15,5 ]
为解决这个问题,sort()方法接收一个比较函数作为参数。比较函数接收两个参数,如第一个参数在第二个参数之前则返回负数,否则返回整数,相等返回0。
function compare(value1,value2) {
if(value1 < value2) return -1;
else if(valu1 > value2) return 1;
else return 0;
}
var values = [0,1,5,10,15];
values.sort(compare);
console.log(values);
对于数值类型,可用一个简单的比较函数
function compare(value1,value2) {
return value2 - value1;
}
操作方法:concat(),基于当前数组中的所有项创建新数组,返回一个新数组,原数组不变
slice(),接收一个或两个参数,一个参数返回指定位置到数组末尾所有项,两个参数返回指定开始位置到指定结束位置的项,不包括结束位置的项
splice(),删除:两个参数,起始项和要删除的项数 ; 插入:三个参数,起始位置,0(要删除0项),要插入的项 ; 替换:三个参数,起始位置,要删除的项数,要插入的任意数量的项 splice()始终返回一个数组,包含从原数组删除的项,若未删除则返回空数组。
位置方法:比较时用全等操作符,没找到返回-1
indexOf():从数组的开头向后查找
lastIndexOf():从数组的末尾开始查找
迭代方法:every():对数组每一项运行给定函数,如果函数对每一项都返回true,则返回true
some():对数组每一项运行给定函数,如果函数对任意一项都返回true,则返回true
filter():对数组每一项运行给定函数,返回 该函数会返回true的项 组成的数组
forEach():对数组中的每一项运行给定函数,无返回值
map():对数组中的每一项运行给定函数,返回 每次函数调用的结果 组成的数组
这些方法调用的给定函数包含三个参数function(item,index,array)
归并方法:迭代数组所有项,构建一个最终返回的值。接收两个参数,一个在每一项上调用的函数 和 作为归并基础的初始值。调用函数接收四个参数,前一个值,当前值,项索引,数组对象。函数返回的任何值作为第一个参数传给下一项。
reduce():从数组第一项开始向后遍历
reduceRight():从数组最后一项开始向前遍历
3.Date类型
创建日期对象:var now = new Date();构造函数不含参数情况下,自动获取当前日期和时间。含参数时必须传入自UTC时间到指定时间经过的毫秒数,为简化操作制定Date.parse()和Date.UTC()来返回毫秒数。实际上Date()构造函数会根据参数自动在后台调用这两种方法。Date.now()方法,返回调用这个方法时的日期时间的毫秒数。
继承的方法:toLocaleString()和toString()返回字符串,valueOf()返回日期的毫秒数
日期格式化:。。。
组件方法:getTime()返回日期的毫秒数;getFullYear()取得四位数的年份;getMonth()返回日期中的月份,0表示一月;getDate()返回天数;getDay()返回星期几,0表示星期日;getHours()返回小时,0到23;getMInutes()返回分钟0到59;getSeconds()返回秒数0到59
4.Function类型
函数是对象,每个函数是Function类型的实例。函数名是指向函数对象的指针。定义函数的三种方式:1.函数声明 2.函数表达式 3.构造函数
//1 函数声明
function sum(num1,num2) {
return num1 + num2;
}
//2 函数表达式
var sum = function(num1.num2) {
return num1 + num2;
}
//3 不推荐使用,但有助于理解 函数是对象,函数名是指针
var sum = new Function("num1","num2","return num1 + num2");
函数声明和函数表达式的区别:解析器会率先读取函数声明,使其在执行任何代码之前可以访问。->代码在开始执行之前,解析器通过一个函数声明提升 的过程将函数声明添加到执行环境。 而使用函数表达式则没有此过程,可能会导致出错。
没有重载 (从函数名是指针的角度理解)
函数的内部属性:有两个特殊的对象,arguments和this。arguments是一个类数组对象,包含传入函数中的所有参数。arguments对象有一个名为callee的属性,callee是一个指针,指向拥有这个arguments对象的函数。
function factorial(num) {
if(num <= 1) { return 1; }
else { return num * factorial(num - 1); }
}
这个函数的执行与函数名factorial紧密耦合在一起,一旦函数名改变,函数内部代码也要改变。为消除这种耦合,可以用 return num *arguments.callee(num - 1)。this引用的是函数执行的环境对象。ES5中规范了另一个函数对象的属性caller。caller属性中保存着 调用当前函数的函数 的引用。(严格模式下,访问arguments.callee会报错)
函数的属性和方法:每个函数包含两个属性length和prototype。length属性保存函数 !希望! 接收的命名参数的个数。注意是希望接收的而不是实际接收的,与arguments.length不一样。prototype:对ES中的引用类型来说,prototype保存他们所有实例方法。简单说,toString()方法等实际上都保存在prototype名下。在创建自定义引用类型和实现继承时,prototype属性极为重要。ES5中prototype属性是不可枚举的,使用for-in无法访问。//----//每个函数包含两个非继承来的方法apply()和call()。这两个方法都是用于在特定的作用域中调用函数。apply()接收两个参数,一个是 在其中运行函数的作用域,一个是参数数组。call()的第一个参数也是作用域,后面的参数必须一一列举出来。这两种方法真正强大的地方在于能扩充函数赖以运行的作用域。-->好处:对象和方法不需要任何耦合关系。
window.color = "red";
var o = { color : "blue" };
function getColor() { alert(this.color); }
getColor();//red
getColor.call(window);//red
getColor.call(o);//blue
另外还有一个bind()方法。这个方法创建一个函数实例,将其this值绑定到传给bind()函数的值。
window.color ="red";
var o = { color : "blue" };
function getColor() {alert(this.color); }
var objectGetColor = getColor.bind(o);
objectGetColor();//blue
5.基本包装类型
为了便于操作基本类型值,ES提供了三个特殊的引用类型:Boolean,Number,String。每当读取一个基本类型值时,后台就会创建一个对应的基本包装类型的对象。在访问字符串变量时,处于一种读取模式,后台自动完成一些处理过程:a.创建String类型的实例->b.在实例上调用指定方法->c.销毁这个实例 引用类型和基本包装类型区别:对象的生存期。new操作符创建的引用类型的实例在执行流离开作用域前一直保存在内存中,而自动创建的基本包装类型的对象只存在于一行代码执行的瞬间。
Boolean:布尔表达式中所有对象都会被转换为true。建议永远不要用Boolean对象。
Number类型:重写继承的方法,valueOf()返回对象表示的基本类型数值,toLocaleString()和toString()返回字符串表示。其他数值格式化方法:toFixed():按指定小数位返回数值的字符串表示。(参数:输出结果中的小数位数)toExponential():返回指数e表示法表示的数值的字符串形式。(参数:输出结果中的小数位数)toPrecision():返回某数值的最合适的格式。(参数:数值的所有数字位数)
String类型:length属性:表示字符串中包含多少字符。即使字符串中包含双字节字符,每个字符也算一个字符。
字符方法:charAt():返回基于0的给定位置的单字符。charCodeAt():返回字符的字符编码。
字符串操作方法:concat():用于将一个或多个字符串拼接起来。返回新字符串。(实际用的更多的是加号操作符 +)
三个基于子字符串创建新字符串的方法:slice(),substr(),substring()。返回子字符串,接收一两个参数,第一个参数指定字符串开始位置,第二个参数指定到哪结束,slice和substring指定的是子字符串最后一个字符后面的位置,substr指定的是返回的字符个数。未指定第二参数将字符串长度作为结束位置。
字符串位置方法:indexOf()和lastIndexOf()可指定第二参数,指定从哪个位置开始搜索。
trim()方法:删除前置及后缀的所有空格,返回结果,原字符串不变。(非标准方法:trimLeft() 和 trimRight() )
大小写转换:经典方法:toLowerCase(),toUpperCase() 针对特定地区的实现:toLocaleLowerCase(),toLocaleUpperCase(),建议在不知道代码将在哪种语言环境中运行的情况下使用地区方法更稳定。
模式匹配方法:
localeCompare()方法:比较两个字符串,若字符串在字母表中顺序在参数前,返回-1,在后返回1,相等返回0。
fromCharCode()方法:接收字符编码,将其转换为字符串。
HTML方法:不建议使用,无法表达语义。
6.单体内置对象
内置对象定义:由ES实现、提供的,不依赖于宿主环境的对象,在ES程序执行之前就已经存在。如Object,Array,String,另外还有Global和Math。
Global对象:不属于任何其他对象的属性和方法,都是Global的属性和方法,事实上没有全局变量和全局函数,所有在全局作用域中定义的属性和函数都是Global的属性。
URI编码方法:encodeURI()和encodeURICompoent(),对URI进行编码,以便发送给浏览器。encodeURI主要用于整个URI,encodeURICompoent主要用于URI中的某一段。
decodeURI()和decodeURICompoent()。
eval()方法:最强大的方法,像是一个完整的ES解析器。接收一个参数,作为要执行的ES字符串。(作用域相同) 在eval中创建的变量和函数不会被提升。严格模式下外部访问不到eval中创建的变量和函数。(能够解释代码字符串的能力很强大也很危险,特别是在用它执行用户输入数据的情况下,否则会有安全问题)
Math对象:min()和max()方法
var max = Math.max(12,56,45,21,6);
//小技巧
var num = [12,56,12,956,112,12,1];
var max = Math.max.apply(Math,num);
Math.ceil()、Math.floor()、Math.round()。
random()方法:Math.random()返回>=0,<=1的一个随机数。value = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值 );