基本类型
基本数据类型:Number,String,Boolean,Null,undefined。混合数据类型:object
引用数据类型:Array,Date,RegExp,Function
typeof数据类型:object,number,function,boolean,undefined
ECMAScript变量包括两种不同数据类型的值:基本类型值和引用类型值。
基本类型值:简单的数据段
引用类型值:指可能由多个值构成的对象;引用类型的值是保存在内存中的对象。
JavaScript不允许直接访问内存中的位置,也就是说,不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际对象。
引用类型
引用类型的值(对象)是引用类型的一个实例。
引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。
新对象是使用new操作符后跟一个构造函数来创建的。构造函数本身就是一个函数,只不过该函数是出于创建新对象的目的而定义。(Array类型请见另一篇文章)
object类型
object类型 原生引用类型
大多数引用类型值都是object类型的实例;
创建object实例的方式有两种:
1.使用new操作符后跟Object构造函数 var person = new Object();
2.对象字面量表示法。是对象定义的一种简写形式,简化创建包含大量属性的对象的过程。
var person = {“name”:“ABC”};
在使用对象字面量语法时,属性名也可以使用字符串
var person = {“name”:“ABC”,“age”:29,5:true};5也会自动转为字符串
一般来说,访问对象属性时使用的都是点表示法,JavaScript也可以使用方括号表示法来访问对象的属性。方括号语法的优点是可以通过变量来访问属性。建议使用点表示法
var propertype = “name”;
alert(person[propertype]);“ABC”
Date类型
Date类型使用自UTC 1970年1月1日午夜(零时)开始经过的毫秒数来保存日期
Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数
Date.parse()方法的行为因实现而异,而且通常是因地区而异
美国: “月/日/年” “英文月,日,年” “英文星期几 英文月 日 年 时:分:秒 时区”
var someDate = new Date(Date.parse(“May 25,2004”));
var someDate = new Date(“May 25,2004”); 等价,后台自动调用Date.parse()
Date.now()方法,返回表示调用这个方法时的日期和时间的毫秒数。
例:
var start = Date.now(); //取得开始时间
dosomething(); //调用函数
var stop = Date.now(); //取得停止时间或 var stop = + new Date();
result = stop - start; 在不支持它的浏览器中,使用+操作符获取Date对象时间戳
RegExp类型(本地对象)
- var expression = /pattern/flags; 字面量形式来定义的正则表达式
flags:标明正则表达式的行为
g:表示全局模式。即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止
i:表示不区分大小写模式
m:表示多行模式
与其他语言中的正在表达式类似,模式中使用的所有元字符都必须转义。
正则表达式中元字符:( [ { \ ^ $ | ) ? * + . ] } - 使用RegExp构造函数,两个参数:要匹配的字符串模式,可选的标志字符串
var pattern = new RegExp("\[bc\at",“i”);
RegExp对象的主要方法是exct(),专门捕获组而设计的
第二个方法是test(),接收一个字符串参数,在模式与该参数匹配的情况下返回true。
Function类型
函数实际上是对象
由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定
-
函数声明语法
function sum(num1,num2){
return num1+num2;
} -
函数表达式定义函数
var sum = function(num1,num2){
return num1 + num2;
} -
使用function构造函数,可以接收任意数量参数,最后一个参数是在被看成函数体
var sum = new Function(“num1”,“num2”,“return num1+num2”);不推荐
由于函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没什么不同。
一个函数肯会有好几个名字
function sum(num1,num2){
return num1+num2;
}
alert(sum(10,10));//20
var anotherSum = sum;
alert(anotherSum(10,10));//20
sum = null;
alert(anotherSum(10,10));//20
声明变量anotherSum,并将其设置为与sum相等(将sum的值赋给anotherSum),注意!使用不带圆括号的函数名是访问函数指针,而非调用函数。此时,anotherSum和sumd都指向同一个函数,sum设为null,也不影响anothersum。
没有重载
声明两个同名函数,而结果则是后面的函数覆盖了前面的函数
原始数据类型和引用数据类型的区别
存储位置不同
原始数据类型直接存储在栈中的简单数据段,占据空间小,大小固定,属于被频繁使用的数据,所以放入栈中存储
引用数据类型存储在堆中的对象,占据空间大,大小不固定,如果存储在栈中,将会影响程序运行的性能,引用数据类型在栈中存储指针,改指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索栈中的地址,取得地址后从堆中获得实体。
定义基本类型值和引用类型值得方式是类似的:创建一个变量并为该变量赋值,当这个值保存到变量中以后,对不同类型值可执行的操作大相径庭。对于引用类型的值,可以为其添加属性和方法,也可以改变和删除其属性和方法。
基本包装类型
为了方便操作基本类型值。ECMAScript提供了3个特殊的引用类型:Boolean,Number和String
var s1 = “some text”;
var s2 = s1.substring(2);
基本类型值不是对象,逻辑上它们不应该有方法。
当第二行代码访问s1时,访问过程处于一种读取模式,也就是要从中读取这个字符串的值。而在读取模式中访问字符串时,后台都会自动完成下列处理。基本的字符串值就变得跟对象一样了。
1.创建String类型的一个实例
2.在实例上调用指定的方法
3.销毁这个实例
var s1 = new String(“some text”);
var s2 = s1.substring(2);
s1 = null;
Number类型
toString()方法传递一个表达基数的参数,告诉它返回几进制数值的字符串形式。
var num = 10;
alert(num.toString());//“10”
alert(num.toSting(2));//“1010” 2进制
toFixed()按照指定的小数位返回数值的字符串表示
alert(num.toFixed(2));//“10.00”
var num = 10.005;
alert(num.toFixed(2));//"10.01"自动舍入
String类型
每个实例都有一个length属性
字符方法
两个用于访问字符串中特定字符的方法:charAt()和charCodeAt()
charAt()方法以单字符字符串的形式返回给定位置的那个字符
var stringvalue = “hello world”;
alert(stringvalue.charAt(1));//“e”
charCodeAt() 得到的是字符编码
alert(stringvalue.charCodeAt(1));//“101”
可以使用方括号加数字索引来访问字符串的特定字符
alert(stringvalue[1]);//“e” IE7以前返回undefined
字符串操作方法
-
concat()方法 将一或多个字符串拼接起来,返回拼接得到的新字符串
var result = stringvalue.concat("!"); 可接受多个参数,不影响原来字符串
alert(result);//“hello world!”
拼接字符串更多还是加号操作符(+) -
ECMAScript提供了三个基于子字符串创建新字符串的方法:slice(),substr(),substring()都会返回被操作字符串的一个子字符串,而且也都接受一或两个参数,不会修改字符串本身
- 第一个参数指定子字符串的开始位置,slice()和substring()的第二个参数指定的子字符最后一个字符串后面的位置,而substr()的第二个参数指定的而是返回的字符个数
- 参数是负值
slice()方法会将传入的负值与字符串的长度相加,
substr()方法将负的第一个参数加上字符串的长度,将负的第二个参数转换为0,,
substring()方法会把所有的负值参数转为0
-
字符串位置方法
从字符串查找字符串的方法:indeOf()和lastIndexOf()返回子字符串的位置
都可以接受可选的第二个参数,表示从字符串中的哪个位置开始搜索 -
tirm()方法
创建一个字符串的副本,删除前置及后缀的所有空格,然后返回结果
var str = " hello ";alert(str.trim());//“hello” -
字符串大小写转换方法
toLowerCase(),toLocaleLowerCase(),toUpperCase(),toLocaleUpperCase() -
字符串的模式匹配方法
-
match() 本质与调用RegExp的exec()方法相同,只接受一个参数正则表达式/RegExp对象
var text = “cat,bat,sat,fat”;
var pattern = /.at/; //与pattern.exec(text);相同
var matches = text.match(pattern);
alert(matches.index); //0
alert(matches[0]); //“cat”
alert(pattern.lastIndexOf());// “0” -
查找模式的方法是search()
返回字符串中的第一个匹配项的索引
var text = “cat,bat,sat,fat”;
var pos = text.search(/at/);
alert(pos);//"at"在字符串中第一次出现的位置 -
replace()方法
两个参数,RegExp对象或一个字符串,一个字符串或一个函数
var text = “cat,bat,sat,fat”;
var result = text.replace(/at/g,“ond”);
alert(result);//“cond”,“bond”,“sond”,“fond” -
split()方法
指定的分隔符将一个字符串分隔成多个子字符串,并将结果放在一个数组中,分隔符可以是字符串,也可以是一个RegExp对象,2个参数可选指定数组的大小
var colorText = “red,blue,green,yellow”;
var color1 = colorText.split(",");//[“red”,“blue”,“green”,“yellow”]
var color2 = colorText.split(",",2);//[“red”,“blue”]
-
localeCompare()方法,比较两个字符串,按字母表中排序规则
-
formCharCode()方法,接收一或多个字符编码,然后将它们转换成一个字符串,charCodeAt()执行的是相反的操作
引用类型与基本包装类型的主要区别是对象的生存期
使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后,立即被销毁。这意味着我们不能再运行时为基本类型值添加属性和方法。
对基本包装类型的实例调用typeof会返回"object",所有基本包装类型的对象都会被转换为布尔值true。
单体内置对象 (gload,Math不可以实例化的)
ECMAScript-262定义:由EXMAScript实现提供的,不依赖于宿主环境的对象,这些对象这些对象在ECMAScript程序执行之前就已经存在了。Global和Math
所有在全局作用域中定义的属性和函数,都是Global对象的属性
-
URI编码方法
Global对象的encodeURI()和encodeURIComponent()方法可以对URI(通用资源标识符)进行编码,以便发送给浏览器 -
eval()方法
eval()方法就像是一个完整的ECMAScript解析器,它只接受一个参数,要执行的ECMAScript(或JavaScript)字符串
eval("alert(“hi”));等价于alert(“hi”);
eval()执行的代码可以引用在包含环境中定义的变量
var msg = “hello world”;eval(“alert(msg)”);//“hello world”
eval()中创建的任何变量或函数都不会被提升,因为解析代码的时候,它们被包含在一个字符串中,只在eval()执行的时候创建
window对象
ECMAScript没有指出如何直接访问Global对象,但Web浏览器都是将这个全局对象作为window对象的一部分加以实现的,因此,在全局作用域中,声明的所有变量和函数,就都成了window对象的属性。
另一种取得Global对象方法
var global = function(){
return this;
}();
立即执行函数,返回this值,没有给函数指明指定this值得情况下,this值等于Global对象
Math对象
-
min()和max()方法
要找到数组中最大或最小值,如下:
var val = [1,2,3,4,5,6,7,8];
var max = Math.max.apply(Math,val);
把Math对象作为apply的第一个参数,从而正确设置this值 -
舍入方法
Math.ceil() 向上舍入 Math.ceil(25.9);//26
Math.floor() 执行向下舍入 Math.floor(25.9);//25
Math.round() 标准舍入 25.9->26 25.5->26 25.1->25 -
rondom()方法
返回大于等于0小于1的一个随机数
值 = Math.floor(Math.random() * 可能值得总数 + 第一个可能的值)
1到10之间 var num - Math.float(Math.random() * 10 + 1)
复制变量值
如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到新变量分配的位置上。
当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份到新变量分配空间中。不同的是,这个值得副本是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上引用同一个对象,因此,改变其中一个变量,就会影响另一个变量。
例:
- var num1 = 5; var num2 = num1;
num1中保存的值为5,Num1的值来初始化num2时,num2中也保存了值5,但num2中的5与num1中的5是完全独立的,该值只是num1中5的一个副本。此后两个变量可以参与任何操作而不会相互影响。 - var obj = new Object();var obj2 = obj1;obj1.name = “ABC”;alert(obj2.name);//“ABC”
obj1保存一个对象的新实例,这个值被复制到obj2,obj1,obj2都指同一个对象。obj1添加name属性,obj2也可以访问这个属性。
此文来源于《JavaScript高级程序设计》的总结摘取