文章目录
1. Number 数字
-
number
是javascript
中的一种数据结构,数字可以代小数点,也可以不带。 -
数字可以有很多操作 列如 加
+
、减-
、乘*
、除/
等 -
当然也包含一些特殊数值
Infinity
、-Infinity
、NaN
- Infinity 表示数学概念中的 无穷大,比任何一个数值都大的特殊值
console.log(Infinity)
- nan 则表示一个计算错误,他是一个不正确或一个未定义的数学操作。
console.log(NaN + 1) // NaN
let num1 = 1 let num2 = 1.3 console.log(typeof num1) // number
2. BigInt 整数类型
- 在 JavaScript 中,number 类型无法安全的表示 大于
(9007199254740991)
与 小于(-9007199254740991)
的整数 - 在 number 类型中 整数的大小超过这个范围就会造成精度问题,在存储的时候可能存储的是 “近似值(相似)”
console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992
- biglnt 类型则是 ES6 中新增的一个类型,用与解决 number 的精度问题
// 尾部的 "n" 表示这是一个 BigInt 类型
const bigInt1 = 1234567890123456789012345678901234567890n; //1234567890123456789012345678901234567890n
const bigInt2 = 1234567890123456789012345678901234567890; // 1.2345678901234568e+39
console.log(typeof bigInt1) // bigint
3. Boolean 布尔值
- 布尔类型 仅包含两个值:
true(真)
和false(假)
let boolean1 = false;
let boolean2 = true
可以作比较
var a = 10;
var b = 6
var isShow = a < b; // false
console.log(typef isShow) // boolean
4. null 值
- 特殊的
null
值不属于任何一种类型,规范中描述其是一种原始类型,表示有意不包含任何对象值
let num = null
// 比如你想给这个表量赋值,但是因为一些原因,但是返回null,没有成功创建
function fn(msg){
if(!msg){
return null
}
return {message:"hello world"}
}
fn("白菜") // {mesage:"hello world"}
fn() // null
console.log(typeof null) // 'object' 默认应该空对象
- null 值同时也是一个假值
null、false、、‘’、undefined、NaN
都是假值,在条件语句中遇到 JavaScript会默认把他们转换成 false
5. undefined 值
undefined
表示未初始化(未被赋值)的变量或对象属性的值
// 列:
let myMsg; // 这个时候的 myMsg 值就是undefined
myMsg = "hello world"
不严格比对的时候
null == undefined // true
严格相等的时候
null === undefined // false
console.log(typeof undefined) // undefined
6. Symbol 类型
-
ES6 引入的一直新的原始数据类型 Symbol,表示独一无二的值,最大的用法就是用来定义对象的唯一属性名。
-
基本用法:
let sy = Symbol('ab')
console.log(sy) // Symbol(kk)
console.log(typeof sy) // symbol
let sy1 = Symbol('ab')
sy === sy1 // false 就算是相同参数 也不会相等
- 正是因为每一个 symbol 的值都是不相等的,所以symbol 作为对象的属性名,可以更大可能的保证属性名不会出现重复
let syName = Symbol('name')
let obj = {}
obj[syName] = '白菜'
console.log(obj) // {Symbol(name): '白菜'}
因为symbol当对象属性名时,不能通过 点运算符去获取,要通过 中括号的方式
console.log(obj.name) // undefined
- 问题:
- symbol 值作为属性名时,改属性是公有属性不是私有属性了,可以在类外包访问,但是不能通过
for...in
、for...of
去获取,也不会被Object.keys()
、Object.getOwnPropertyNames()
返回, 但是可以通过Object.getOwnPropertySymbols()
和Reflect.ownKeys()
取到
- symbol 值作为属性名时,改属性是公有属性不是私有属性了,可以在类外包访问,但是不能通过
let syName = Symbol('name')
let obj = {}
obj[syName] = "白菜"
for(let i in obj){
console.log(obj)
} // 不返回
Object.keys(obj) // []
Object.getOwnPropertySymbols(obj); //[Symbol(name)]
Reflect.ownKeys(obj); // [Symbol(name)]
6-1. Symbol.for
-
全局注册表
-
根据上面所看到的,每个
symbol
的创建都是不同的,但是有时我们也希望他们名称相同,为了实现这个操作,我们通过symbol.for(key)
的方式去检查全局注册表,如果有一个描述key
的symbol
, 则返回该symbol
,否则就会创建一个新的symbol
,并通过 给定的key
存入到注册表中
let id = Symbol.for('id') // 如果 Symbol 不存在 就会创建它
let idIn = Symbol.for("id")
console.log(id === idIn) // true
6-2. Symbol.keyFor
- 上面symbol、symbol.for 按名字返回一个symbol,而这个则是刚好相反,通过全局 symbol 返回一个名字
let myName = Symbol.for("name")
let myAge = Symbol("age")
console.log(Symbol.keyFor(myName)) // name
console.log(Symbol.keyFor(myAge)) // undefined 因为 myAge 不是通过全局注册表注册的,所以读取不到对应的