《JavaScript高级程序设计》——第三章 基本概念
阅读原文时间:2023年07月09日阅读:2

这章讲了JavaScript的语法、数据类型、流控制语句和函数。理解还是挺好理解的,但有很多和C、C++、Java不同的地方需要记忆。比如,

  • JavaScript标识符可以由Unicode字符字符组成。
  • JavaScript每条语句后面的分号也不是必需的,语句后面没有分号时,解析器会自己确定语句的结尾。
  • “+”,“-”,“*”、“/”、“&&”、“||”、“!”对不同类型操作对象进行计算的规则是不同的。
  • switch()括号内不像其他语言必须是字符或数字,而可以放任何类型数据。
  • 函数和其他语言也不一样,函数内有个arguments对象用来访问参数数组,函数不介意传递来多少个参数,也不在乎传进来的参数是什么的类型;函数没有重载,如果存在相同的函数名,只会保存最后一个函数。
  • 有个label标签语句在以后由break,continue引用

下面是这章做的笔记

typeof用来返回数据类型

    var message = "some string";  
    alert(typeof message);    //"string"  
    alert(typeof 95);         //"number"

只声明不定义的变量的值为undefined

    var message;  
    alert(message == undefined);    //true

也可以用undefined显式初始化变量

    var message = undefined;  
    alert(message == undefined);    //true

没声明的变量除了typeof和delete操作,进行其他运算都会报错

    var message;     //this variable is declared but has a value of undefined

    //make sure this variable isn't declared  
    //var age

    alert(message);  //"undefined"  
    alert(age);      //causes an error

没声明的变量进行typeof操作返回值也是undefined

    var message;     //this variable is declared but has a value of undefined

    //make sure this variable isn't declared  
    //var age

    alert(typeof message);  //"undefined"  
    alert(typeof age);      //"undefined"

null的typeof操作返回"object"

    var car = null;  
    alert(typeof car);   //"object"

undefined派生自null,因此他们进行相等测试时,返回true

alert(null == undefined); //true

Boolean()可以将所有类型数据转换成布尔值

    var message = "Hello world!";  
    var messageAsBoolean = Boolean(message);

    alert(messageAsBoolean); //true

流控制语句会自动将传进来的值转换成Boolean

    var message = "Hello world!";  
    if (message){  
        alert("Value is true");  
    }

NaN与任何值都不相等包括他自己

isNaN()先尝试将接收到的值转换成数值,然后判断转换后的值是否是数字,如果是数字则返回false,否则返回true

    alert(NaN == NaN);       //false  
    alert(isNaN(NaN));       //true  
    alert(isNaN(10));        //false � 10 is a number  
    alert(isNaN("10"));      //false � can be converted to number 10  
    alert(isNaN("blue"));    //true � cannot be converted to a number  
    alert(isNaN(true));      //false � can be converted to number 1

Number()将何种数据类型转换成数值

    var num1 = Number("Hello world!");  //NaN  
    var num2 = Number("");              //0  
    var num3 = Number("000011");        //11  
    var num4 = Number(true);            //1

    alert(num1);  
    alert(num2);  
    alert(num3);  
    alert(num4);

parseInt()可以识别出整型格式(二、八、十、十六进制)

    var num1 = parseInt("1234blue");    //1234  
    var num2 = parseInt("");            //NaN  
    var num3 = parseInt("0xA");         //10 - hexadecimal  
    var num4 = parseInt(22.5);          //22  
    var num5 = parseInt("70");          //70 - decimal  
    var num6 = parseInt("0xf");         //15 � hexadecimal

paseInt()如果指定了第二个参数,字符串可以不必带0、0x前缀

    var num1 = parseInt("10", 2);         //2 � parsed as binary  
    var num2 = parseInt("10", 8);         //8 � parsed as octal  
    var num3 = parseInt("10", 10);        //10 � parsed as decimal  
    var num4 = parseInt("10", 16);        //16 � parsed as hexadecimal

toString()返回一个值的字符串表现

    var age = 11;  
    var ageAsString = age.toString();    //the string "11"  
    var found = true;  
    var foundAsString = found.toString(); //the string "true"

    alert(ageAsString);  
    alert(typeof ageAsString);  
    alert(foundAsString);  
    alert(typeof foundAsString);

toString()可以返回数值的二进制、八进制、十六进制、默认情况下返回十进制

    var num = 10;  
    alert(num.toString());       //"10"  
    alert(num.toString(2));      //"1010"  
    alert(num.toString(8));      //"12"  
    alert(num.toString(10));     //"10"  
    alert(num.toString(16));     //"a"

toString()不能转换null和undefined的值,而String()可以转换任意类型的值

    var value1 = 10;  
    var value2 = true;  
    var value3 = null;  
    var value4;

    alert(String(value1));     //"10"  
    alert(String(value2));     //"true"  
    alert(String(value3));     //"null"  
    alert(String(value4));     //"undefined"

“++”和“--”会将运算对象先转换成数值再进行递增、递减

    var s1 = "2";  
    var s2 = "z";  
    var b = false;  
    var f = 1.1;  
    var o = {  
        valueOf: function() {  
            return -1;  
        }  
    };

    s1++;   //value becomes numeric 3  
    s2++;   //value becomes NaN  
    b++;    //value becomes numeric 1  
    f--;    //value becomes 0.10000000000000009  
    o--;    //value becomes numeric �2  

    alert(s1);  
    alert(s2);  
    alert(b);  
    alert(f);  
    alert(o);

