javascript 的七种基本数据类型
六种基本数据类型
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。
注意:
- 需要注意的是,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 的七种基本数据类型的更多相关文章
- JavaScript中七种数据类型·中·一
Standing on Shoulders of Giants; 说到JavaScript里的类型很容易就让人想起 42和"42",分别是string型和number型,但是他们可 ...
- javascript中五种基本数据类型
前言: JavaScript中有五种基本数据类型(也叫做简单数据类型)分别为:undefined.null.bolean.number.string:另外还含有一种复杂的数据类型:object. 深入 ...
- JavaScript的七种数据类型
我知道这个话题网上说法非常多,甚至还有分出什么"Array,Function"之类的阿猫阿狗的类型.今天来整理这个话题的时候,先贴一张MDN官方的说法: 这个分法是对的,也是目前来 ...
- JavaScript中七种函数调用方式及对应 this 的含义
this 在 JavaScript 开发中占有相当重要的地位,不过很多人对this这个东西都感觉到琢磨不透.要真正理解JavaScript的函数机制,就非常有必要搞清楚this到底是怎么回事. 函数调 ...
- 【JavaScript的五种基本数据类型及转换】
js中有六种数据类型,包括五种基本数据类型(Number,String,Boolean,Null,Undefined),和一种混合数据类型就是特殊的(Object). "undefined& ...
- javascript中6种基本数据类型详解
javascript中有5中数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number和String,还有一种复杂数据类型——object,object本质是由一组键值 ...
- JavaScript 用七种方式教你判断一个变量是否为数组类型
JavaScript 如何判断一个变量是否为数组类型 引言 正文 方法一 方法二 方法三 方法四 方法五 方法六 方法七 结束语 引言 我们如何判断一个变量是否为数组类型呢? 今天来给大家介绍七种方式 ...
- javaScript的2种变量范围有什么不同
1.javascript怎样选中一个checkbox,怎样设置它无效? document.all.cb1[0].disabled = true; 2.js中的3种弹出式消息提醒(警告窗口,确认窗口 ...
- js数据类型:引用和5种基本数据类型
javascript有2种基本数据类型:引用和基本数据类型 基本数据类型又有5个分类:布尔型.字符串.数值.undefined.NULL.
随机推荐
- 2.在约会网站上使用k近邻算法
在约会网站上使用k近邻算法 思路步骤: 1. 收集数据:提供文本文件.2. 准备数据:使用Python解析文本文件.3. 分析数据:使用Matplotlib画二维扩散图.4. 训练算法:此步骤不适用于 ...
- Maven - web 实例
版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...
- python复习——数据输入输出
标准输入:x=input()…… 标准输出:print()…… 格式化输出:1.字符串格式化运算符% 例:print('Values are %s,%s,%s.'%(1,2,['one','two'] ...
- Nginx系列p4:进程结构
Nginx 有两种进程结构:单进程结构,多进程结构.本篇文章我们主要说多进程结构. 问:那为什么 Nginx 采用多进程结构,而不是多线程结构呢? 答:这是因为 Nginx 最核心的目的就是要保证高可 ...
- PAT 2012 冬
A Shortest Distance 题意相当于一个环,找出两点间从不同方向得到的距离中的最小值. #include <cstdio> #include <iostream> ...
- POJ 1094:Sorting It All Out拓扑排序之我在这里挖了一个大大的坑
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29984 Accepted: 10 ...
- Charles下载与破解方法
文章参考:charles4.2下载与破解方法以及配置https 1.Charles官网下载 地址:https://www.charlesproxy.com/latest-release/downloa ...
- php里parent,::和self的分别
01.php里parent,::和self的分别/*self的特点*/class a{ public static $a1="我是类a"; function ca() { echo ...
- 【十日冲刺计划】第一日 星遇Sprint1计划会议成果
——小组成员 赵剑峰 张傲 周龙海 Sprint 计划会议1:定出 Sprint 目标和既定产品Backlog. 会议进程(1小时) • 首先对sprint目标进行总体介绍,概括星遇的backlog, ...
- F5 BIG-IPLTM但比组网的三种连接模式(转)
原文链接:https://www.cnblogs.com/yujianadu/p/11850977.html作者:遇见阿杜