javaScript-数据类型

数据类型

  1. number
    • 整数和浮点数:
      JavaScript 内部,所有数字都是以64位浮点数形式储存 ,浮点数不是精确的值
      1 1.1 .1
    • 科学记数法:
      小数点前的数字多于21位和小数点后的零多于5个,JavaScript 会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示。 1.34e2 123e-2
    • 二进制:有前缀0b0B的数值:0b11
    • 八进制:有前缀0o0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
    • 十六进制:有前缀0x0X的数值。
      • 正零和负零:JavaScript 内部实际上存在2个0:一个是+0,一个是-0,区别就是64位浮点数表示法的符号位不同。它们是等价的。
        +0或-0当作分母返回的值是不相等的:+Infinity !== -Infinity
    • NaN:NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),数据类型依然属于Number,NaN不等于任何值,包括它本身。
    • Infinity:Infinity表示“无穷”,用来表示两种场景。一种是一个正的数值太大(大于等于2的1024次方),或一个负的数值太小(小于等于2的-1075),无法表示;另一种是非0数值除以0,得到Infinity
      Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN)。
    • parseInt()
      • 用于将字符串转为整数
        字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN。如果字符串以0x或0X开头,parseInt会将其按照十六进制数解析。无法转换科学记数法表示的数字和自动会被JS转化为科学记数法的数字。
      • 进制转换
        parseInt()方法还可以接受第二个参数(2到36之间,超出范围返回NaN ,如果第二个参数是0、undefined和null,则直接忽略。),表示被解析的值的进制,返回该值对应的十进制数。默认情况下,parseInt的第二个参数为10,即默认是十进制转十进制(ES5)。
        如果字符串包含对于指定进制无意义的字符,则从最高位开始,只返回可以转换的数值。如果最高位无法转换,则直接返回NaN。
    • parseFloat()
      • parseFloat方法用于将一个字符串转为浮点数, 如果字符串符合科学计数法,则会进行相应的转换。
      • parseFloat会将空字符串、布尔值和Null转为NaN
    • isNaN()
      • isNaN方法可以用来判断一个值是否为NaN, 只对数值有效。
    • isFinite()
      • isFinite方法返回一个布尔值,表示某个值是否为正常的数值。
        除了Infinity、-Infinity、NaN和undefined这几个值会返回false,isFinite对于其他的数值都会返回true。
  2. string

    • 零个或多个排在一起的字符,放在单引号或双引号之中。字符串默认只能写在一行内,分成多行将会报错。如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠,后边只能跟换行符,不能跟其他字符。

      1
      2
      3
      4
      5
      6
      7
      var longString = 'Long \
      long \
      long \
      string';

      longString
      // "Long long long string"

      连接运算符(+)可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行。

      1
      2
      3
      4
      var longString = 'Long '
      + 'long '
      + 'long '
      + 'string';
    • 转义
      反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。在非特殊字符前面使用反斜杠,则反斜杠会被省略。
      \0null(\u0000)
      \b后退键(\u0008)
      \f换页符(\u000C)
      \n换行符(\u000A)
      \r回车键(\u000D)
      \t制表符(\u0009)
      \v垂直制表符(\u000B)
      \'单引号(\u0027)
      \"双引号(\u0022)
      \\反斜杠(\u005C)

    • 字符串可以使用数组的方括号运算符,用来返回某个位置的字符,只能读取,无法进行删改操作,如果方括号中的数字超过字符串的长度,或者方括号中不是数字,则返回undefinedstring.length属性返回字符串的长度。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      var s = 'hello';
      s[0] // "h"
      s[1] // "e"
      s[4] // "o"

      // 直接对字符串使用方括号运算符
      'hello'[1] // "e"

      var s = 'hello';
      s.length // 5
    • Base64 转码(不适合非 ASCII 码的字符)
      btoa():任意值转为 Base64 编码。
      atob():Base64 编码转为原来的值。
      要将非ASCII码字符转为Base64编码,必须中间插入一个转码环节

  3. null
    null表示空值,即该处的值现在为空。调用函数时,某个参数未设置任何值,这时就可以传入null,表示该参数为空。null在运算中可以自动转为0。

    1
    2
    Number(null) // 0
    5 + null // 5
  4. undefined
    undefined表示“未定义”,应用场景:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // 变量声明了,但没有赋值
    var i;
    i // undefined

    // 调用函数时,应该提供的参数没有提供,该参数等于 undefined
    function f(x) {
    return x;
    }
    f() // undefined

    // 对象没有赋值的属性
    var o = new Object();
    o.p // undefined

    // 函数没有返回值时,默认返回 undefined
    function f() {}
    f() // undefined
  5. boolean
    布尔值代表“真”和“假”两个状态。“真”用关键字true表示,“假”用关键字false表示,只有这两个值,通常用于程序流程的控制。在JS中,undefined null false 0 NaN ""都会被转为false。其他都转为true,包括空数组和空对象。
    a && b 在 a 和 b 都为 true 时,取值为 true;否则为 false。
    a || b 在 a 和 b 都为 false 时,取值为 false;否则为 true。

  6. symbol(ES6)
  7. object

    • 对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。

      1
      2
      3
      4
      var obj = {
      foo: 'Hello',
      bar: 'World'
      };
    • 对象的所有键名都是字符串,JS会自动将键名转换为字符转形式。如果键名不符合标识名的条件(比如第一个字符为数字,或者含有空格或运算符),且也不是数字,则必须加上引号,否则会报错。

    • 对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。

      1
      2
      3
      4
      5
      6
      7
      var obj = {
      p: function (x) {
      return 2 * x;
      }
      };

      obj.p(1) // 2

      上文中对象 obj 的属性p 的值为一个函数,可以直接调用该函数。

    • 如果属性的值还是一个对象,就形成了链式引用。

      1
      2
      3
      4
      5
      var o1 = {};
      var o2 = { bar: 'hello' };

      o1.foo = o2;
      o1.foo.bar // "hello"
    • 属性的操作

      • 属性的读取
        一种是使用点运算符, 一种是使用方括号运算符。如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理,如果key的值是变量,则只能使用方括号运算符,且不能加引号。 数值键名不能使用点运算符。

        1
        2
        3
        4
        5
        6
        var obj = {
        p: 'Hello World'
        };

        obj.p // "Hello World"
        obj['p'] // "Hello World"
      • 属性的赋值
        点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值。

        1
        2
        3
        4
        var obj = {};

        obj.foo = 'Hello';
        obj['bar'] = 'World';
      • 属性的查看
        查看一个对象本身的所有属性,可以使用Object.keys方法。

      • 属性的删除:delete 命令

        1
        2
        3
        4
        5
        6
        var obj = { p: 1 };
        Object.keys(obj) // ["p"]

        delete obj.p // true
        obj.p // undefined
        Object.keys(obj) // []

        如果只想删除一个键值对的 value 保留key,可以使用obj.p = undefined 的方法操作。
        delete命令只能删除对象本身的属性,无法删除继承的属性。

      • 属性是否存在:in 运算符
        in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false。它的左边是一个字符串,表示属性名,右边是一个对象。

        1
        2
        3
        var obj = { p: 1 };
        'p' in obj // true
        'toString' in obj // true
      • 属性的遍历:for…in 循环
        for…in循环用来遍历一个对象的全部属性。

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        var obj = {a: 1, b: 2, c: 3};

        for (var i in obj) {
        console.log('键名:', i);
        console.log('键值:', obj[i]);
        }
        // 键名: a
        // 键值: 1
        // 键名: b
        // 键值: 2
        // 键名: c
        // 键值: 3