1.ES6常用功能与常见问题分析

1.js常用的数据类型:

基础类型:字符串、布尔型、数字、null、undefined、symbol(es6新增)、BigInt(和number相比不会失去精度)

复杂类型:Object、array、function

Number 类型的精度丢失

Number 类型的取值范围
-2^53+1  ------  2^53-1
具体值9007199254740991 共16位
 
BigInt
1,BigInt 是 JavaScript 中的一个新的原始类型,可以用任意精度表示整数。使用BigInt,即使超出 JavaScript Number 的安全整数限制,也可以安全地存储和操作大整数。
2,要创建一个 BigInt,在数字后面添加n后缀即可,例如,123变成123n。全局 BigInt(number) 函数可以用来将 Number 转换成 BigInt。换句话说,BigInt(123) === 123n。
3,BigInt 是 JavaScript 语言中的一个原始类型。因此,可以使用typeof操作符检测到这种类型:
4,因为 BigInts 是一个单独的类型,所以 a BigInt永远不会等于 a Number,例如 42n !== 42。要比较 a BigInt 和 a Number ,在比较之前将其中一个转换为另一个的类型或使用==
 
Symbol
应用场景1:使用 Symbol 来作为对象属性名( key )

Symbol 类型的key是不能通过 Object.keys() 或者 for...in 来枚举的,它未被包含在对象自身的属性名集合 (property names) 之中。所以,利用该特性,我们可以把一些不需要对外操作和访问的属性使用 Symbol 来定义。
也正因为这样一个特性,当使用 JSON.stringify() 将对象转换成JSON字符串的时候,Symbol 属性也会被排除在输出内容之外:

应用场景2:使用 Symbol 定义类的私有属性/方法
const PROP_NAME = Symbol()
const PROP_AGE = Symbol()

let obj = {
[PROP_NAME]: "周宇"
}
obj[PROP_AGE] = 18

obj[PROP_NAME] // '周宇'
obj[PROP_AGE] // 18

// ************************************

let obj = {
[Symbol('name')]: '周宇',
age: 18,
title: 'Engineer'
}

Object.keys(obj) // ['age', 'title']

for (let p in obj) {
console.log(p) // 分别会输出:'age' 和 'title'
}

Object.getOwnPropertyNames(obj) // ['age', 'title']

JSON.stringify(obj) // {"age":18,"title":"Engineer"}

// ************************************

const PASSWORD = Symbol()

class Login {
constructor(username, password) {
this.username = username
this[PASSWORD] = password
}

checkPassword(pwd) {
return this[PASSWORD] === pwd
}
}

export default Login



import Login from './a'

const login = new Login('admin', '123456')

login.checkPassword('123456') // true

login.PASSWORD // oh!no!
login[PASSWORD] // oh!no!
login["PASSWORD"] // oh!no!

// 由于Symbol常量PASSWORD被定义在a.js所在的模块中,外面的模块获取不到这个Symbol,也不可能再创建一个一模一样的Symbol出来(因为Symbol是唯一的),因此这个PASSWORD的Symbol只能被限制在a.js内部使用,所以使用它来定义的类属性是没有办法被模块外访问到的,达到了一个私有化的效果。
posted @ 2019-04-13 14:19  web前端-张小七  阅读(298)  评论(0编辑  收藏  举报