【JS 系统学习 】数据基本类型

612 阅读3分钟

最新的ECMAScript标准定义了 7 种数据类型

原始类型: 所谓原始值就是经过某些操作转换后(比如str.toUpperCase),原始值依然不会变,除非重新给其赋值。而Object,是引用类型,在某些操作(比如splice),会直接更改Object的值。

  • 6种原始类型
    • Boolean
    • Null
    • Undefined
    • String
    • Number
    • Symbol
  • Object
var obj = {
    "a1": 1,
    "a2": "happy",
    "a3": true,
    "a4": null,
    "a5": undefined,
    "a6": Symbol("m")
};
for(var o in obj) {
 console.log(typeof obj[o]);
}
// number
// string
// boolean
// object
// undefined
// symbol

Number

IEEE 美国电气电子工程协会 根据ECMAScript标准,JavaScript只有一种数据类型: 基于IEEE 754标准的双精度64位二进制格式的值(-(263 -1) 到 263 -1), 它并没有为整数给出一种特定的类型

  • +Infinity 正无穷 5/+0 === +Infinity
  • -Infinity 负无穷 5/-0 === -Infinity
  • NaN 非数字 , 只能通过 isNaN() 判断, NaN与谁都不相等(包括自己);
  • 双精度64位
    • 安全整数范围 [-(2^53 - 1) , 2^53-1], 超出这个范围JavaScript的数字的精度就会损失。检验是否是安全整数范围的函数 Math.isSafeInteger()Number.MAX_SAFE_INTEGER
    • www.boatsky.com/blog/26 这篇文章很详细讲了IEEE 754双精度,可是我看的不是很懂;
  • 单精度32位
    • 数组可识别的length索引的区间 [0, 2^32 -1]

Boolean

只有两个值: true / false。

String

使用单引号或者双引号。

Null

null是一个Object的类型。

Undefined

在全局作用域或者函数作用域中, 使用var变量声明的,未初始化值的类型。

Symbol

  • Symbol 是字符串类型的数据类型;

    var s1 = Symbol("flower");
    var s2 = Symbol({a: 2, b:3});
    s1.description; // "flower"
    s2.description; // "[object Object]"
    
  • 每一个 Symbol 值都是不相等的, 这意味着 Symbol 可作为标识符。

    var s1 = Symbol();
    var s2 = Symbol();
    s1 === s2; // false
    
  • Symbol.prototype.description

    Symbol中的description表示Symbol变量真正的值

    var s1 = Symbol("flower");
    s1.description; // "flower"
    
  • Symbol 类型还可以用于定义一组常量,保证这组常量的值都是不相等的。

    const COLOR_RED    = Symbol();
    const COLOR_GREEN  = Symbol();
    
    function getComplement(color) {
      switch (color) {
        case COLOR_RED:
          return COLOR_GREEN;
        case COLOR_GREEN:
          return COLOR_RED;
        default:
          throw new Error('Undefined color');
        }
    }
    
  • 消除魔术字符串

    魔术字符串,指的是与代码形成强耦合的字符串或者数值,正常代码优化手段是将其改成含义清晰的常量进行表示。

    如何消除呢? 正常情况下必须定义一个常量,并赋予其一个特殊字符串,这样每出现一个都需要想那个字符串。如果所需要的常量等于哪个值并不重要时,可以采用Symbol, 因为Symbol都是不相等的,

  • 遍历Symbol

    Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。

    var obj = {};
    var a = Symbol("a");
    var b = Symbol("b");
    obj[a] = "Hello";
    obj[b] = "World";
    obj["c"] = "Happy";
    var objectSymbols = Object.getOwnPropertySymbols(obj);
    objectSymbols; // [Symbol(a), Symbol(b)]
    Reflect.ownKeys(obj); // ["c", Symbol(a), Symbol(b)]
    
  • Symbol.for() 、Symbol.keyFor()

    • Symbol.for(): 接收一个字符串作为参数,首先去搜索有没有以该参数作为名称的Symbol值,如果没有则创建一个。这个是会被登记在全局环境中提供搜索的。

    • Symbol() 和 Symbol.for() 的区别:后者会被登记在全局环境中提供搜索,前者不会;

    • Symbol.keyFor() 去找寻被登记可查询的Symbol字符串的值

      var s1 = Symbol("xuqy");
      Symbol.keyFor(s1); // undefined
      var s2 = Symbol.for("hello");
      Symbol.keyFor(s2); // "hello"
      

还有更高阶的用法没有涉及... es6.ruanyifeng.com/#docs/symbo…