六种基本数据类型

  • undefined
  • null
  • string
  • boolean
  • number
  • symbol(ES6)

一种引用类型

  • Object

为什么要引入 Symbol?

ES5的对象中的属性名是字符串,容易造成属性名的冲突,如果有一种机制,保证每个属性的名字都是独一无二的,就可以从根本上防止属性名的冲突。

Symbol怎么生成?

symbol值通过Symbol函数生成,生成的symbol是一个类似于字符串的原始类型的值

const sym = Symbol(param);
// param 可以为字符串或者对象

知识点:

1.使用new命令会报错,这是因为生成的Symbol是一个原始类型的值,不是对象,不能添加属性。

2.如果传入的参数为对象,会调用toString方法,再转为字符串

3.Symbol的值不能与其他的值进行运算,Symbol可以显式的转为字符串、布尔值,但不能转为数值。

4.Symbol函数的参数只是表示对当前 Symbol 值的描述,因此传入的参数不同,Symbol的返回值也是不相等的。

Symbel值作为对象属性名时,怎样使用?

let mySymbol = Symbol();

// 第一种写法
let a = {};
a[mySymbol] = 'Hello!'; // 第二种写法
let a = {
[mySymbol]: 'Hello!'
}; // 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' }); // 以上写法都得到同样结果
a[mySymbol] // "Hello!"

注意:
Symbol每一个值都是不相等的,意味着可以作为标识符,用于对象的属性名,能保证不会出现同名的属性,注意作为属性名时不能使用点运算符。

const mySymbol = Symbol();
const a = {}; a.mySymbol = 'Hello!';
a[mySymbol] // undefined
a['mySymbol'] // "Hello!"
// a的属性名实际上是一个字符串而不是Symbol的值。

属性值的遍历

JSON.stringify是在序列化过程中会自动转换成对应的原始值;
Object.getOwnPropertySymbols方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值;
Object.getOwnPropertyNames(obj)一个对象,其自身的可枚举和不可枚举属性的名称被返回。
keys 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用[for...in]循环遍历该对象时返回的顺序一致 。
Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。

obj
// {ccc: "aaa", Symbol(a): "hello", Symbol(b): "world"};
JSON.stringify(obj)
// "{"ccc":"aaa"}"
Object.getOwnPropertyNames(obj)
// ["ccc"]
Object.keys(obj)
// ["ccc"]
Object.getOwnPropertySymbols(obj);
// (2) [Symbol(a), Symbol(b)]
Reflect.ownKeys(obj)
// (3) ["ccc", Symbol(a), Symbol(b)]

如果我希望使用同一个Symbol值?

let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo'); s1 === s2 // true

Symbol.for()Symbol()这两种写法,都会生成新的 Symbol。它们的区别是,前者会被登记在全局环境中供搜索,后者不会。

let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo" let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key。
注意:

  1. 需要注意的是,Symbol.for为 Symbol 值登记的名字,是全局环境的,可以在不同的 iframe 或 service worker 中取到同一个值。

内置的 Symbol 值?

Symbol.hasInstance

对象的Symbol.hasInstance属性,指向一个内部方法。当其他对象使用 instanceof运算符,判断是否为该对象的实例时,会调用这个方法。比如, foo instanceof Foo在语言内部,实际调用的是Foo[Symbol.hasInstance](foo)

class MyClass {
[Symbol.hasInstance](foo) {
return foo instanceof Array;
}
}

Symbol.isConcatSpreadable

对象的Symbol.isConcatSpreadable属性等于一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开。
下面代码说明,Symbol.isConcatSpreadable默认等于 undefined,可以展开。
Symbol.isConcatSpreadable = true || undefined => 展开
Symbol.isConcatSpreadable = false => 不展开

let arr1 = ['c', 'd'];
['a', 'b'].concat(arr1, 'e') // ['a', 'b', 'c', 'd', 'e']
arr1[Symbol.isConcatSpreadable] // undefined let arr2 = ['c', 'd'];
arr2[Symbol.isConcatSpreadable] = false;
['a', 'b'].concat(arr2, 'e') // ['a', 'b', ['c','d'], 'e']

类似数组的对象正好相反,默认不展开。它的Symbol.isConcatSpreadable属性设为true,才可以展开。

let obj = {length: 2, 0: 'c', 1: 'd'};
['a', 'b'].concat(obj, 'e') // ['a', 'b', obj, 'e'] obj[Symbol.isConcatSpreadable] = true;
['a', 'b'].concat(obj, 'e') // ['a', 'b', 'c', 'd', 'e']

