一、文档模式
最初的两种文档模式是:混杂模式和标准模式
这两种模式主要影响css内容的呈现,但在某些情况下也会影响到JavaScript的解释执行。
如果在文档开始处没有文档类型声明,所有浏览器都会默认开启混杂模式。在这种模式下,不同浏览器的行为差异非常大。
严格模式:
1.要在整个脚本中启用严格模式,可以在顶部添加如下代码:
"use strict";
这是一个编译指示,用于告诉支持的JavaScript引擎切换到严格模式。
2.要指定某个函数在严格模式下执行:
function doSomething(){//将编译指示写在函数内部上方
"use strict";
//函数体
}
二、语法
1.标识符
命名规则:
(1)第一个字符必须是一个字母、下划线(_)或美元符号($)
(2)其他字符可以是字母、下划线(_)、美元符号($)或数字
最佳实践:驼峰命名法
2.变量
使用var操作符定义的变量,将成为定义该变量的作用域中的局部变量。
例如:
function test(){
var message="hi";//局部变量
}
test();
alert(message);//错误,因为message在函数调用后即被销毁
而,如果省略var操作符,创建的就是全局变量
例如:
function test(){
message="hi";//全局变量
}
test();
alert(message);//"hi"
因为message是全局变量,所以,只要调用过一次test()函数,这个变量就有了定义,就可以在函数外部的任何地方被访问到。
注意:这种定义全局变量的方法不推荐。
3.数据类型
5种基本数据类型:Number,String,Boolean,Null,Undefined
1种复杂数据类型:Object
(1)typeof操作符
typeof的作用是,用来检测指定变量的数据类型。
对一个值使用typeof操作符可能返回下列某个字符串:
"number"--如果这个值是数值
"string"--如果这个值是字符串
"boolean"--如果这个值是布尔值
"undefined"--如果这个值没有定义
"object"--如果这个值是对象或null
"function"--如果这个值是函数
用法举例:
var message="something";
alert(typeof message);//"string"
alert(typeof(message));//"string"
alert(typeof 95);//"number"
注意:typeof是一个操作符,而不是一个函数。因此,例子中的括号尽管可以使用,但不是必须的。
另:对于尚未声明的变量,只能执行一项操作,就是用typeof检测其数据类型,这时,返回的是"undefined"。
(2)Boolean类型
要将一个值转化为Boolean值,可以调用转型函数Boolean(),这里转换的规则有几点特殊的,要注意:
Number->Boolean:任何非0数字值-->true,0和NaN-->false
Undefined->:不能转化为true,undefined-->false
(3)Number类型
a.关于NaN
特点:
第一,任何涉及NaN的操作,都会返回NaN。
第二,NaN与任何值都不相等,包括NaN本身。
isNaN()函数:
isNaN()在接收到一个数值后,会尝试将这个值转化为数值。如果可以转化,也就认为,传入的值是一个数字,这时,isNaN()会返回false。
说明:isNaN()也适用于对象。在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转化为数值。如果不能, 则基于这个返回值,再调用toString()方法,再测试返回值。
b.数值转换(Number(),parseInt(),parseFloat())
Number()用于任何数据类型
parseInt(),parseFloat()用于字符串->数值
转化规则中一些要注意的地方:
Number():
Number(undefined)-->NaN
Number(null)-->0
Number("00111")-->111 //这里会忽略前导0!
Number("0xf")-->15 //16进制会转化为对应的十进制数值
Number("")-->0
注意:Number()在转换字符串时,如果字符串中不是只包含数字,则会返回NaN,无法进行转换
parseInt():
parseInt()会对传入的值进行从前到后的扫描,直到找到第一个非空字符,如果这第一个非空字符不是数字或负号,parseInt()就会返回NaN,如果未找到非空字符,同样返回NaN。找到第一个非空字符后,继续向后扫描,直到遇到非数字字符,就会停止扫描,然后返回已经扫描到的数值。
parseInt("1234blue")-->1234
parseInt("")-->NaN
parseInt(22.5)-->22
parseInt("070")-->56 //这里不忽略前导0,因此,将070视为八进制数值解析,并转化为对应十进制
parseInt()可以拥有第二个参数,用来指定第一个参数是几进制,也就是,要按照几进制来解析第一个参数(最终都解析为十进制)
例如:
parseInt("10",2);//2
parseInt("10",8);//8
parseInt("10",10);//10
parseInt("10",16);//16
parseFloat():
解析规则类似于parseInt()。这里注意,解析过程中遇到的第一个小数点是有效字符,第二个则是无效字符,遇到后,不再继续解析。
特点:
parseFloat()始终忽略前导0
parseFloat()只解析十进制值,因此,它不可以传入第二个参数,对十六进制格式的字符串,会解析为0(可以理解为,解析到0x中的0后,遇到x这个非数字的值,就不再继续解析了,所以返回0)。
parseFloat()转换后,得到的数值会忽略小数点后的0,也就是说,返回的不会是2.0,而是2。
(4)String类型
toString()方法:可用于数值、布尔值、对象和字符串。不可用于null和undefined。
toString()方法可以传递一个参数,用来指示,返回的字符串以哪种进制的格式表示,例如:
var num=10;
alert(num.toString()); //"10"
alert(num.toString(2)); //"1010"
alert(num.toString(8)); //"12"
alert(num.toString(16)); //"a"
String()可用于任何类型。它的转换规则是:
如果传入的值有toString()方法,则调用。
如果传入的是null,则返回"null"。
如果传入的是undefined,则返回"undefined"。
4.操作符
(1)++和--
++和--不仅仅适用于数值,还可用于字符串、布尔值、对象。
非数值的值执行++和--时,先将自己转换为数值,这里对字符串的转换规则,类似于parseInt()。如果不能转换,则转换为NaN,然后自增或自减。
(2)一元+和-操作符
一元+放在数值前面,对数值不会产生影响。例如:
var num=25;
num = +num;//仍然是25 注意:=+不是+=!后者数值会加1
一元-同样不改变数值的大小,相当于取了原来值得相反数。
同++和--,也可以用于数值以外的其他类型。
非数值的值执行+和-时,先将自己转换为数值,这里的转换规则和Number()函数的规则相同。
(3)位操作符--注意:按位非(~)相当于操作数的负值减1
另:几种位操作符的表示方法--按位与:&,按位或:|,按位异或:^
关于移位操作:
左移(<<):不影响操作数的符号位,即:移位时不移动符号位,移动的是符号位后的数值位(相当于乘2的n次方)
右移:
有符号右移(>>):右移后的空位,用符号位填充(相当于除2的n次方)
无符号右移(>>>):右移后的空位,用0填充。正数,结果与>>相同。负数:由于负数的二进制,等于该负数的绝对值的二进制、的补码,而无符号右移,会把这个二进制数当做正数的二进制去移位,因此,移位后的数值不能用简单的乘除法等价。
(4)布尔操作符(逻辑与、或、非(短路操作符)--&&,||,!)
(5)乘性操作符:
a.乘法
var result=a*b;
特殊情况:
如果有一个是NaN,结果是NaN
Infinity*0-->NaN
Infinity*非0数-->Infinity/-Infinity
Infinity*Infinity-->Infinity
如果有一个不是数值,后台调用Number()将其转化为数值,再应用上述规则
b.除法
var result=a/b;
特殊情况:
如果有一个是NaN,结果是NaN
Infinity/Infinity-->NaN
0/0-->NaN
非0的有限数/0-->Infinity/-Infinity
如果有一个不是数值,后台调用Number()将其转化为数值,再应用上述规则
c.求模
var result=a%b;
特殊情况:
Infinity(-Infinity)%有限数值-->NaN
有限数值%0-->NaN
Infinity%Infinity-->NaN
有限数值a%Infinity(-Infinity)-->有限数值a
0%任意值-->0
如果有一个不是数值,后台调用Number()将其转化为数值,再应用上述规则
(6)加性操作符
a.加法
var result=a+b;
如果有一个是NaN,结果是NaN
Infinity+Infinity-->Infinity
-Infinity+(-Infinity)-->-Infinity
Infinity+(-Infinity)-->NaN
+0+(+0)-->+0
-0+(-0)-->-0
+0+(-0)-->+0
如果有一个操作数是字符串,将另一个转化为字符串,然后将二者拼接
如果两个操作数都是字符串,直接将二者拼接
b.减法
var result=a-b;
如果有一个是NaN,结果是NaN
Infinity-Infinity-->NaN
-Infinity-(-Infinity)-->NaN
Infinity-(-Infinity)-->Infinity
-Infinity-Infinity-->-Infinity
+0-(+0)-->+0
+0-(-0)-->-0
-0-(-0)-->+0
如果有一个操作数是字符串、布尔值、null或undefined,则先在后台调用Number()函数将其转换为数值,然后根据上述规则计算。
如果有一个操作数是对象,调用对象的valueOf()方法取得表示该对象的数值,如果对象没有valueOf()方法,调用其toString()方法并将得到的字符串转化为数值。
(7)关系操作符(>,<,>=,<=)
注意点:
如果有一个操作数是数值,就将另一个操作数转化为数值,再比较
如果有一个操作数是布尔值,先将其转化为数值,再比较
任何操作数与NaN进行关系比较,结果都是false
(8)相等操作符
注意==(!=)与===(!==)的区别
特殊注意:
null==undefined,null!==undefined
5.语句
for-in语句:
精准的迭代语句,可用来枚举对象的属性
例如:
for(property in window){
document.write(propName);
}
对象的值是null或undefined,for-in语句会抛出错误。使用此语句前,先判断对象是不是null或undefined。
switch语句:
特点:
js里的switch可以使用任何数据类型(其他许多语言中只能使用数值)
每个case的值不一定是常量,可以是变量,甚至是表达式
switch语句比较,使用全等操作符
6.函数
特别注意:函数声明的参数个数,与实际传入的参数个数没有关系!
即,即使声明了两个参数,调用时也可以只传一个,这时,第二个参数会被赋予undefined值,即使没有声明参数,调用时也可以传入参数。
调用函数时传入的参数,都被存放在arguments对象中,且按照调用时的传入顺序存放(即:第一个参数是arguments[0],第二个是arguments[1],以此类推)。arguments类似于数组,但它并不是Array的实例。可以通过下标访问到arguments中存放的值,如:arguments[0]、arguments[1],也可以获得它的长度,arguments.length。
举个特殊的例子:
function doAdd(num1,num2){
arguments[1]=10; /*这里修改了arguments[1],也就修改了num2,即,此时,num2也等于10
*(如果只传递一个参数,在严格模式中,num2此时还是undefined)*/
alert(arguments[0]+num2);
}
注意:ECMAscript没有重载!但是可以通过,检测传入函数中参数的类型和数量(检测arguments),并作出不同的反应(if-else),模仿重载。