基本概念

Monday, August 5, 2019

第三章 基本概念

3.3 变量

  1. var message 定义了一个 message 变量 保存一个特殊的值 undefined。

  2. var message = “hi” 并不会标记为字符串类型,只是给变量赋值,可随时修改(不推荐)。

  3. 在函数中 var mes 为局部变量,退出函数后会被销毁,而省略 var 则创建了全局变量。

    1. function test(){message=“全局变量”};
    1. 但不推荐,难以维护,在严格模式下会报错;

3.4 数据类型

    1. ECMAScript 有 5 种简单数据类型(也称为基本数据类型):

      1. Undefined;
      2. Null;
      3. Boolean
      4. Number;
      5. String;
      1. Object
    2. ECMAScript 不支持任何创建自定义类型的机制。

    3. ECMAScipt 数据类型具有动态性。

3.4.1 typeof 操作符

    1. 对一个值使用 typeof 操作符返回字符串

      1. “undefined” 如果这个值未定义;
      2. “boolean” 如果这个值是布尔值;
      3. “string” 如果这个值是字符串;
      4. “number” 如果这个值是数值;
      5. “object” 如果这个值是对象或 null;
      6. “function” 如果这个值是函数;

3.4.2 Undefined 类型

    1. 声明变量但未对其初始化时,变量的值就是 undefined。
    2. var message = undefined 与未初始化是等价的。
    3. 包含 undefined 的变量与尚未定义的变量(直接使用 message)是不一样的,后者会报错,只能执行 typeof。
    4. 对未初始化的变量与未定义的变量使用 typeof返回 undefined。
    5. 因此即便未初始化的变量会被自动赋予 undefined 值,但我们仍应该显式的初始化变量,避免 typeof 返回 undefined 时,我们会混淆变量时未声明还是未初始化。

3.4.3 Null 类型

    1. Null 类型只有一个值,那就是 null。

    2. 从逻辑角度看,null 值表示一个空对象指针,所以 typeof 返回的是 object。

    3. 如果定义的变量将用于保存对象,最好初始化为 null,这也只要直接检查 null 值就可以知道是否已保存一个对象的引用。

    4. 实际上,undefined 是由 null 派生而成,因此相等性测试返回 true。

      1. if (undefined == null ) // 通过
    5. 尽管如此,但用途完全不同,无论何时都没必要把变量显式设为 undefined,而对 null 而言,任何变量还没有真正保存对象,它就应该保存 null 值,不仅体现 null 作为空指针的惯例,也助于区分 null 和 undefined。

3.4.4 Boolean 类型

    1. Boolean 类型只有两个字面值 true 和 false,与数字值不同,true 不一定等于 1,false 也不一定等于 0。

    2. 虽然 Boolean 类型的字面值只有两个,但 EMCAScript 种所有类型的值都有与 Boolean 的等价值,可使用 Boolean()函数转换 e.g. var mes =“HAHA”; var mesBl=Boolean(mes); //true

      1. if (mes) {} // 在该情况下 mes 会自动转换为对应的 boolean 值(true),所以可执行。
数据类型 转换为 true 的值 转换为 false 的值
Boolean true false
String 任何非空字符串 “” (空字符串)
Number 任何非零数字(包括无穷大) 0 和 NaN
Object 任何对象 null
Undefined 不适用 undefined

