【js高程第3章】— 基本概念

一、杂项

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

                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)

你可能感兴趣的:(【js高程第3章】— 基本概念)