一、杂项
1.严格模式下,eval和arguments不能作为标识符或属性名
2.5种简单数据类型:Undefined、Null、Boolean、Number、String。1种复杂数据类型:Object
3.typeof可能返回6种结果,注意两种返回结果:
"object":对象或null
"function":函数
4.对象变量初始化,用null
二、Number类型:
1.非严格模式下:0开头代表8进制,如果0之后的数字超出了8进制的范围,则忽略前导0,按照10进制解析。如:079 --> 解析为79。
2.浮点数:最高精度17位小数。注意,0.1+0.2 === 0.30000000000000004 (15个0),0.1+0.2 !== 0.3。
3.NaN:isNaN()在接收到一个值之后,会尝试将这个值转换为数值,如果转换失败,则判定为NaN。
4.Number():Number(null) === 0,Number(undefined) === NaN,Number("0xf") === 15。
5.parseInt():转换时,根据字符串前导0或0x判断按照几进制来转换。
eg:parseInt("070");//56(8进制)
第二个参数:指定按照几进制识别。
eg:parseInt("AF",16);//175 (可以不带0x)
6.parseFloat():与parseInt()的区别 —— 转换时,第一个小数点有效,始终忽略前导0,只解析十进制值。
三、String类型:
1.toString():null、undefined没有toString()方法。通常不必传参数。但,调用数值的toString()方法时,可以传递一个参数,指明按照几进制解析当前数值,并输出为字符串形式。
eg:let num = 10;
num.toString();//"10"
num.toString(2);//"1010"
num.toString(8);//"12"
2.String():String(null);//"null";String(undefined);//"undefined";有toString()方法的值,使用String()转换,默认调用toString()方法。
四、操作符:
1.一元加+:对非数值使用时,等同于Number()的转换规则。
2.按位非:本质 —— 操作数的负数减1。num2 = -num1 - 1相当于num2 = ~num1,按位非速度更快。
3.左移右移:
左移:<< 有符号右移(首位符号位不动,移其他位):>> 无符号右移(所有位一起右移):>>>
4.相等和不相等(==):
规则:(1)如果有一个操作数是布尔值,先将其转换为数值。
eg:false == "false"; //false。false转为数值为0,0和"false"不等。
false == "0";//true
(2)如果一个操作数是对象,另一个不是,则调用对象的valueOf方法,得到基本类型后再进行比较。
(3)如果两个操作数都是对象,则比较它们是不是同一个对象。两个操作数指向同一个对象,则相等。
(4)null == undefined
(5)比较相等性之前,不能将null和undefined转换成其他任何值。所以,null != 0,undefined != 0。
五、语句:
1.for-in:遍历对象所有可枚举的属性,包括原型属性。输出的属性名顺序不可预测,可能因浏览器而异。
建议在使用for-in前,先确认遍历对象的值不是null或undefined。
2.label语句(与break和continue配合使用):
形如:start:for(var i=0;i<count;i++){
alert(i);
}
start为for这个循环的名称,用于指代当前这个for循环。
3.break和continue:
区别:break立即退出循环。continue强制继续执行循环,continue之后的语句会被忽略,继续走for循环的下一个值。
eg:
break + 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; //退出outermost这个循环。即,退出内部外部两个for语句
}
num++;
}
}
alert(num); //55
continue + label
var num = 0;
outermost:
for(var i=0;i<10;i++){
for(var j=0;j<10;j++){
if(i==5 && j==5){
//继续outermost这个循环。i==5 && j==5时,num++不走,直接继续走外部循环
continue outermost;
}
num++;
}
}
alert(num); //95
4.with语句(开发大型应用程序时,不建议使用):
with(location){ //对location对象进行设定
var qs = search.substring(1); //相当于var qs = location.search.substring(1);
var hostName = hostname;
var url = href;
}
5.switch语句:
对比值时,使用的是全等(===)操作符。
合并两种情形:
switch(i){
case 25:
/*合并两种情形*/
case 35:
alert("25 or 35");
break;
case 45:
alert("45");
break;
}
六、函数(没有重载,可通过传入参数个数,即arguments的长度,模仿重载)
1.严格模式对函数的限制:
不能把函数命名为eval或arguments
不能把参数命名为eval或arguments
不能出现两个参数同名的情况
2.关于arguments的特性,需要注意一点:
function doAdd(num1,num2){
/*严格模式下,如果调用时只传一个参数,num2仍然为undefined,且重写arguments的值会导致语法错误(代码将不会执行)*/
arguments[1] = 10;
alert(arguments[0] + num2); //得到num1 + 10的结果
}
如上:
手动修改了arguments[1]的值,num2的值也会同步改变。但注意,它们的内存空间是独立的,只是值会同步。
如果只传入了一个参数,那么arguments[1]的值不会反应到命名参数(即num2)中。
doAdd(2); //NaN(num2 === undefined)
网友评论