Js实现:
1、JavaScript实现的组成:
核心(ECMAScript):由ECMA-262定义,提供核心语言功能
文档对象模型(DOM)提供访问和操作网页内容的方法以及接口
浏览器对象模型(BOM):提供与浏览器交互的方法以及接口
在HTML中使用JavaScript
1、<script>元素:
<async>:可选的,表示应该立即下载脚本,但不应该妨碍页面中的其他操作,比如下载其他资源。但这只对外部脚本有效
<charset>:可选。表示通过src属性指定的代码的字符集
<defer>:可选。表示脚本可以延迟到文档完全被解析或者显示之后再执行。只对外部脚本文件有效
<src>:可选。表示包含要执行代码的外部文件
<type>:
2、使用<script>的两种方式:
直接在页面中使用;
Eg:<script type="text/javascript">
function say(){
alert("</script")
}
</script>
这是个错误的做法,在内容中不能出现在不能出现</script>标签
可以通过转义字符进行修改:alert("</script"),这样写代码浏览器可以接受,因此不会导致错误
外部文件包含:<script type="text/javascript" src="example.js"></script>;
<script type="text/javascript" src="example.js" />这样写对于XHTML中是可以的,但在HTML中是不行的
3、在引入外部JS文件的时候,在<script></script>之间不能含有其他代码,即使有,也会被忽略
4、只要不存在defer以及async属性,浏览器会按照<script>元素在页面的先后顺序依次进行解析
5、在HTML5中会忽略defer属性,IE8之后的版本支持HTML5的行为
6、支持异步脚本的浏览器有Firefox3.6,Safari5和Chrome
Async只支持外部脚本文件,并告诉浏览器立即下载文件,但与defer不同的是,标记为async的脚本不一定按照他们的先后顺序执行,因此确保两者互不依赖很重要,指定async属性的目的是不让页面等待两个脚本下载与执行,从而异步加载页面的其他内容。
7、<noscript>属包含的内容只有在浏览器不支持脚本,或者浏览器支持脚本但脚本被禁用的情况下才会显示出来
基本概念
1、ECMAScirpt中的一切都区分大小写
2、标识符(变量、函数、属性的名字或者是函数的参数):
A:第一个字符必须是字母,下划线或者一个美元符号
B:其他字符可以是字母,下划线,美元符号或者数字
按照惯例ECMAScirpt中第一个字母小写,剩下的每个单词的首字母大写
3、引入严格模式,ECMAScirpt3中的一些不确定的行为将会得到处理,而且对于某些不安全的操作会抛出错误,要使用严格模式,只需要在函数内部的上方添加代码“use strict”
4、关键字与保留字不能用作标识符
关键字:
保留字:
let以及yield是第五版新增的保留字,eval以及arguments在严格模式下也不能作为标识符或属性名
5、变量是属于松散型的,可以用来保存任何类型的数据,定义变量的时候要用var操作符后面再跟上变量名
var message;
也支持初始化 var message=“hi”;并不会将它标志位字符串类型
var message=“hi”;是局部变量,将var去了就是全局变量
6、数据类型:5种简单数据类型以及一种 复杂数据类型,不支持创建自定义数据类型
5种简单数据类型:Undefined ,Null,Boolean,Number,String
一种复杂数据类型:Object,本质上是由一种无序的名值对组成的
7、typeof操作符:检测给定变量的数据类型,对于一个typeof操作符可能返回下列某个字符串
“undefined”---如果这个值未定义
“boolean” ----如果这个值是布尔类型
“string” ----如果这个值是字符串
“number” ---如果这个值是数值
“object”---如果这个值是对象或者null
“function” ----如果这个值是函数
var message="some";
alert(typeof message); -----String
alert(typeof (message)); -----String
8、defined类型:
第一种情况:
var message; ---默认取得了undefined的值
// var age 没有声明
alert(message); -----undefined
alert(age);------产生错误
第二种情况:
var message; ---默认取得了undefined的值
// var age 没有声明
alert(typeof message); -----undefined
alert(typeof age);------undefined
即便是未初始化的变量也会自动被赋予undefined值
9、null
var car=null;
alert(typeof car); //object类型
if(car!=null){
}
10、boolean类型:true不一定等于1,false不一定等于0,同时还区分大小写就是说True以及False都不是Boolean值
var message="hello";
var messageAsBoolean=Boolean(message);
if会自动转化成为boolean类型
var message="hello";
if(message){
alert("value is true!")
}
11、number类型
整数除了十进制表示外,还可以使用8进制以及十六进制的字面值来表示。
其中八进制的字面值第一位必须是0,然后是0~7,如果字面中的数值超过了范围,那么前导零将被忽略,后面的数值被当做十进制解析。
十六进制的字面值是0x开头,后面跟着0~9以及A~F,其中A~F可以是大写也可以是小写。
A:浮点数值,必须包含一位小数点,小数点后面至少含有一位数字
var floatNum=1. -----小数点后面没有数字,被解析为1
var floatNum=11.0 ------整数,解析为11
对于极大以及极小的数值可以使用e表达法表示的浮点数值表示,e表达的数值等于e前面的数值乘以10的指数次幂
B:数值范围,ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中,在大多是的浏览器中,这个值是5e-324;能够表示的最大数值存储Number.MAX_VALUE中,在大多数浏览器中,这个值是1.7976931348623157e+308。如果结果得到一个超出范围的值,那么这个数值会自动转化为-Infinity(负无穷)以及+Infinity(正无穷)。Infinity值是不能够参与计算的数值,确定一个值是不是有穷的,可以使用isFinite()函数,如果处于最小以及最大之间会返回一个true
C:NaN。即非数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出异常了),任何数值除以非数值会返回NaN;NaN与任何值都不相等,包括NaN本身。isNaN()函数接受一个任何类型的参数,函数会帮我们确定这个参数是否“不是数值”。任何不能被转为数值的值都会导致函数返回一个true。正数除以0返回正无穷,负数除以0返回负无穷,0除以0返回NaN。
D:数值转换:3个函数将非数值转化成为数值,Number()、parseInt()以parseFloat()。Number()可用于任何数据类型,另外两个专门用于将字符串转化成为数值。
Number()转化规则:
a) 如果是Boolean值,true与false分别返回1,0
b) Null,返回0
c) Undefined,返回NaN
d) 字符串:如果只包含数字,则将其转化成为十进制数值;字符串中包含有效的十六进制格式,将其转化为大小相同的十进制数值;字符串中包含有效的浮点格式,将其转化为对应的浮点数值;字符串是空的,将其转化为0;字符串中包含除了上述条件外的字符,将其转化为NaN。
e) 如果是对象,调用对象的valueof()方法,依照前面的规则转化返回的值。如果结果是NaN,则再调用对象的toString方法,再进行转化
parseInt()转化规则:
a) 转化空字符会返回NaN
b) 会忽略字符串前面的空格,直至找到第一个非空格字符
var num1=parseInt("1234blue") ----1234
var num2=parseInt("") -----NaN
var num3=parseInt("0xA") ------10
var num4=parseInt("22.5") ---22
var num5=parseInt("070") --56
var num6=parseInt("70") ---70
var num7=parseInt("0xf") ---15
var num5=parseInt("070",8) ----8进制数
parseFloat()转化规则:
a) 字符串中的第一个小数点是有效的,第二个是无效的
b) 始终会忽略前导的0
c) 十六进制的字符串始终会被转化为0,只解析十进制数值
d) 如果字符串包含的是一个可解析为整数的数值,parseFloat()会返回一个整数
E:String类型,可以用单引号以及双引号表示
F:转化为字符串
a) 数值,对象,布尔值以及字符串值都有一个toString方法,但null以及undefined没有
b) 在调用数值的toString方法色时候,可以 传递一个参数,表示输出数据的类型是什么进制的
var nam=10;
alert(num.toString()); ----输出“10”
alert(num.toString(2)); ---输出“1010”
alert(num.toString(16)); ----输出“a“
c) 在不知道转化的值是不是null或undefined的情况下,可以使用转型函数String(),这个函数可以将任何类型的值转化为字符串,如果值为null则返回“null”,如果值为undefined,则返回“undefined”
G:object类型
a) var o=new Object();
b) constructor:保存用于创建当前对象的函数
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在,作为参数的属性名必须以字符串形式存在o. hasOwnProperty(“name”)
isPropertyOf(object):用于检查传入的对象是否是传入对象的原型
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举,参数属性名必须以字符串的形式
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应
toString():返回对象的字符串表示
valueOf():返回对象的字符串、数值 或布尔值表示,通常与toString()的返回值相同
12、操作符
A:一元操作符:只能操作一个值的操作符
B:一元加和减操作符;一元加放在数值前面不会产生任何影响;一元减操作符主要用于表示负数;eg:num=+num;num=-num;
13、位操作符:对于有符号的整数,32位的前31位用于表示整数的值,第32位用于表示数值的符号,0表示正数,1表示负数。
负数同样用二进制码存储,但使用的格式是二进制补码
以二进制字符串的形式输出一个负数时,我们看到的只是在负数绝对值的二进制码前面加上一个负号
a) 按位非(NOT)用~表示,返回结果是数值的反码(最后的结果是操作数的负值减1)
b) 按位与(AND)用&表示,它有两个操作符数。只有在两者同时为1的情况下才为1
c) 按位或(OR)用|表示,也有两个操作数,只要有一个位是1的情况下就返回1,而只有在两个位都是0的情况下才返回0.
d) 按位异或(XOR)用^表示,也有两个操作数,相同为0,不同为1
e) 左移用<<表示,这个操作符会将数值的所有位向左移动指定的位数,移动的位置由0进行补充,左移不会影响操作数的符号位
var num=2; ----二进制的10
var newNum=num<<5; ----二进制的1000000,十进制的64
f) 有符号的右移用>>表示,将数值右移,保留符号位,以符号位的值填充移动的位置,在符号位的右侧,原数值的左侧
g) 无符号右移用>>>表示,无符号右移操作符会将负数的二进制码当成正数的二进制码
14、布尔操作符:非(NOT),与(AND),或(OR)
A:逻辑非用!表示,可以用于ECMAScript中的任何值,无论这个值是什么数据类型,这个操作符都会返回一个布尔值
a) 如果操作数是一个对象,返回false
b) 如果操作数是 一个空字符串,返回true
c) 操作数是一个非空字符串,返回false
d) 如果操作数是0,返回true
e) 如果操作数是非0数值,包括Infinity,返回false
f) 操作数是null,返回true
g) 操作数是NaN,返回true
h) 操作数是undefined,返回true
B:逻辑与用&&表示,有两个操作数,只有两个都是true的情况下才返回true
a) 在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值,此时遵循下列规则
i. 如果第一个操作数是对象,则返回第二个操作数
ii. 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象
iii. 如果两个操作数都是对象,则返回第二个操作数
iv. 如果有一个操作数是null,则返回null
v. 如果有一个操作数是NaN,则返回NaN
vi. 如果有一个操作数是undefined,则返回undefined
b) 逻辑与操作中,如果第一个操作数能够做决定,则不会对第二个操作数求值
c) 如果第一个操作数是false,则无论第二个操作数是什么都不可能将结果变为true
C:逻辑或用||表示,有两个操作数,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值,只要有true就是true,两者都为false的时候才是false
a) 如果第一个操作数是对象,则返回第二个操作数
b) 如果第一个操作数的求值结果是false,则返回第二个操作数
c) 如果两个操作数都是对象,则返回第一个操作数
d) 如果两个操作数都是null,则返回null
e) 如果两个数都是NaN,则返回NaN
f) 如果两个数都是undefined,则返回undefined
g) 与逻辑与一样,第一个操作数的结果是true,就不会对第二个操作数求值了
15、乘性操作符:乘法,除法,求模
A:乘法由一个*表示,规则如下:
i. 两个操作数都是数值,执行常规乘法计算,即两个整数或两个负数相乘结果还是正数,而只有一个操作数有符号,那么结果就是负数。乘积超过了范围内,则返回正无穷或者负无穷
ii. 如果有一个操作数是NaN,结果是NaN
iii. Indefinity与0相乘,结果是NaN
iv. Indefinity与非0相乘,结果是Indefinity或者-Indefinity,取决于符号操作数的符号
v. Indefinity与Indefinity相乘,结果是Indefinity
vi. 如果有一个操作数不是数值,在后台调用Number()转化为数值
B:除法由/表示,规则如下:
i. 两个操作数都是数值,执行常规乘法计算,即两个整数或两个负数相乘结果还是正数,而只有一个操作数有符号,那么结果就是负数。乘积超过了范围内,则返回正无穷或者负无穷
ii. 如果有一个操作数是NaN,结果是NaN
iii. 如果是Indefinity被Indefinity除,结果是NaN
iv. 0被0除,结果是NaN
v. 如果是非0的有限数被0除,则结果是Indefinity或-Indefinity,取决于有符号操作数的符号
vi. 如果是Indefinity被任何非0数除,则结果是Indefinity或-Indefinity,取决于有符号操作数的符号
vii. 如果有一个操作数不是数值,在后台调用Number()转化为数值
C:求模用%表示,求余数,规则如下:
i. 操作数都是数值,返回除得的余数
ii. 被除数是无限大值,除数是有限大的值,返回NaN
iii. 被除数是有限大值,除数是0,结果是NaN
iv. Indefinity被Indefinity除,结果是NaN
v. 如果被除数是有限大的数值,而除数是无穷大值,结果是被除数
vi. 被除数是0,结果是0
vii. 如果有一个操作数不是数值,在后台调用Number()转化为数值
16、加性操作符
A:加法+
i. 一个操作数是NaN,结果是NaN
ii. Indefinity加Indefinity,结果是Indefinity
iii. –Indefinity加-Indefinity,结果是-Indefinity
iv. Indefinity加-Indefinity,结果是NaN
v. +0加+0,结果是+0
vi. -0加-0,结果是-0
vii. +0加-0,结果是+0
viii. 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来
ix. 如果只有一个操作数是字符串,则将另一个操作数转化为字符串,然后将两个字符串拼起来
x. 对于null以及undefined,调用String()函数取得字符串
B:减法-
i. 如果两个数都是数值,返回结果
ii. 如果有一个操作数是NaN,返回NaN
iii. Indefinity减Indefinity,结果是NaN
iv. –Indefinity减-Indefinity,结果是NaN
v. Indefinity减-Indefinity,结果是Indefinity
vi. –Indefinity减Indefinity,结果是-Indefinity
- +0减+0,结果是+0
- +0减-0,结果是-0
ix. -0减-0.结果是+0
17、关系操作符
A:小于,大于,小于等于,大于等于
a) 如果两个操作数都是字符串,比较两个字符串的字符编码值
b) 如果一个数是数值,将另一个操作数转为一个数值
c) 一个操作数是对象,调用valueOf方法或者toString方法
d) 如果一个操作数是布尔值,将其先转为数值,再进行比较
e) 任何数值与NaN进行比较,结果都是false
18、相等操作符
A:相等与不相等-先转化再比较;全等和不全等-仅比较不转化
B:相等与不相等:一个是字符串,一个是数值,将字符串转化为数值再进行比较
Null与undefined是相等的;不能将Null与undefined转化为其他数值;一个操作数是NaN,返回false;两个操作数都是对象,若两者指向同一对象,返回true;false等于0,true等于1;
C:全等于:用===表示,在两个操作数未经转化就相等的情况下返回true;不全等用!==表示,在两个操作数未经转化就不相等的情况下返回true;
Null==undefined会返回true,null===undefined返回false
19、逗号操作符:在一条语句中声明多个变量;用于赋值时,操作符总是返回表达式中的最后一项
20、for语句:for(; ;){}无限循环
21、for-in语句:用来枚举对象的属性;for(property in expression) statement
for(var propName in window){document.write(propName);}----显示BOM中window对象的所有属性,每次执行循环,都会将window对象中存在的一个属性名赋值给变量propName,直到枚举结束;
当迭代的对象的变量值为null或undefined,for-in语句不执行循环体,所以在使用for-in循环之前,先检测确认该对象的值不是null或undefined
22、 break语句会立即退出循环,强制继续执行循环后面的语句;continue语句也是立即退出循环,但退出循环后会从循环的顶部继续执行。
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
//在内部循环的break语句中带了一个参数:要返回到的标签,
添加这个标签的结果是导致break语句不仅会退出内部的for语句(j循环),
而且也会退出外部的for循环(i循环)
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
//continue会强制继续执行循环---退出内部循环,执行外部循环。
23、with语句
var qs=location.search.substring(1);
var hostName=location.hostname;
var url=location.href;
with(location){
var qs=search.substring(1);
var hostName=hostname;
var url=href;
}
使用with语句会导致性格下降
24、switch(i){
case 25:
case 35;
alert("25 or 35");
break;
case 45:
alert("45");
break;
default:
alert("Other");}
25、switch语句在比较值的时候使用的是全等操作符,不会发生类型转换
26、函数:function functionName(arg0,arg…argN){statements}
位于return语句之后的任何代码都不会执行
return语句也可以不带任何返回值,在这种情况下,函数在停止执行后将返回undefined值。这种用法一般用在需要提前停止函数执行而又不需要返回值的情况下。
arguments对象访问参数,arguments[0]
function doAdd(num1,num2){
argument[1]=10;
alert(argument[0]+num2);
}
//argument[1]与num2是同步的,但如果值传入一个参数,为argument[1]设置的值不会传到参数num2中,没有传递的命名参数num2会自动被赋予undefined
27、在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数