JavaScript_基础数据类型

本文详细介绍了JavaScript中的Number、BigInt、Boolean、null、undefined和Symbol类型,包括它们的定义、特点、操作以及ES6新增的Symbol.for和Symbol.keyFor方法的应用。
摘要由CSDN通过智能技术生成

1. Number 数字

  • numberjavascript 中的一种数据结构,数字可以代小数点,也可以不带。

  • 数字可以有很多操作 列如 加+ 、减-、乘*、除/

  • 当然也包含一些特殊数值 Infinity-InfinityNaN

    • 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...infor...of 去获取,也不会被 Object.keys()Object.getOwnPropertyNames() 返回, 但是可以通过 Object.getOwnPropertySymbols()Reflect.ownKeys() 取到
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) 的方式去检查全局注册表,如果有一个描述keysymbol, 则返回该 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 不是通过全局注册表注册的,所以读取不到对应的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值