javascript-不常见的数据类型

总结了25个JavaScript 常见错误,别再说不知道报的是什么错了 如在对象方法中使用箭头函数, this 指向外部作用域而非对象本身。错误描述:在 if 、 for 等块级作用域中使用 var 声明变量,可能导致作用域问题。错误描述:如 map 、 filter 等数组方法返回新数组,原数组不变。解决方法:理解方法行为,如需修改原数组,使用合适方法如 forEach 结合赋值操作。解决方法:使用 let 声明变量, let 会在每次循环迭代中创建新的作用域。错误描述:长时间运行的应用中,未释放不再使用的资源,如事件监听器未移除。 阅读详情

这里是一些js中不常见的数据类型

Symbol

可以创建一个唯一的值

new Symbol();
// Uncaught TypeError: Symbol is not a constructor
const symbol1 = Symbol("lucas");
const symbol2 = Symbol("lucas");
symbol1 !== symbol2; // true

js 运行过程会设置一个全局 Symbol 注册表,可以通过Symbol.for(key)检索指定 key 的 Symbol 值

使用场景

  • 定义常量(枚举)
  • 对象私有属性。需要注意的是:遍历对象的时候,该属性不会出现在 for...in、for...of 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回,可以用 Object.getOwnPropertySymbols() 获取
  • 实现一个可遍历的对象
const obj = {
  from: 0,
  to: 10,
  [Symbol.iterator]: function () {
    return {
      current: this.from,
      last: this.to,
      next() {
        if (this.current <= this.last) {
          return { done: false, value: this.current++ };
        } else {
          return { done: true };
        }
      },
    };
  },
};

for (let num of obj) {
  console.log(num);
}
  • 其他内置 Symbol
    • Symbol.match
    • Symbol.toPrimitive

BigInt

可以用任意精度表示整数,并且可以正确执行整数运算而不会溢出。同为 BigInt 类型的变量才能做运算,并且 BigInt 永远不会等于 Number

new BigInt(5);
// Uncaught TypeError: BigInt is not a constructor
5n === BigInt(5);

const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);
// 9007199254740991n
const maxPlusOne = previousMaxSafe + 1n;
// 9007199254740992n

BigInt(1.5);
// RangeError
BigInt("1.5");
// SyntaxError

// 注意这里的类型转换
typeof 1n === "bigint"; // true
typeof BigInt("1") === "bigint"; // true

但要注意运算符有使用局限,比如不能用单目运算符、不能使用无符号右移等,详见 BigInt-MDN

Map

Map 跟普通对象的区别是不限键类型,并且是有序的

  • new Map()
  • map.set(key, value)
  • map.get(key)
  • map.has(key)
  • map.delete(key)
  • map.clear()
  • map.size
const map = new Map();
map.set("1", "lucas");
map.set(1, "gogogo");
console.log(map.get(1)); // 'gogogo'
console.log(map.get("1")); // 'lucas'
console.log(map.size); // 2
const obj = { name: "lucas" };
map.set(obj, "gogogo");

将对象转换成 Map 对象

const prices = new Map([
  ["banana", 1],
  ["orange", 2],
  ["meat", 10],
]);

使用 Object.fromEntries 将 Map 对象转换成一个普通对象

const prices = Object.fromEntries([
  ["banana", 1],
  ["orange", 2],
  ["meat", 10],
]);
// prices: { banana: 1, orange: 2, meat: 10 }

遍历 Map 对象可以用 map.keys()/map.values()/map.entrie()

Set

Set 跟普通数组的区别主要在于唯一,并且没有下标的概念

  • new Set(iterable)
  • set.add(value)。返回 Set 对象本身
  • set.delete(value)。删除值,如果 value 在这个方法调用的时候存在则返回 true ,否则返回 false
  • set.has(value)
  • set.clear()
  • set.size
let set = new Set();
let a = { name: "a" };
let b = { name: "b" };
let c = { name: "c" };
set.add(a);
set.add(b);
set.add(c);
set.add(a);
set.add(b);
alert(set.size); // 3