一元加减运算会将值转换成数值

    var s1 = "01";  
    var s2 = "1.1";  
    var s3 = "z";  
    var b = false;  
    var f = 1.1;  
    var o = {  
        valueOf: function() {  
            return -1;  
        }  
    };

    s1 = +s1;   //value becomes numeric 1  
    s2 = +s2;   //value becomes numeric 1.1  
    s3 = +s3;   //value becomes NaN  
    b = +b;     //value becomes numeric 0  
    f = +f;     //no change, still 1.1  
    o = +o;     //value becomes numeric �1

    alert(s1);  
    alert(s2);  
    alert(s3);  
    alert(b);  
    alert(f);  
    alert(o);

    var s1 = "01";  
    var s2 = "1.1";  
    var s3 = "z";  
    var b = false;  
    var f = 1.1;  
    var o = {  
        valueOf: function() {  
            return -1;  
        }  
    };

    s1 = -s1;   //value becomes numeric -1  
    s2 = -s2;   //value becomes numeric -1.1  
    s3 = -s3;   //value becomes NaN  
    b = -b;     //value becomes numeric 0  
    f = -f;     //change to �1.1  
    o = -o;     //value becomes numeric 1

    alert(s1);  
    alert(s2);  
    alert(s3);  
    alert(b);  
    alert(f);  
    alert(o);

“<<<”、“>>>”是无符号左移和无符号右移运算符

    var oldValue = 64;               //equal to binary 1000000  
    var newValue = oldValue >>> 5;   //equal to binary 10 which is decimal 2  
    alert(newValue);                 //2

    var oldValue = -64;              //equal to binary 11111111111111111111111111000000  
    var newValue = oldValue >>> 5;   //equal to decimal 134217726  
    alert(newValue);                 //134217726

“!”运算也是先将操作对象转换成布尔值在进行取非

“!!”相当于是Boolean()操作

    alert(!false);      //true  
    alert(!"blue");     //false  
    alert(!0);          //true  
    alert(!NaN);        //true  
    alert(!"");         //true  
    alert(!12345);      //false

    alert(!!"blue");     //true  
    alert(!!0);          //false  
    alert(!!NaN);        //false  
    alert(!!"");         //false  
    alert(!!12345);      //true

逻辑与和逻辑或运算都存在逻辑短路现象

    var found = true;  
    var result = (found && someUndeclaredVariable);    //error occurs here  
    alert(result);    //this line never executes

    var found = false;  
    var result = (found && someUndeclaredVariable);    //no error  
    alert(result);    //works

    var found = true;  
    var result = (found || someUndeclaredVariable);    //no error  
    alert(result);    //works

    var found = false;  
    var result = (found || someUndeclaredVariable);    //error occurs here  
    alert(result);    //this line never executes  

加性操作优先转换成字符串,减性操作优先转换成数值

    var result1 = 5 + 5;     //two numbers  
    alert(result1);           //10  
    var result2 = 5 + "5";   //a number and a string  
    alert(result2);     

    var num1 = 5;  
    var num2 = 10;  
    var message = "The sum of 5 and 10 is " + num1 + num2;  
    alert(message);    //"The sum of 5 and 10 is 510"

    var num1 = 5;  
    var num2 = 10;  
    var message = "The sum of 5 and 10 is " + (num1 + num2);  
    alert(message);    //"The sum of 5 and 10 is 15"

全等“===”只在两个操作数未经转换之前就相等的情况下(数据类型一样)返回true,与之对应的是“!==”

    var result1 = ("55" == 55);    //true � equal because of conversion  
    var result2 = ("55" === 55);   //false � not equal because different data types

    var result1 = ("55" != 55);    //false � equal because of conversion  
    var result2 = ("55" !== 55);   //true � not equal because different data types

break与标签配合使用,跳出最外层循环

    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++;  
        }  
    }

continue与标签配合使用,使跳出最外层之外的循环

    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  i==5的那一层执行到5时跳出内层循环,继续执行外层循环

switch()括号内可以是任何数据类型

    switch ("hello world") {  
        case "hello" + " world":  
            alert("Greeting was found.");  
            break;  
        case "goodbye":  
            alert("Closing was found.");  
            break;  
        default:  
            alert("Unexpected message was found.");

arguments对象可以和命名参数一起使用

    function doAdd(num1, num2) {  
        if(arguments.length == 1) {  
            alert(num1 + 10);  
        } else if (arguments.length == 2) {  
            alert(arguments\[0\] + num2);  
        }  
    }

    doAdd(10);        //20  
    doAdd(30, 20);    //50

JavaScript没有函数重载,后定义的同名函数会覆盖前面的函数

    function addSomeNumber(num){  
        return num + 100;  
    }

    function addSomeNumber(num) {  
        return num + 200;  
    }

    var result = addSomeNumber(100);    //300  
    alert(result);

for-in语句

    for (var propName in window) {  
         document.write(propName);  
         document.write("<br />");  
    }

2020-04-23    18:29:22