JS数据类型(7种)

728 阅读2分钟

JavaScript 中共有种内置数据类型,包括基本类型对象类型

1、基本类型

  • string(字符串)
  • boolean(布尔值)
  • number(数字)
  • symbol(符号)
  • null(空值)
  • undefined(未定义)
  • bigInt (大整型) ,它的BigInt内置对象提供一种方法来表示大于 2^53 - 1 的整数,可以表示任意大的整数。

2、对象类型(引用类型)

[] instanceof Array            // true
({}) instanceof Object         // true
(()=>{}) instanceof Function   // true
还有DateRegExp

3、Symbol

(1)每一个"Symbol" 值都是不同的

可以使用 Symbol() 来创建这种类型的值:

// id 是 symbol 的一个实例化对象
let id = Symbol();

创建时,我们可以给 Symbol 一个描述(也称为 Symbol 名),这在代码调试时非常有用:

// id 是描述为 "id" 的 Symbol
let id = Symbol("id");

Symbol 保证是唯一的。即使我们创建了许多具有相同描述的 Symbol,它们的值也是不同。描述只是一个标签,不影响任何东西。

let id1 = Symbol("id");
let id2 = Symbol("id");
​
alert(id1 == id2); // false
(2)Symbol 不会被自动转换为字符串

因为字符串和 Symbol 有本质上的不同,不应该意外地将它们转换成另一个

let id = Symbol("id");
alert(id); // 类型错误:无法将 Symbol 值转换为字符串。

可以通过调用 .toString()进行转换

let id = Symbol("id");
alert(id.toString()); // Symbol(id),现在它有效了

或者获取 symbol.description 属性,只显示描述(description):

let id = Symbol("id");
alert(id.description); // id
(3)全局 symbol

Symbol 总是不同的值,即使它们有相同的名字。如果我们希望同名的 Symbol 相等

那么我们应该使用全局注册表:Symbol.for(key) 返回(如果需要的话则创建)一个以 key 作为名字的全局 Symbol。使用 Symbol.for 多次调用 key 相同的 Symbol 时,返回的就是同一个 Symbol。

let id1 = Symbol('id');
let id2 = Symbol('id');
console.log(id1 === id2)  //false// 从全局注册表中读取
let id11 = Symbol.for('id');  //如果该 Symbol 不存在,则创建它
// 再次读取(可能是在代码中的另一个位置)
let id22 = Symbol.for('id');
console.log(id11 === id22) //true
(4)Symbol.keyFor

对于全局 Symbol,不仅有 Symbol.for(key) 按名字返回一个 Symbol,还有一个反向调用:Symbol.keyFor(sym),它的作用完全反过来:通过全局 Symbol 返回一个名字。

// 通过 name 获取 Symbol
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");
​
// 通过 Symbol 获取 name
alert(Symbol.keyFor(sym)); // name
alert(Symbol.keyFor(sym2)); // id
(5)Symbol 有两个主要的使用场景:
  1. “隐藏” 对象属性。 通过设置Symbol变量作为属性名, for..in 遍历,是获取不到的。该属性将受到保护,防止被意外使用或重写。

    //如果想用变量当属性名,需要加[]
    let obj = {
        a:2,
        sd:'dw',
        [Symbol('id')]:"隐藏属性id"
    }
    for(let i in obj){
        console.log(i)
    }//a  sd
    
  2. JavaScript 使用了许多系统 Symbol,这些 Symbol 可以作为 Symbol.* 访问。我们可以使用它们来改变一些内置行为。例如,使用 Symbol.iterator 来进行迭代操作,使用 Symbol.toPrimitive 来设置 对象原始值的转换 等等。