可以使用 for..of 或 forEach 来遍历 Set。除此之外,也可以用 set.keys()/set.values()/set.entrie() 实现遍历

let set = new Set(["oranges", "apples", "bananas"]);
set.forEach((value, valueAgain, set) => {
  // 这里的三个参数,前两者是一样的。注意下标是数组特有的东西
  console.log(value, valueAgain);
});

WeakMap

WeakMap 只能接受对象作为键,并保持了对键名所引用的对象的弱引用,在没有其他引用和该键引用同一对象,这个对象将会被垃圾回收(相应的 key 则变成无效的)

WeakSet

WeakSet 只能接受对象作为值,并且储存的对象都是被弱引用的,如果没有其他的变量或属性引用这个对象值,则这个对象将会被垃圾回收掉(不考虑该对象还存在于 WeakSet 中)

参考

JavaScript 中常见数据类型的方法 阅读详情

相关推荐

解决若依Vue3前后端分离---路由切换时显示白屏

解决基于Vue3若依前后端分离项目中出现的路由正常切换但是就是不显示数据的问题,也就是不发起网络请求的问题。

简单点的博客 1606

Node.js错误 { [Function: checkError] [Symbol(Symbol.toPrimitive)]: [Function] }

刚开始学习nodejs,写了一个引用nodejs内置的模块时出现{ [Function: checkError] [Symbol(Symbol.toPrimitive)]: [Function] }错误 出错代码 const os = require('os'); console.log(os.hostname); 改正错误: const os = require('os'); console....

qq_35134503的博客 890

Unity通用Buff系统,Buff编辑器(1,理论篇)(技能系统之Buff篇)

逻辑层根据游戏的规则和设计,控制Buff的生命周期、影响目标对象的属性或行为,以及处理Buff的交互和冲突。Buff堆叠和冲突:有些游戏中允许同类型的Buff叠加,以增加效果的强度,而有些游戏中可能不允许Buff叠加,只能由更强力的Buff来覆盖较弱的Buff。灵活个性化:每个游戏对象拥有自己的BuffManager,可以实现个体对象的独特Buff效果,增加游戏的多样性和个性化。自由控制:每个对象独立管理自己的Buff,可以自由地激活、更新和移除Buff效果,提供更精细的控制和逻辑实现。

u010082265的博客 4695

ES6 Symbol 最全详解

摘要:Symbol是ES6引入的原始数据类型,表示唯一值。每个Symbol值都是独一无二的,不可枚举、不可变。通过Symbol()创建,可带描述符用于调试。全局Symbol可通过Symbol.for()共享。常用作对象属性键,防止命名冲突,配合Object.getOwnPropertySymbols()遍历。内置Symbol(如Symbol.iterator)用于定义对象特殊行为,实现元编程。Symbol还用于模拟私有属性、定义枚举值等场景。注意事项包括不能使用new创建、需显式转换为字符串等。Symbol

油墨香^-^的博客 567

TI DSP的 FFT与IFFT库函数的使用测试

