一、语法
ECMA的基础概念如下:
1、大小写区分
2、变量是弱类型的
3、没行结尾的分号可有可无
二、原始值和引用值
1、原始值:存储在栈中的简单数据段,它们的值是直接存储在变量访问的位置,这个和.net中的基本类型应该是差不多的
2、引用值:存储在堆中的对象,与.net中的引用类型差不多。
给变量赋值时,ECMAScript解释程序必须解释该值是否为原始类型,原始类型有5中: Null、Number、primitive type、String、Boolean
三、原始类型
3.1 typeof 运算符
对变量或值调用typeof返回下列值之一:
1、"undefined"
2、object
3、string
4、number
5、boolean
注意: 对于null值使用typeof返回的是object,这是当时ECMAScript实现的一个错误,后来沿用了这个错误
3.2 Undefined类型
是声明的变量未初始化时,该变量的默认值是undefined
注意,值undefined并不同于未定义的值。但是,typeof运算符并不真正区分这两种值。考虑下面的代码:
var otemp;
alert(typeof otemp); //输出undefined
alert(typeof otemp2); //输出undefined
这里typeof 并不区分这未定义和初始化的,但是对于未定义的进行运算符操作就会引起错误
var otemp;
alert(otemp==undefined) //output true
alert(otemp2==undefined) //error
3.3 Null类型
即使alert(null=undefined)输出是true,但是Null类型的值与undefined类型标识的含义不同,undefined表示的定义了但未初始化,而null则表示尚未存在的对象
3.4 Number类型
几个特殊的值用于Number类型,前两个是Number.MAX_VALUE和Number.MIN_VALUE,它们定义了number类型值得外边界。当计算大于MAX_VALUE时,就被赋予POSITIVE_INFINTY,当计算小于MIN_VALUE,就被赋予NEGATIVE_INFINTY.有专门的值表示为无穷大,就是INFINTY,负无穷就是-INFINTY.另外一个特殊值NaN,表示非数。
4、转换
4.1转换成字符串
对于所有对象都有toString()方法,toString()对于Number类型有两种形式一个是默认模式,另一个是基模式
默认模式,对于所有的number类型,转化为十进制的数字形式,对于基模式,选择相应的基数,其自动对其进行转换
var iNum=10;
alert.(iNum.toString(2) ) //output 1010
alert(iNum.toString(8) //output 10
alert(iNum.toString(16) // ouput A
4.2 转换成数字
提供了两种把非原始数字形式转化成数字的方法,即parseInt() 和parseFloat(),只有对string类型运用此方法才能运行,其他的都返回为NaN.
这里parseInt()与toString()一样可以指定基数。
var iNum=parseInt("10",2); //returns 2
var iNum=parseInt("10",8) //returns 8
var iNum=parseInt("10",10) //returns 10
5、引用类型
5.1 Object类型
ECMAScript中的所有类都由这个类继承而来,object类中的所有属性和方法都会出现在其他类中。Object类具有下面这些属性
- Constructor --对创建对象函数的引用
- Prototype --对该对象的对象原型的引用
Object具有的一些方法:
- HasOwnProperty(property) --判断是否具有某个属性
- IsPrototypeOf(object) --判断该对象是否为某个对象的原型
- PropertyIsEnumerable(property) --判断属性是否能够枚举
- ToString() --返回对象的原始字符串表示
- ValueOf() --返回最适合该对象的原始值
5.2 Boolean类型
下面只想说一个比较容易犯错的地方
var oFalseObject=new Boolean(false);
var bResult=oFalseObject && true //returns true
这是为什么呢? 对于这里false&&true应该是true,问题在于Boolean这里是对象,oFalseObject计算出来是true,所以是true&&true,结果当然是很true,因此为了避免这种情况,最好还是使用boolean的原始值,而使用这个对象来构造他
5.3Number类型
Number类型的一些方法
- toFixed() --具有指定位数小数的数字的字符串表示(参数:小数位数)
- toExponential() -- 返回用科学计数法表示的数字的字符串形式 (参数: )
- toPrecision() --根据最有意义的性形式来返回数字的预订形式或指数形式,参数指定的是数的数字总数(即有效数字) (参数:有效数字的位数)
5.4 String类型
方法:
- charAt() --根据参数中指定的返回字符串中的字符 (参数: 指定的位置)
- charCodeAt() --根据参数指定的返回字符串中的字符代码 (参数: 指定的位置)
- concat() --连接字符串 (参数: 需要连接的字符串)
- indexOf() --返回的是指定的字符子串中在另一个字符串中的位置,从开始查找,没有找到返回-1 (参数:查找的字符子串)
- lastIndexOf() --返回的是指定的字符子串中在另一个字符串中的位置,从末尾查找 ,没有找到返回-1 (参数:查找的字符子串)
- localCompare() --比较,若相同则返回0,大于返回1,小于返回-1
- substring() 返回指定字符串中部分字符串,指定一个或两个参数,第二个参数可选,第一个参数指定截取的起始位置,第二个参数结束位置(那个字符不包括在内),若没有则默认为字符串的长度
- slice() --返回指定字符串中部分字符串,指定一个或两个参数,第二个参数可选,第一个参数指定截取的起始位置,第二个参数结束位置(那个字符不包括在内),若没有则默认为字符串的长度
var str="hello world";
alert(str.substring(3)); //output 'lo world'
alert(str.slice(3)); //output 'lo world'
alert(str.substring(3,7)); //output 'lo w';
alert(str.slice(3,7)); //output 'lo w';
那么对于substring 和slice上面是一样的,只有对于当参数是负数时才有不同,对于负数参数,slice会用字符串的长度加上这个参数,而substring则使用0代替
alert(str.slice(-3)); //output 'rld'
alert(str.substring(-3)); //output 'hello world'
alert(str.substring(3,-4);// output 'hel'
alert(str.slice(3,-4)); //output 'lo w'
- toLowerCase() 、toUpperCase() 转换大小写
6、函数
函数是ECMAScript的核心,函数的一般声明形式
function functionName(arg1,arg2,arg3...){statement;}
如果函数无明确的返回值,或调用了没有参数的return语句,那么它真正返回的值是undefined.ECMAScript不支持重载,但是它用另外的方式来实现重载的功能
6.1 auguments对象
使用特殊对象auguments,开发者无需明确指出参数名,就能访问他们,auguments[0]就是第一个参数的值,还可以使用auguments.length检测传递给函数的参数个数。通过这样的方法就知道可以实现重载方法了,假设实现toString的重载方法
function toString() { if(auguments.length==0) { //todo:重载版本1 } else { switch(auguments[0]) { case 2: //todo:二进制字符串 。。。。//其他的一些相应实现 } } }
6.2 Function类
使用Function类创建函数的语法如下:
var function_name=new Function(arg1,arg2,functionbody);
这里每个参数的字符串。
这有助于理解函数只不过是一种引用类型
6.3闭包
闭包是指词法表示包括不必不必计算的变量的函数,也就是说,该函数能使用函数外定义的变量。如下一个里
var sMessage="hello world"; function sayHello() { alert(sMessage); }