Symbol.species

对象的Symbol.species属性,指向一个构造函数。创建衍生对象时,会使用该属性。

javascript 的七种基本数据类型的更多相关文章

  1. JavaScript中七种数据类型·中·一

    Standing on Shoulders of Giants; 说到JavaScript里的类型很容易就让人想起 42和"42",分别是string型和number型,但是他们可 ...

  2. javascript中五种基本数据类型

    前言: JavaScript中有五种基本数据类型(也叫做简单数据类型)分别为:undefined.null.bolean.number.string:另外还含有一种复杂的数据类型:object. 深入 ...

  3. JavaScript的七种数据类型

    我知道这个话题网上说法非常多,甚至还有分出什么"Array,Function"之类的阿猫阿狗的类型.今天来整理这个话题的时候,先贴一张MDN官方的说法: 这个分法是对的,也是目前来 ...

  4. JavaScript中七种函数调用方式及对应 this 的含义

    this 在 JavaScript 开发中占有相当重要的地位,不过很多人对this这个东西都感觉到琢磨不透.要真正理解JavaScript的函数机制,就非常有必要搞清楚this到底是怎么回事. 函数调 ...

  5. 【JavaScript的五种基本数据类型及转换】

    js中有六种数据类型,包括五种基本数据类型(Number,String,Boolean,Null,Undefined),和一种混合数据类型就是特殊的(Object). "undefined& ...

  6. javascript中6种基本数据类型详解

    javascript中有5中数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number和String,还有一种复杂数据类型——object,object本质是由一组键值 ...

  7. JavaScript 用七种方式教你判断一个变量是否为数组类型

    JavaScript 如何判断一个变量是否为数组类型 引言 正文 方法一 方法二 方法三 方法四 方法五 方法六 方法七 结束语 引言 我们如何判断一个变量是否为数组类型呢? 今天来给大家介绍七种方式 ...

  8. javaScript的2种变量范围有什么不同

    1.javascript怎样选中一个checkbox,怎样设置它无效? document.all.cb1[0].disabled = true;   2.js中的3种弹出式消息提醒(警告窗口,确认窗口 ...

  9. js数据类型:引用和5种基本数据类型

    javascript有2种基本数据类型:引用和基本数据类型 基本数据类型又有5个分类:布尔型.字符串.数值.undefined.NULL.

随机推荐

  1. 2.在约会网站上使用k近邻算法

    在约会网站上使用k近邻算法 思路步骤: 1. 收集数据:提供文本文件.2. 准备数据:使用Python解析文本文件.3. 分析数据:使用Matplotlib画二维扩散图.4. 训练算法:此步骤不适用于 ...

  2. Maven - web 实例

    版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...

  3. python复习——数据输入输出

    标准输入:x=input()…… 标准输出:print()…… 格式化输出:1.字符串格式化运算符% 例:print('Values are %s,%s,%s.'%(1,2,['one','two'] ...

  4. Nginx系列p4:进程结构

    Nginx 有两种进程结构:单进程结构,多进程结构.本篇文章我们主要说多进程结构. 问:那为什么 Nginx 采用多进程结构,而不是多线程结构呢? 答:这是因为 Nginx 最核心的目的就是要保证高可 ...

  5. PAT 2012 冬

    A Shortest Distance 题意相当于一个环,找出两点间从不同方向得到的距离中的最小值. #include <cstdio> #include <iostream> ...

  6. POJ 1094:Sorting It All Out拓扑排序之我在这里挖了一个大大的坑

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29984   Accepted: 10 ...

  7. Charles下载与破解方法

    文章参考:charles4.2下载与破解方法以及配置https 1.Charles官网下载 地址:https://www.charlesproxy.com/latest-release/downloa ...

  8. php里parent,::和self的分别

    01.php里parent,::和self的分别/*self的特点*/class a{ public static $a1="我是类a"; function ca() { echo ...

  9. 【十日冲刺计划】第一日 星遇Sprint1计划会议成果

    ——小组成员 赵剑峰 张傲 周龙海 Sprint 计划会议1:定出 Sprint 目标和既定产品Backlog. 会议进程(1小时) • 首先对sprint目标进行总体介绍,概括星遇的backlog, ...

  10. F5 BIG-IPLTM但比组网的三种连接模式(转)

    原文链接:https://www.cnblogs.com/yujianadu/p/11850977.html作者:遇见阿杜