◆语法
● 区分大小写
ECMAScript中的一切都区分大小写。
● 标识符
1:第一个字母必须是字母,下划线或$。
2:其他字符可以是字母,下划线,$,或数字。
●严格模式
1:要在整个脚本中启用严格模式,可以在顶部添加代码"use strict"
2:在函数内部的上方包含这条编译指令,也可以指定函数在严格模式下执行:
function doSometing(){
"use strict"
//函数体
}
----------------------------------------------------------------------------------------------------------------------------------------------------
◆变量
* ECMAScript中变量是松散类型的,可以用来保存任何类型的数据,换句话说,每个变量仅仅是一个用于保存值的占位符而已。
* 未经初始化的变量,会保存一个特殊值——undefined,ECMAScript也支持直接初始化变量: var message="hi";
* 用var定义的变量将成为定义该变量作用域中的局部变量。也就是说,如果在函数中使用var定义一个变量,那么这个变量在函数退出后会被销毁:
function test(){
var message="hi"; //局部变量
}
test();
alert(message); //错误!
* 省略var操作符,message就成了全局变量,这样,只要调用一次test()函数,这个变量就有定义,就可以在函数外部的任何地方访问到。
* var message="hi",found=false,age=29;
----------------------------------------------------------------------------------------------------------------------------------------------------
◆数据类型
* 5种简单数据类型(基本数据类型):Undefined、Null、Boolean、Number和String。
* 一种复杂数据类型————Object。
* ECMAScript不支持任何创建自定义类型的机制,所有的值最终都将是上述6种数据类型之一
●typeof操作符
typeof操作符的操作数可以是变量,也可以是数值字面量,它是一个操作符,可以typeof(a); 或typeof a;
注:函数在ECMAScript中是对象但是typeof会返回function类型。
●Undefined类型
1:Undefined类型只有一个值————undefined。
2:我们可以用undefined显式初始化一个变量。
3:对于未声明的变量,只能执行一项操作,即使用typeof操作符,返回undefined。
●Null类型
Null类型也是只有一个值的数据类型,就是null。从逻辑角度来看,null值表示一个空对象指针,typeof null 返回object
注:undefined值派生自null值,所以ECMAScript规定undefined==null返回true。
在保存对象的变量尚未保存真正的对象时,最好明确的让该变量保存null。
●Boolean类型
该类型只有两个字面值:true和false(必须小写)。
Boolean("test")转换成Boolean类型的值true。
●Number类型
1:字面量 :
var octalNum1=070; //八进制,56
var octalNum2=079; //无效的八进制,79
var octalNum3=08; //无效的八进制,8
八进制字面量在严格模式下是无效的,会导致支持该模式的JavaScript引擎抛出错误。
var hexNum1=0xA; //十六进制,10
var hexNum2=0x1f; //十六进制,31
字母可大写可小写。
* 在进行算术计算时,所有的八进制和十六进制表示的数值最终都将被转换成十进制数值。
* 浮点数值需要的内存是保存整数值的两倍,因此ECMAScript会不失时机的将浮点数值转化为整数值
* 关于e
var floatNum=3.125e7; //等于31250000 (e可大写)
var floatNum=3.14e-2; //等于0.0314 (e可大写)
* 数值范围
超出MAX_VALUE的值将被自动转换为Infinity,超出MIN_VALUE的值将被自动转换为-Infinity。
如果某次计算返回了Infinity或-Infinity,那么该值将无法继续参与下一次运算。
isFinite()函数可以判断数是否有穷。
●NaN
1:任何涉及NaN的操作都返回NaN。
2:NaN与任何值都不相等,包括NaN本身。
*isNaN()函数可以判断是否是NaN。
对于对象有两步,先调用valueof()方法再判断,如果还是NaN,调用toString()方法,再测试返回值。
●数值转换
Number() //用于任何数据类型。对于对象有两步,先调用valueof()方法再判断,如果还是NaN,调用toString()方法,再测试返回值。
parseInt() //用于字符串
parseFloat() //用于字符串
区别:1:Number('')为0 , parseInt('')为NaN
2:Number('070')为70 , ECMAScript3中parseInt('070')为56 , ECMAScript5中parseInt('070')为70。
使用两个参数 : parseInt('070',8);
parseFloat()只解析十进制,而且可以返回整数。
●String类型
String数据类型包含一些特殊的字符字面量,也叫转义序列,这些字符字面量可以出现在字符串的任何位置。
length属性返回长度。如果字符串中包含双字节字符,可能不会返回正确的值。(转义字符是单字节)
* 转换字符串
toString()方法,不需要传参,但在调用数值时,可以传参表示转换为的进制。不能转换null和undefined。
String()方法,可以转换null和undefined。
例:num.toString(); String(num);
●object类型
对象可以通过new操作符后跟要创建的对象类型的名称来创建。
Object的每个实例都具有下列属性和方法。
* constructor :保存着用于创建当前对象的函数。对于 var o=new Object() 而言,构造函数就是Object
* hasOwnproperty(proopertyName) :用于检查给定的属性在当前对象的实例中(而不是在实例的原型中)是否存在,例:o.hasOwnproperty("name")。、
* isPrototypeof(object) :用于检查传入的对象是否是当前对象的原型
* propertyIsEnumerable(propertyName) :用于检查给定的属性是否能用for-in 语句枚举
* toLocaleString() :返回对象的字符串表示,该字符串与执行环境的地区对应
* toString() :返回对象的字符串表示
* valueOf() :返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。
BOM和DOM中的对象都属于宿主对象,由宿主实现提供和定义,ECMA-262 不负责定义宿主对象,因此宿主对象可能不会继承Object
----------------------------------------------------------------------------------------------------------------------------------------------------
◆操作符
● 一元操作符
●位操作符(略) ----------p39
●布尔操作符 &&,||,!。
......
----------------------------------------------------------------------------------------------------------------------------------------------------
◆语句
● for-in 语句是一种精准的迭代语句,可以用来枚举对象属性。例:
for(var propName in window){
document.write(propName);
}
如果对象是null或undefined,则不执行循环体。
● label语句
例:
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
●with语句:将代码的作用域设置到一个特定对象中。 //不建议使用
●switch语句:
1:可以在switch语句中使用任何数据类型,无论是字符串,还是对象都没有问题
2:每个case值不一定是常量,可以是变量,甚至是表达式。
例:switch("a"+"b"){
case "ab":
.........
switch(true){
case num<0:
.........
注意:switch语句在比较值时使用的是全等操作符,因此不会发生类型转换,10!="10"。
----------------------------------------------------------------------------------------------------------------------------------------------------
◆函数
ECMAScript函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型。
在ECMAScript中参数在内部是用一个数组来表示的,函数接收到的始终是这个数组,而不关心数组中包含哪些参数。
如果这个数组中不包含任何元素,无所谓。如果包含多个元素,也没有问题。
在函数体内可以通过arguments对象访问这个参数数组
● arguments对象
arguments对象只是与数组类似(它并不是array实例),因为可以使用[]来访问它的每一个元素例:arguments[0];
* arguments.length 属性可以确定传进来了多少参数。
arguments的值始终与命名参数的值保持一致,但它们的内存空间是相对独立的。它们的值会同步。
没有传递值的命名参数会被赋值为undefined
function test(a,b){
arguments[1]=10;
alert(b);
}
test(1,2); //10
function test(a,b){
arguments[1]=10;
alert(b);
}
test(1); //undefined
●没有重载
ECMAScript函数不能实现重载,如果有两个名字相同的函数,则该名字属于后面定义的函数。
● 区分大小写
ECMAScript中的一切都区分大小写。
● 标识符
1:第一个字母必须是字母,下划线或$。
2:其他字符可以是字母,下划线,$,或数字。
●严格模式
1:要在整个脚本中启用严格模式,可以在顶部添加代码"use strict"
2:在函数内部的上方包含这条编译指令,也可以指定函数在严格模式下执行:
function doSometing(){
"use strict"
//函数体
}
----------------------------------------------------------------------------------------------------------------------------------------------------
◆变量
* ECMAScript中变量是松散类型的,可以用来保存任何类型的数据,换句话说,每个变量仅仅是一个用于保存值的占位符而已。
* 未经初始化的变量,会保存一个特殊值——undefined,ECMAScript也支持直接初始化变量: var message="hi";
* 用var定义的变量将成为定义该变量作用域中的局部变量。也就是说,如果在函数中使用var定义一个变量,那么这个变量在函数退出后会被销毁:
function test(){
var message="hi"; //局部变量
}
test();
alert(message); //错误!
* 省略var操作符,message就成了全局变量,这样,只要调用一次test()函数,这个变量就有定义,就可以在函数外部的任何地方访问到。
* var message="hi",found=false,age=29;
----------------------------------------------------------------------------------------------------------------------------------------------------
◆数据类型
* 5种简单数据类型(基本数据类型):Undefined、Null、Boolean、Number和String。
* 一种复杂数据类型————Object。
* ECMAScript不支持任何创建自定义类型的机制,所有的值最终都将是上述6种数据类型之一
●typeof操作符
typeof操作符的操作数可以是变量,也可以是数值字面量,它是一个操作符,可以typeof(a); 或typeof a;
注:函数在ECMAScript中是对象但是typeof会返回function类型。
●Undefined类型
1:Undefined类型只有一个值————undefined。
2:我们可以用undefined显式初始化一个变量。
3:对于未声明的变量,只能执行一项操作,即使用typeof操作符,返回undefined。
●Null类型
Null类型也是只有一个值的数据类型,就是null。从逻辑角度来看,null值表示一个空对象指针,typeof null 返回object
注:undefined值派生自null值,所以ECMAScript规定undefined==null返回true。
在保存对象的变量尚未保存真正的对象时,最好明确的让该变量保存null。
●Boolean类型
该类型只有两个字面值:true和false(必须小写)。
Boolean("test")转换成Boolean类型的值true。
●Number类型
1:字面量 :
var octalNum1=070; //八进制,56
var octalNum2=079; //无效的八进制,79
var octalNum3=08; //无效的八进制,8
八进制字面量在严格模式下是无效的,会导致支持该模式的JavaScript引擎抛出错误。
var hexNum1=0xA; //十六进制,10
var hexNum2=0x1f; //十六进制,31
字母可大写可小写。
* 在进行算术计算时,所有的八进制和十六进制表示的数值最终都将被转换成十进制数值。
* 浮点数值需要的内存是保存整数值的两倍,因此ECMAScript会不失时机的将浮点数值转化为整数值
* 关于e
var floatNum=3.125e7; //等于31250000 (e可大写)
var floatNum=3.14e-2; //等于0.0314 (e可大写)
* 数值范围
超出MAX_VALUE的值将被自动转换为Infinity,超出MIN_VALUE的值将被自动转换为-Infinity。
如果某次计算返回了Infinity或-Infinity,那么该值将无法继续参与下一次运算。
isFinite()函数可以判断数是否有穷。
●NaN
1:任何涉及NaN的操作都返回NaN。
2:NaN与任何值都不相等,包括NaN本身。
*isNaN()函数可以判断是否是NaN。
对于对象有两步,先调用valueof()方法再判断,如果还是NaN,调用toString()方法,再测试返回值。
●数值转换
Number() //用于任何数据类型。对于对象有两步,先调用valueof()方法再判断,如果还是NaN,调用toString()方法,再测试返回值。
parseInt() //用于字符串
parseFloat() //用于字符串
区别:1:Number('')为0 , parseInt('')为NaN
2:Number('070')为70 , ECMAScript3中parseInt('070')为56 , ECMAScript5中parseInt('070')为70。
使用两个参数 : parseInt('070',8);
parseFloat()只解析十进制,而且可以返回整数。
●String类型
String数据类型包含一些特殊的字符字面量,也叫转义序列,这些字符字面量可以出现在字符串的任何位置。
length属性返回长度。如果字符串中包含双字节字符,可能不会返回正确的值。(转义字符是单字节)
* 转换字符串
toString()方法,不需要传参,但在调用数值时,可以传参表示转换为的进制。不能转换null和undefined。
String()方法,可以转换null和undefined。
例:num.toString(); String(num);
●object类型
对象可以通过new操作符后跟要创建的对象类型的名称来创建。
Object的每个实例都具有下列属性和方法。
* constructor :保存着用于创建当前对象的函数。对于 var o=new Object() 而言,构造函数就是Object
* hasOwnproperty(proopertyName) :用于检查给定的属性在当前对象的实例中(而不是在实例的原型中)是否存在,例:o.hasOwnproperty("name")。、
* isPrototypeof(object) :用于检查传入的对象是否是当前对象的原型
* propertyIsEnumerable(propertyName) :用于检查给定的属性是否能用for-in 语句枚举
* toLocaleString() :返回对象的字符串表示,该字符串与执行环境的地区对应
* toString() :返回对象的字符串表示
* valueOf() :返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。
BOM和DOM中的对象都属于宿主对象,由宿主实现提供和定义,ECMA-262 不负责定义宿主对象,因此宿主对象可能不会继承Object
----------------------------------------------------------------------------------------------------------------------------------------------------
◆操作符
● 一元操作符
●位操作符(略) ----------p39
●布尔操作符 &&,||,!。
......
----------------------------------------------------------------------------------------------------------------------------------------------------
◆语句
● for-in 语句是一种精准的迭代语句,可以用来枚举对象属性。例:
for(var propName in window){
document.write(propName);
}
如果对象是null或undefined,则不执行循环体。
● label语句
例:
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
●with语句:将代码的作用域设置到一个特定对象中。 //不建议使用
●switch语句:
1:可以在switch语句中使用任何数据类型,无论是字符串,还是对象都没有问题
2:每个case值不一定是常量,可以是变量,甚至是表达式。
例:switch("a"+"b"){
case "ab":
.........
switch(true){
case num<0:
.........
注意:switch语句在比较值时使用的是全等操作符,因此不会发生类型转换,10!="10"。
----------------------------------------------------------------------------------------------------------------------------------------------------
◆函数
ECMAScript函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型。
在ECMAScript中参数在内部是用一个数组来表示的,函数接收到的始终是这个数组,而不关心数组中包含哪些参数。
如果这个数组中不包含任何元素,无所谓。如果包含多个元素,也没有问题。
在函数体内可以通过arguments对象访问这个参数数组
● arguments对象
arguments对象只是与数组类似(它并不是array实例),因为可以使用[]来访问它的每一个元素例:arguments[0];
* arguments.length 属性可以确定传进来了多少参数。
arguments的值始终与命名参数的值保持一致,但它们的内存空间是相对独立的。它们的值会同步。
没有传递值的命名参数会被赋值为undefined
function test(a,b){
arguments[1]=10;
alert(b);
}
test(1,2); //10
function test(a,b){
arguments[1]=10;
alert(b);
}
test(1); //undefined
●没有重载
ECMAScript函数不能实现重载,如果有两个名字相同的函数,则该名字属于后面定义的函数。