ECMAscript到底是什么?它和JavaScript的关系?(这个概念我也是百度的)
要讲清楚这个问题,需要回顾历史。1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言成为ECMAScript,这个版本就是1.0版。
该标准从一开始就是针对JavaScript语言制定的,但之所以不叫JavaScript,有两个原因。一是商标,Java是Sun公司的商标,根据授权协议,只有Netscape公司可以合法地使用JavaScript这个名字,且JavaScript本身也已经被Netscape公司注册为商标。二是想体现这门语言的制定者是ECMA,不是Netscape,这样有利于保证这门语言的开放性和中立性。
因此,ECMAScript和JavaScript的关系是,前者是后者的规格(标准),后者是前者的一种实现(另外的ECMAScript方言还有Jscript和
ActionScript)。在日常场合,这两个词是可以互换的。
如果通过<script>元素包涵外部javascr文件,那么src属性是必须的。
把javascript 插入到html中要使用<script>
异步脚本:
async属性 的目的是为了不让页面等待两个脚本下载和执行,从而一部加载页面的其他内容,异步脚本一定会在页面的load事件前执行。 可以表示当前脚本不用等待其他脚本,也不必阻塞文档呈现,但不能保证异步脚本按照他们在
页面中出现的顺序执行
<script type="text/javascript"><![CDATA[
function compare(a,b)
{
}
]]></script>
CData片段事文档中的一个特殊区域 这个区域可以包含不需要解析任意格式的文本内容,所以在CData片段中就可以使用任何字符--小于号当然也是
可以的,而且不会有语法错误 如果在不兼容xhtml的浏览器中 不支持CData片段就就可以用//来注释掉
在不支持<script>的浏览器中 可以选择<!--
<script></script>
不过现在所有的浏览器都已经支持javascript 所以 就没再必要使用这种格式了
文档模式也都是必备的
如:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
就是过渡型
<body>
<noscript>
<p>本网页需要浏览器支持(启用)javascript
</noscript>
</body> 当浏览器不支持脚本,或者浏览器支持脚本,但是脚本被禁用的时候 会显示<noscript>中的信息
需要注意的是:
在包含外部javascript文件时,必须将src属性设置为指向相应文件的URL
所有<script>元素都是按照他们再页面中出现的先后顺序依次被解析。在没有defer和async属性的情况下,只有在解析玩前面的<script>元素中的代码之后,才会解析后面<script>元素中的代码.
<script>引用外部js文件时,必须是<script ...></script>标记格式,不要采取省略形式。
现代的web应用程序一般把全部javascript引用都放在<body>元素中页面内容的后面,因为代码都是从上往下解析的,如果javascript引用放在head
则网页出现空白页面的时间增长
延迟脚本:
defer是延迟脚本的属性 设置defer=“defer” 是为了让脚本延迟到整个页面都解析完毕后运行,意思就是相当于告诉浏览器立即下载,但延迟执行。 延迟脚本总是按照他们的顺序执行
最好只包含一个延迟脚本 还有defer属性只适用于外部脚本文件。
<noscript>可以指定在不支持脚本的浏览器中显示的替代内容 ,但是启动了脚本的情况下,浏览器不会显示<script>元素中的任何内容
区分大小写的
标识符的第一个字符必须是字母.下划线或者$符号
采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的首字母大写
不能把关键字,保留字,true,false和null作为标识符
单行注释
多行注释
语句结尾的分号虽然不是必需的,但是建议不要忽略它
在控制语句中使用代码快可以使编程意图更加清晰
比如
if(test){
alert("sdf");
}
变量是松散类型 意思就是 定义变量时使用var操作符
var message="hi";
可以 message=10; 有效但是不推荐
还有var定义的是局部变量 比如在一个函数中用var定义了一个变量,那么这个变量在函数退出后就会被销毁
如果 在一个函数中省略var 定义了一个变量 则这个变量就是全局变量 只要调用一次函数 这个变量就有了定义,就可以在函数外部的任何地方被访问到. 但是不推荐,因为在局部作用域定义的全局变量很难维护
可以用一条语句定义多个变量.如:
var message="hi",
found=false,
age=29; 定义并初始化了三个变量,因为是松散类型,所以 使用不同类型初始化变量的操作可以放在一条语句来完成.
数据类型有 Undefined ,Null,Boolean,Number,String和一种复杂的数据类型--Object
typeof是负责检测给定变量的数据类型
对一个值使用typeof可能返回下列字符串
undefined---这个值未定义 使用var声明变量,但是未对其加以初始化时,这个变量的值就是undefined
boolean---布尔值
string---字符串
number---数值
object---对象或者null
function---函数
举个例子
var message="some string";
alert(typeof(message)); //string
alert(typeof 95); //number
typeof是一个操作符,所以例子中的圆括号尽管可以使用,但不是必需的.
var car=null;
alert(typeof car) //"object"
如果定义的变量准备在将来存放对象,那么最好将该变量初始化为null而不是其他值
还有实际上 undefined值派生自null值,所以 alert(null==undefined) //true
虽然null和undefined有这样的关系 但是无论什么情况下都没有必要将一个变量的值显示设置为undefined
但是 只要意在保存对象的变量还有没真正保存对象,就应该明确让该变量保存null值
还有boolean是将其他类型的值转化为一个Boolean值 比如空字符串转化为false 数值0转化为false
还有if的控制语句会自动执行相应的Boolean
Number可以保存+0和-0并且两者被认为是相等的
var floatNum1=1. //小数点后面没有数字,解析为1
var floatNum2=10.0 //整数, 解析为10
var floatNum3=3.125e7 //等于31250000
0.0000003 转化为3e-7
数值的范围:
数值的范围超过了javascript数值范围的值 会被自动转换为特殊的Infinity值 如果是负数就会被转换为-Infinity 正数就会被转换为Infinity 可以用isFinite() 会返回一个Boolean值
NaN 是一个特殊的数值 ,
数值的转换:
数值转换用Number()可以用于任何数据类型
如果是Boolean 则true 和false转换为1和0
如果是数字值,则简单的传入和返回
如果是null值,返回0
如果是undefind 返回NaN
如果是字符串 将其转换为十进制数值 如"123"变成123 "011"转换为11
如果字符串包含有效的浮点格式"1.1" 则将其转换为对应的浮点数值 (同样会忽略前导0)
如果字符串是空,将其转换为0
举几个例子:
var num1=Number("sdf"); //NaN 因为不包涵任何有意义的数字值
var num2=Numebr(""); //0
var num3=Number("00011") //11
var num4=Number(true) //1
parseInt()和parseFloat()是专门用于把字符串转化为数值的
parseInt()经常用于处理整数
例子 :
var num1=parseInt("1234blue"); //1234 因为不包涵任何有意义的数字值
var num2=parseInt(""); //NaN
var num1=parseInt("22.2"); //22
var num1=parseInt("70"); //70
var num3=parseInt("0xAF",16); // 175 指明转换的基数很重要 所以什么情况下都要明确指定的基数
多数情况下 我们要解析的都是十进制数值,所以始终将10作为第二个参数是很必需的.
parseFloat() 字符串中的第一个小数点是有效的,第二个是无效的,因此他后面的字符串会被忽略 "22.34.45" 转换为22.34
parseFloat和parseInt的还有区别是 它始终忽略掉前面的0
比如"045.1" 转换为45.1
string类型:可以“” 或者‘’但是必须得匹配
字符字面量:也叫做转义序列
\n表示换行
\t表示制表
\b表示空格
\r表示回车
\\表示斜杠
\‘表示单引号
\"表示双引号
任何字符串的长度都可以通过访问其length属性取得
比如 var text=“sdfsadf”
alert(text.length);
字符串可以通过直接相加来实现拼接
转化为字符串: 通常toString()方法
var age=11;
var ageAsString=age.toString(); //字符串11
var found=true;
var foundAsString=found.toString(); //字符串“true”
但是null和undefined没有这个方法
调用数值的tostring()时候可以传参 ,默认返回是10进制的字符串,可以添加基数,来输出任意有效进制的数
var num=10;
alert(num.toString(2));// "1010"
toString()方法遵循下面规则
1.如果值有tostring()方法,则调用该方法返回相应的结果
2.如果是null,则返回“null”
3.如果是undefined,则返回“undefined”;
Object:
创建Object:
var o=new Object();
Object的每个实例都具有下列属性和方法
1.Object()保存着用于创建当前对象的函数
2.hasOwnProperty 用于检测给定的属性在当前对象实例中是否存在。其中作为参数的属性名,必须以字符串形式指定 例如o.hasOwnProperty("name");
3.isPrototypeOf(object)用于检测传入的对象是否是传入对象的原型/
4.propertyIsEnumerable 用来检测给定的属性是否能够使用for-in语句来枚举 ,作为参数的属性名必须以字符串的形式指定
5.toLocaleString()返回对象的字符串表示,该字符串和执行环境的地区对应
6.toString()返回对象的字符串表示
7.valueOf() 返回对象的字符串。数值或者布尔值表示。通常与toString()的返回值相同。
valueOf():返回最适合该对象类型的原始值;
toString(): 将该对象的原始值以字符串形式返回。
Object是所有对象的基础,所以,所有对象都具有这些基本的属性和方法
但是BOM和DOM中的对象属于寄主对象,他们是由寄主实现提供和定义的。而ECMA-262不负责定义寄主对象,所有寄主对象可能会也可能不会继承Object;
操作符:
一元递增递减操作符:++;前置和后置和c语言的效果一样
不仅适用于整数,还可以用于字符串布尔值和浮点数值和对象,都遵循下面规则:
1.在应用于一个包涵有效数字字符的字符串时,先将其转化为数字值,然后在执行加减操作
2.在应用于一个不包涵有效数字字符的字符串时,将变量的值设置为NaN
3.布尔值时先转化为1或者0再执行加减操作,布尔值变量变成数值变量
4.应用于对象时,先调用对象的valueof()方法已取得一个可操作的数值,然后对该值进行上述规则
举例子:
var s1=“2”;
var s2="z";
var b=false;
var f=1.1;
var o=
{
valueOf:function(){
return -1;
}
}
s1++;
s1++;
b++;
f--;
o--
一元加和减操作符:
var num=23;
num=+num;
如果是对非数值应用一元加操作符 则会像Numebr函数一样
比如 var s1="01";
var s2="1.1";
var s3="z";
var b=false;
var f=1.1;
s1=+s1;
s2=+s2;
s3=+s3;
b=+b;
f=+f;
一元减操作符主要用于表示负数 例如 将1转换为-1
var num=23;
num=-num;
若是用于非数值 按照一元加操作符的相同规则,然后将得到的数值转换为负数
位操作符:
1.按位非~
2.按位与&
3.按位或|
4.按位异或^
5.左移 << 左移不会影响操作数的符号位
6.有符号的右移
7.无符号的右移
布尔操作符
1.非 !
2.与 && 是一个短路操作 如果第一个操作数是false 则第二个操作数是什么值,结果都不会是true
var found=true;
var result=(found&&somUndefind);
alert(result);这一行不会被执行
var found=false;
var result=(found&&somUndefind);
alert(result);会执行(“false”) 因为第一个操作符是false 意味着结果必定是false 根本用不着再对&&右侧的操作数求值了
3.逻辑或 也是短路操作
var result=true || false;
我们可以利用逻辑或的这一行为来避免为变量赋null或者undefined 例如
var myobject=preferredObject||someUndefinedVariable
在这个例子中 变量preferredObject优先赋值给myObject。 someUndefinedVariable负责在preferredObject中不包含有效值的情况下提供后备值
意思就是preferredObject不是null他的值会被赋值给myobject。如果是null,则将someUndefinedVariable的值赋值给myObject。以后的赋值语句经常
会使用这种模式。
乘性操作符:乘法和除法,求模%
加性操作符:
加法:注意 -0加-0结果是-0 +0加-0结果是+0
如果两个都是数值,直接相加
如果俩个操作数都是字符串则直接拼接
如果一个操作数是字符串,则将另一个操作数转换为字符串,然后将两个字符串拼接
如果有一个操作数是对象,数值,布尔值,则调用他们的tostring()方法取得相应的字符串,然后再拼接
有()和无()是两个结果
比如 var num1=5;
var num2=10;
var message="sdf"+num1+num2;
结果是 sdf510
如果是 var message="sdf"+(num1+num2);
结果是 sdf15
减法:调用number()将其转化为数值然后操作 true变成1 “”变成0 null变成0 “2”变成2
关系操作符:
<> <= >=
如果两个操作数都是数值,则执行数值比较
如果两个都是字符串,则比较两个字符串对应的字符编码值
如果一个是数值,则将另一个操作符转换为一个数值,然后进行比较
如果一个操作数是布尔值,则将其转换为数值,然后比较
字符串比较是两个字符串中对应位置的每个字符的字符编码值,大写字母的编码值全部小于小写的
“23”<"3"成立 ,因为比骄傲的是字符编码
“23”<3 错误 因为“23”被转化为了23
“a”<3 “a”>=3 错误,因为“a”被转化为NaN 在与NaN进行比较时,这两个比较操作符都返回了false
相等操作符:
如果有一个操作数时布尔值,则比较前先转换为数值
如果一个操作数是字符串,另一个操作数是数值,则先将字符串转换为数值
如果一个操作数是对象,另一个不是,则调用对象的valueOf方法
规则:
null和undefined是相等的
如果有一个操作数是NaN则 返回false
即使两个操作数都是NaN 也返回false
如果连哥哥操作数都是i对象 则比较他们是不是同一个对象,如果两个都指向同一个对象则返回true
null==0 false
NaN==NaN false
全等操作符===
“55”===55 false 因为不同的数据类型不同
记住 null==undefined 会返回true 但是 null===undefined会返回false因为他们是不同类型
注意:由于相等和不相等操作符存在类型转换问题,为了保持代码中数据类型的完整性,我们推荐使用全等和不全等操作符
条件操作符: 条件?返回1:返回2
赋值操作符*= /= %= += -= <<=左移 >>=有符号右移 >>>=无符号右移
逗号操作符 ,,,表示可以在一条语句中执行多个操作
var num =(3,4,5,6,0) num的值是0 逗号操作符总是会返回表达式中的最后一项
语句:
if()语句 if else if else
do while()语句 循环至少被执行一次
while语句
for语句
for in语句:for(var propName in window){
document.write(propName);
} 建议在使用for in循环之前,先检测确定对象的值不是null或者undefined 如果是 ,则不执行循环体
break是直接跳出这个循环
continue 是跳出这次循环 进入下一次循环
不建议使用label语句
with语句的作用是将代码的作用于设置在一个特定的对象里
with(location){
var qs=search.substring(1);
var hostName=hostName;
var url=href;
}
严格模式下不允许使用with语句,否则视为语法错误
大量使用with语句会导致性能下降 所以在开发大型应用程序的是偶,不建议使用with语句
swith语句。 switch 语句在比骄傲的时候使用的是全等操作符,因此不会发生类型转换 例如字符串“10”不等于10
函数:function 里面位于return 后面的代码都不会被执行,也可以包括多个return
严格模式对函数有一些限制:
不能把函数名字命名为eval或者arguments
不能把参数命名eval或者arguments;
不能出现两个命名参数同名的情况
函数的理解:
ECMAScript函数的参数 可以不用写,因为它的参数在内部是用一个数组来表示的 意思是 如果你定义了一个函数只接受两个参数 ,但是 你调用这个
函数的时候未必就要传递两个参数,而且 可以通过arguments来访问他的每一个元素
函数也不在乎传入多少参数,参数是什么类型都无所谓
没有传递值的命名参数将自动被赋值undefined值 这就跟定义了变量但是没有初始化一样。
ECMAScript中的所有参数传递的都是值,不可以通过引用传递参数
ECMAScript函数不能像传统意义上那样实现重,因为其参数是由包涵0或者多个值的数组来表示的。
通过检查传入函数中参数的类型和数量做出不同的反应,可以模仿方法的重载。
比如 :
function sayHi(){
alert("heLLEO"+arguments[0]+,arguments[1]);
}
function howManyArgs(){
alert(arguments.length);
}
howManyArgs("sdf",45); //2
howManyArgs(); //0
howManyArgs(12); //1
总结 :1.ECMAScript的基本类型包括: Undefined,Null,Boolean,Number,String
2.没有为整数和浮点数值分别定义不同的数据类型,Numebr类型可用于表示所有的数值
3.Object是这门语言所有对象的基础类型
4.无需指定函数的返回值
5.实际上未指定返回值的函数返回的是一个特殊的undefined值
6.也没有函数签名的概念,因为其函数参数是以一个包涵0或者多个值的数组的形式传递的
7.可以向函数传递任意数量的函数,并且可以通过arguments对象来访问这些函数。
8.由于不存在函数签名的特性,函数不能重载