/** * Copyright (C) 2013 Guangzhou Tronlong Electronic Technology Co., Ltd. - www.tronlong.com * * @file dsplib_fft.c * * @brief Example application main file. * This application will run FFT performance test. * * @author Tronlong <support@tron.

ToneChip的专栏,一个传统的嵌入式码农,裸机编程 2678

信息学奥赛一本通高手训练1680:序列

题目 代码 #include<cstdio> #include<iostream> #include<cmath> #define LL long long using namespace std; const LL N = 1400000+7; const LL mod = 1e9+7; int n, t; LL pos[N], sum[N], ans[N]; struct node{ LL ll, rr; }a[N]; int main(){ p

qingfeixueyue的博客 468

【JS】1646- 你需要知道的Symbols

著名symbol著名symbol是一个在不同领域中都相同且未注册的symbol。如果我们要列出著名symbol,它们会是:Symbol.iteratorSymbol.toStringTagSymbol.toPrimitiveSymbol.asyncIteratorSymbol.hasInstanceSymbol.isConcatSpreadableSymbol.speciesSymbol.matc...

pingan8787 364

STM32独立实现CANOpen主机功能:从零构建轻量级控制方案

本文详细介绍了如何在STM32上不依赖CanFestival库,从零构建一个轻量级的CANOpen主机方案。文章深入剖析了CANOpen主机的三大核心功能——NMT网络管理、SDO参数配置与PDO过程数据交换,并提供了从硬件准备、驱动层构建到协议实现的完整代码实战。该方案代码精简,资源占用低,特别适合在资源受限的STM32平台上实现工业控制、电机驱动等场景的稳定通信。

potato的博客 1072

解决esbuild中Symbol.dispose的polyfill缺失问题:从原理到实践

你是否在使用esbuild打包时遇到过`Symbol.dispose`相关的运行时错误?特别是在开发服务器环境中,这种错误可能导致资源无法正确释放,进而引发内存泄漏或文件句柄耗尽。本文将深入分析esbuild对`Symbol.dispose`(符号处置器)的处理机制,揭示常见错误的根源,并提供两种实用的解决方案,帮助你在不同场景下正确处理这一问题。 ## 问题背景:什么是Symbol.dispo...

gitblog_00933的博客 519

Isaac Sim 6 利用Replicator实现高效语义分割与实例分割(实践指南5.10)

本文详细介绍了如何利用Isaac Sim 6的Replicator工具高效生成语义分割和实例分割数据集。通过虚拟环境自动标注,效率提升20倍以上,特别适用于农业机器人等计算机视觉项目。文章包含环境配置、场景构建、批量标注技巧及实例分割处理等实战指南,帮助开发者快速掌握合成数据生成技术。

weixin_42526415的博客 266

MITRE ATT&CK超详细学习笔记-01(背景,术语,案例)

MITRE是一个向美国政府提供系统工程、研究开发和信息技术支持的非营利性组织,于1958年从麻省理工学院林肯实验室分离出来后参与了许多最高机密的政府项目,开展了大量的网络安全实践。例如,MITRE公司在1999年发起了常见披露漏洞项目(CVE,CommonVulnera-bilitiesandExposures)并维护至今。其后,MITRE公司还维护了常见缺陷列表(CWE,CommonWeaknessEnumeration)这个安全漏洞词典。.........

Zichel77的博客 1万+

你不知道的ES6之Symbol面试考点

【代码】你不知道的ES6之Symbol面试考点。

qq_40269801的博客 204

详解AUTOSAR:专栏总述

本专栏系统介绍AUTOSAR规范及车用控制器软件开发,内容覆盖基础架构、SWC/RTE、通信栈、诊断、存储、安全、看门狗、工具链、环境配置与项目实战,并持续更新各模块的集成机制与工程要点。

不脱发的程序猿 3927

LZMA-JS 项目常见问题解决方案

LZMA-JS 是一个 JavaScript 实现的 Lempel-Ziv-Markov (LZMA) 链压缩算法库。该项目的主要目的是在浏览器和 Node.js 环境中提供高效的压缩和解压缩功能。LZMA-JS 支持异步和同步的压缩与解压缩操作,适用于需要处理大量数据的场景。 ## 新手使用注意事项及解决方案 ### 1. 加载 LZMA-JS 库时路径设置错误 **问题描述:** 新

gitblog_00677的博客 540

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

BERT-JS 项目常见问题解决方案

BERT-JS 项目常见问题解决方案 项目基础介绍 BERT-JS 是一个用于实现 BERT 序列化(Binary ERlang Term)的 JavaScript 库。BERT 是由 Erlang 开发团队创建的一种用于序列化 Erlang 项的格式,旨在通过简单高效的方式实现不同语言之间的通信。BERT-JS 项目允许开发者将 JavaScript 数据序列化为 BERT 格式,从而可以被 E...

gitblog_00510的博客 425

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

javascript基本数据类型与数据类型的转换

javascript基本数据类型与数据类型的转换

Z15800020057的博客 409

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Javascript 判断数据类型

如果开发者重写了某个对象的。

liangshanbo1215的博客 1191

【JavaScript用法】JavaScript(JS)的基本语法(JS数据类型,JS变量,JS运算符,JS流程控制语句)

JavaScript(JS)的基本语法 目录 JavaScript(JS)的基本语法 一. 与html结合方式 二. 注释 三. 数据类型: 四. 变量 五. 运算符(和Java有点类似) 六. 流程控制语句(和JAVA类似): 七. JS特殊语法: 一. 与html结合方式 1. 内部JS:定义<script>,标签体内容就是js代码(...

No8g攻城狮的博客 5106

JavaScript 中四种常见的数据类型判断方法

本文比较了 JS 中常用的数据类型判断方法, 我们探讨了它们的适用场景和注意事项, 这些方法在面试中也是常见的问题, 深入了解这些方法可以帮助我们准确判断数据类型, 提高代码质量和可靠性....

潜隐-前端 3440

谈谈JavaScript中常见的数据类型

前言:学好一门语言,数据类型也是关键,掌握了数据类型,也就掌握了关键的一部分,接下来我们走进JavaScript的数据,来看看它的数据类型. 数据类型:一.number二.string三.object四.undefined五.bool六.null 一.number number:就是数字类型,在其他语言中就相当于int,float等等一些数字类型,但是归根究底还是数字类型,我们来简单看一下. <script> var a = 0; console.log(ty

凭时间赢来的东西,时间肯定会为之作证 8万+

【Js】JavaScript数据类型隐式转换

类型相同基本类型,直接比较值引用类型比较指针类型不同,尝试转成number类型,先调用valueOf()转成number不行就再用toString()方法转成stringnull、NaN、undefined单独一套规则。

m0_57135756的博客 1万+

JS数据类型与转换,常见错误

JavaScript数据类型(number,string,Boolean,undefined,null)与显示隐式转换,还有常见错误。

m0_57851747的博客 1157

【JavaScript】一篇文章,带你拿捏JS中的数据类型

JavaScript有8种数据类型:7种基本类型(String、Number、Boolean、null、undefined、Symbol、BigInt)和引用类型Object。基本类型存储在栈内存中,引用类型存储在堆内存中,栈中保存引用地址。字符串不可变,数组可变;数字采用IEEE754标准,存在精度问题;布尔值用于逻辑运算;null表示空值,undefined表示未赋值;Symbol创建唯一标识符;BigInt处理大整数。引用类型包括对象、数组、函数等。内存分为代码空间(存储代码)、栈空间(存储基本类型和

sunshine_dd的博客 1479

【JavaScript】三、数据类型

未定义是比较特殊的类型,只有一个值 undefined只声明变量,未赋值的情况下,变量的默认值为 undefined一般不直接给某个变量赋一个undefined的值let ageconsole.log(age) //输出undefined声明一个变量后,常通过检测这个变量是不是undefined,就判断用户是否有数据传递过来。

llg___的博客 1447

【JavaScript】(二) JS数据类型

目录数据类型1、数据类型简介1.1 变量的数据类型1.2 数据类型的分类2、 简单数据类型2.1 基本数据类型2.2 数字型 Number2.2.1 数字型进制2.2.2 数字型范围2.2.3 数字型三个特殊值2.2.4 isNaN()2.3 字符串型 String2.3.1 字符串引号嵌套2.3.2 字符串转义符2.3.3 字符串长度2.3.4 字符串拼接2.3.5 字符串拼接加强2.4 布尔型 Boolean2.5 Undefined 和 Null3、 获取变量数据类型3.1 获取检测变量的数据.

weixin_48650082的博客 2084
上一篇: javascript-数据类型
下一篇: javascript-语法概览
__lucas
博客等级 码龄9年 329粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值