3.4.5 Number 类型

    1. 各种数值类型

      1. 十进制整数可直接输入;
      2. 八进制整数,字面值的第一位必须是零(0),然后是(0~7),如果字面值超出了范围(出现 8 或 9),那么前面的 0 将会被省略,后面的值当作十进制解析;
      3. 十六进制,字面值前两位必须是 0x,后面是(09&AF),其中 A~F 不区分大小写;
      4. 进行算术计算时,所有八进制和十六进制数值最终都将被转换为十进制数值;
    2. 浮点数值

      1. 数值中必须包含一个小数点,小数点后必须至少有一位数字;
      2. 如果小数点后没有数字,或浮点数本身表示一个整数(10.0),那么该值会被转换为整数。
      3. 极大极小值可以使用 e 表示法,如 1.8e10,3e-10(e 不区分大小写);
      4. 浮点数值最高精度是 17 位小数,0.1+0.3 的结果不是 0.3,而是 0.30000000000000004,永远不要直接比较两个浮点的大小原因);
    3. 数值范围

      1. 由于内存限制,当 ECMAScript 中的值大于 Number.MAX_VALUE(1.7976931348623157e+308)或小于最小值 Number.MIN_VALUE(5e-324),将自动转换为(-)Infinity;
      2. 如果某次运算返回了 Infinity,将无法继续下一次计算,想要确定是否在可计算范围内,可使用 isFinite()函数,返回 true 则在范围内;
    4. NaN

      1. NaN 即非数值(Not a Number)是一个特殊的值,表示未返回数值的情况(如数值与字符串的计算);

      2. 任何涉及 NaN 的操作都会返回 NaN,NaN 与任何数不相等,包括 NaN 本身;

      3. isNaN()函数,接受一个参数(任何类型),确定是否是 NaN

        1. isNaN(NaN) //true;
        2. isNaN(10) //false;
        3. isNaN(“10”) //false;
        4. isNaN(“red”) //true;
        5. isNaN(true) //true;
      4. isNaN()会先调用 valueOf()方法看是否返回数值,再调用 toString()方法,再测试返回值;

    5. 数值转换

      1. Number()方法

        1. Boolean 值,true(1),false(0);

        2. 数字值,传入和返回;

        3. null 值,0;

        4. undefined,NaN;

        5. 字符串

          1. 只包含数字(保留正负号),转为十进制,数字前的“0”会被忽略;
          2. 包含有效浮点格式,转为对应的浮点数值(忽略前导的“0”);
          3. 包含有效的十六进制格式,如“0xf”,转为对应十进制数值;
          4. 空字符串,转为 0;
          5. 包含上述以外的字符,转换为 NaN;
        6. 如果是对象,则调用对象的 valueOf()方法,然后依照前面规则转换。如果返回的是 NaN,则调用 toString(),然后再次按照前面规则转换;

      2. parseInt()方法

        1. 在转换字符串时,会忽略字符串前的空格,直到找到第一个非空字符,如果不是负号或数字,则返回 NaN,空字符也是 NaN;
        2. 不能识别八进制,会忽略 0 转为十进制,可识别 0x 十六进制,转换为十进制返回;
        3. 可使用第二参数设置进制,parseInt(“10”,2/8/10/16);
      3. parseFloat()方法

        1. 与 parseInt()类似,从位置 0 开始解析到最后,或遇到无效的浮点数字字符为止,即第二个小数点会被忽略;
        2. 可识别所有浮点数值,但十六进制始终会被转换为 0;
        3. 若包含可被解析整数,则返回整数,e.g"1234blue" 返回 1234;

3.4.6 String 类型

    1. 转义符只算一个长度,如“HAHA\u03a3” length 为 5;
    2. 字符串一旦创建不改变,改变后销毁原先字符串
    3. toString()转字符串,toString(2/8/10/16)可选择转为什么进制的字符串
    4. String()方法,若有 toString()先调用,没有的话,null 和 undefined 返回 null 和 undefined;

3.4.7 Object 类型

  1. ECMAScript 中 Object 时所有对象的基础,因此所有对象都具有基本的属性和方法;

3.5 操作符

    1. ++1 是先进行自身运算再进行总的运算,i++则相反。
    2. 如果加法中一个操作数是字符串,则将另一个操作数转位字符串,然后将两个字符串拼接
  • e.g num1=5 num2=10 alert(“5+10 等于”+num1+num2) //5+10 等于 510;

    1. 想避免则加括号(num1+num2),先进行算术运算;
    1. 关系操作符 ><

      1. 字符串对比时,先转换为字符编码(全部大写或小写),不然只会对比首字母;
      2. 一个是数字一个字符串时,会将字符串转为数值,无法转换则和 NaN 对比;
      3. 两个字符串数字则是对比首数字的字符编码 “23” “3”,相等则继续往后对比;
    2. 相等操作符

      1. 相等和不相等 == / != 会对字符串进行转换后再对比,null 和 undefined 也相等;
      2. 全等不不全等 === / !== 不会进行转换,直接对比,null 和 undefined 不全等;
    3. 条件操作符

      1. var max =(num1 > num2 ) ? num1:num2; true 则 max 赋值 num1;

3.6 语句

    1. for 语句,循环内部定义的变量可以在外部访问;
    2. 问题 for-in 遍历 for (var I in a ) {};
    3. break 退出循环 continue 退出当前循环,继续下一次循环;
    4. with 语句 with(location){var I = href;} //简化多次编写同一个对象的工作 不建议使用
    5. js 中 switch 可以使用任何数据类型,包括字符串,对象,case 的值不一定是常量,可以是变量,表达式; // switch 中使用的是全等操作符,不会发生类型转换 “10”不等于 10;

3.7 函数

    1. return 语句后的任何代码都不会执行,函数会执行了 return 语句后停止并立即退出;

    2. ECMAScript 中不介意传进来多少个参数,可以不显示地使用命名参数;

      1. 传进来的参数可以用 arguments(类似数组)对象访问,如 arguments[0];
      2. 可以用过 length 属性获知传递了多少个参数;
      3. arguments 对象可以和命名参数一起用,如 num1+arguments[1];
      4. arguments 值永远和命名参数的值保持同步,如 num2=0,arguments[1]也会改为 2(内存空间独立)
      5. 没有被传递值得命名参数赋予 undefined 值,arguments 的长度由传入参数数量决定,与命名参数无关;
    3. 没有重载,后定义函数会覆盖前定义函数,可通过检查传入参数中的类型和数量作出不同反应(模仿重载);