zoukankan      html  css  js  c++  java
  • 《JavaScript高级程序设计》学习笔记(第三章)- 上

    目前为此,ECMAScript第3版还是使用最广的版本,以下的笔记除非特别说明,否则都是以第3版为基础。

    语法

    ECMAScript大量借鉴了C以及其它类C语言的语法,因此很多都是大同小异的。

    区分大小写

    在ECMAScript中所有的一切(变量、函数名和操作符)都是大小写敏感的。

    标识符

    • 第一个字符必须是一个字母、下划线(_)或美元符号($);
    • 其它字符可以是字母、下划线、美元符号或数字。

    虽然也可以用扩展的ASCII与UNICODE字符来作为标识符字母,但是这是不推荐的行为。

    与Java一样,ECMAScript的标识符推荐使用驼峰命名法,即第一个字母小写,其余每个单词的首字母大写。如:

        firstSecond
        myCar
        doSomethingImportant
    

    注释

    分为单行与多行注释。语法与C++相同:

        // This is a single comment
    
        /*
        ** This is a comment
        ** This is another comment
        ** multiline comment
        */
    

    语句

    ECMAScript的语句以分号(;)结束,并且可以使用花括号({})将多条语句组合到一个代码块中。
    虽然语句结尾的分号是可以忽略的,但是加上分号可以避免很多不必要的错误,因此任何时候都不要省略它。

        var sum = a + b; // single statement
    
        // code block
        if(test) {
            test = false;
            alert(test);
        }
    

    关键字和保留字

    和其它语言一样,ECMAScript也有一组特殊用途的关键字,这些关键字是不能用来当标识符的。同时ECMAScript还有一组保留字,保留字虽然目前在这门语言中还没有任何的用途,但是它们在将来有可能被用作关键字,所以保留字同样不能拿来当标识符。

    具体的关键字与保留字列表可搜索,这里就不浪费空间了。

    变量

    定义一个变量要使用var操作符,后跟一个变量名(即标识符),ECMAScript是弱语言类型,也就是说一个变量可以用来保存任何值:

        var message = "hi";
        message = 100;      // 有效,但不推荐
    

    使用var定义的变量会成当前作用域的局部变量,即在函数中定义的变量,在函数退出后就会被销毁:

        function test() {
            var message = "hi"; // 局部变量
        }
        test();
        alert(message); // 出错!
    

    如果省略了var关键字,则这个变量就会变成全局变量。虽然使用这个方法可以在函数中定义全局变量,但是这种方法会导致维护性等问题,所以强烈不建议使用这种方法。

        function test() {
            message = "hi"; // 全局变量
        }
        test();
        alert(message); // hi
    

    数据类型

    使用typeof操作符可以用来判断一个变量的数据类型,对一个值使用typeof操作符,会返回相应的字符串:

    • "undefined" —— 未定义
    • "boolean " —— 布尔类型
    • "string" —— 字符串类型
    • "number" —— 数据类型
    • "object" —— 对象类型或null
    • "function" —— 函数类型

    Undefined类型

    undefined类型只有一个值,即undefined。使用var声明变量但未对其进行初始化的时候,这个变量的值就是undefined

    虽然对包含undefined值的变量跟未定义的变量使用typeof都会返回undefined,但是其实这两种是有本质上的不同:

        var message; // 定义变量,但值为undefined
        // var age;  // 未定义的变量
        typeof message; // 得到"undefined"
        typeof age; // 得到"undefined"
    

    一个未定义的变量,唯一能使用的操作符就是typeof,除此之后,对它进行任何操作都会出错。

        alert(message); // "undefined"
        alert(age); // 出错
    

    Null类型

    Null类型同样只有一个值,即null。Null逻辑是上一个空对象指针,所以对其使用typeof操作符会返回object。虽然nullundefined很相近,但是他们的用途却是大不相同的,无论何时,我们都没有必要把一个变量显式设置为undefined,反之,当你声明了一个意在保存对象的变量,却未真正开始保存对象时,我们有必要将其设置为null

    Boolean类型

    Boolean类型有两个值:truefalse

    虽然Boolean类型只有两个值,但是可以使用Boolean()转型函数,将其它类型的值转换为Boolean类型;

    Number类型

    EcmaScript中的Number类型分为整数跟浮点数。因为保存浮点数需要的内存空间是整数的两倍,所以只要有可以,ECMAScript就会将浮点数转化为整数;

        var intNum1 = 5; // 整数
        var floatNum1 = 3.14; // 浮点数
        var floatNum2 = .14; // 0.14 浮点数
        var floatNum3 = 1. // 转化为1
        var floatNum4 = 1.0 // 转化为1
    

    因为ECMAScript使用IEEE754来表示浮点数,所以会存在精度问题,这是无法避免的。

    数值范围

    Number类型数值的范围在Number.MAX_VALUENumber.MIN_VALUE之间,如果计算结果超出这个范围,则结果值会被自己转化为Infinity-Infinity
    isFinite()函数可以用来确定一个值是否在Number的数值范围之间。

        var result = Number.MAX_VALUE + Number.MAX_VALUE;
        alert(isFinite(result)); // false
    

    NaN

    NaN(Not a Number)是一个特殊的数值,这个值用来表示一个本来要返回数值的操作数未返回数值的情况。

    任何涉及NaN的操作都会返回NaN。同时,NaN与任何值都不相等,包括自己本身。

        alert(NaN == NaN); // false
    

    使用isNaN()函数可以判断一个值是否为NaN。

        alert(isNaN(NaN)); //true
        alert(isNaN(10)); //false(10 是一个数值)
        alert(isNaN("10")); //false(可以被转换成数值 10)
        alert(isNaN("blue")); //true(不能转换成数值)
        alert(isNaN(true)); //false(可以被转换成数值 1)
    

    数值转换

    有3个函数可以将非数值转换为数值:Number()parseInt()parseFloat()
    其中,Number()可用于任何数据类型,后两个则是针对字符串进行转换。因此,Number()的转换规则最为复杂。

    Number()函数的转换规则如下:

    • 如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。
    • 如果是数字值,只是简单的传入和返回。
    • 如果是 null 值,返回 0。
    • 如果是 undefined ,返回 NaN 。
    • 如果是字符串,遵循下列规则:
      • 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即 "1"会变成 1, "123" 会变成 123,而 "011" 会变成 11(注意:前导的零被忽略了);
      • 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
      • 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
      • 如果字符串是空的(不包含任何字符),则将其转换为 0;
      • 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN 。
    • 如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN ,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符串值。

    典型例子:

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

    因为Number()函数的转换规则过于复杂,因此在处理整数的时候更常用的是parseInt()函数。parseInt()会忽略字符串的前导空格,如果非空格字符串的第一个字符不是数字字符或者正负号,则返回NaN。如果第一个字符是合法的数字字符或者正负号,则会继续向下解析,直到字符串结束,或者遇到非数字字符。同时,parseInt()还有第二个参数,可以用来指定要转化数值的进制,加上这个参数可以避免很多错误,所以建议无论何时都加上这个参数。

        var num1 = parseInt("1234blue", 10); // 1234
        var num2 = parseInt("", 10); // NaN
        var num3 = parseInt("070", 8); // 56
        var num4 = parseInt("AF", 16); // 175
        var num5 = parseInt("AF", 10); // NaN
    

    parseFloat()的解析规则与parseInt()类似,从字符串的第一位开始解析,直到字符串结束,或遇到第一个无效的浮点数字字符为止。也就是说字符串中的第一个小数点是有效的,而第二个开始则是无效的。同时,如果字符串只包含了整数而非浮点数,则parseFloat()会将字符串解析为整数。

        var num1 = parseFloat("1234blue"); //1234 (整数)
        var num2 = parseFloat("0xA"); //0
        var num3 = parseFloat("22.5"); //22.5
        var num4 = parseFloat("22.34.5"); //22.34
        var num5 = parseFloat("0908.5"); //908.5
        var num6 = parseFloat("3.125e7"); //31250000
    

    String类型

    String类型主要用来表示多个字符组成的字符串。ECMAScript中,使用单引号与双引号都可以表示字符串,并且效果没有区别。同时,在ECMAScript中,字符串是不可变的,也就是说一旦字符串被创建,他们的值就无法改变。

    转换为字符串

    有两种方法可以将其它类型的值转换为字符串,第一种是使用类型各自的toString()方法:

        var age = 11;
        var ageAsString = age.toString(); // 字符串"11"
        var found = true;
        var foundAsString = found.toString(); // 字符串"true"
    

    除了nullundefined没有这个方法,其他类型中都可以使用这个方法来转换成字符串。同时,针对数值类型的toString()方法,可以传递一个参数,用来指定要转换的进制。

    第二种是使用String()函数进行转换,这个函数可以用于任何类型的数值。如果是有toString()方法的数值,则调用toString()进行转换。如果是nullundefined,则返回相应的"null"或"undefined"。

        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"
    

    Object类型

    Object类型是ECMAScript中比较复杂的类型,涉及到比较多的知识点,这些会在后面的章节中有详细讲解。

  • 相关阅读:
    zookeeper的ACL权限控制
    Zookeeper客户端Curator基本API
    get和post的区别
    Html基本操作实例代码
    poj3322 Bloxorz I
    Delphi 调用SQL Server 2008存储过程
    架构设计师—你在哪层楼?
    LINUX常用命令
    分层自动化测试与传统自动化测试的差别
    商业智能漫谈
  • 原文地址:https://www.cnblogs.com/buginux/p/4096936.html
Copyright © 2011-2022 走看看