当前位置: 首页 > wzjs >正文

住房和城乡建设部门户网站企业培训计划

住房和城乡建设部门户网站,企业培训计划,七宝做网站公司,帮传销做网站会违法吗目录 Symbol类型 一、Symbol 的核心特性 1. 唯一性 2. 不可变性 3. 不可枚举性 二、创建 Symbol 1. 基础创建 2. 全局 Symbol 注册表 三、Symbol 作为对象属性 1. 定义 Symbol 属性 2. 遍历 Symbol 属性 四、内置 Symbol 值 五、实际应用场景 1. 避免属性名冲突 …

目录

Symbol类型

一、Symbol 的核心特性

1. 唯一性

2. 不可变性

3. 不可枚举性

二、创建 Symbol

1. 基础创建

2. 全局 Symbol 注册表

三、Symbol 作为对象属性

1. 定义 Symbol 属性

2. 遍历 Symbol 属性

四、内置 Symbol 值

五、实际应用场景

1. 避免属性名冲突

2. 模拟私有属性

3. 定义迭代器

六、注意事项

七、总结

BigInt类型

一、BigInt 的核心特性

1. 定义与语法

2. 类型检测

3. 数值范围

二、BigInt 的运算规则

1. 算术运算

2. 比较运算

3. 位运算

4. 禁止混合运算

三、BigInt 的创建与转换

1. 类型转换

2. 类型强制转换

四、BigInt 的应用场景

1. 高精度整数计算

2. 时间戳与唯一ID

3. 数学库与算法

五、注意事项与兼容性

1. 兼容性

2. JSON 序列化

3. Math 对象方法

4. 性能考量

六、示例代码

1. 大数计算

2. 类型检测与转换

七、总结


Symbol类型

Symbol 是 ES6 引入的一种 原始数据类型,用于创建 唯一且不可变 的标识符,常用于对象属性的键,避免命名冲突。


一、Symbol 的核心特性

1. 唯一性

每个 Symbol 值都是唯一的,即使描述符(description)相同:

const sym1 = Symbol('key');
const sym2 = Symbol('key');
console.log(sym1 === sym2); // false
2. 不可变性

Symbol 值一旦创建,无法被修改,也无法通过 new 创建(避免装箱为对象):

const sym = Symbol();
// const obj = new Symbol(); // ❌ 报错:Symbol is not a constructor
3. 不可枚举性

作为对象属性时,Symbol 键默认不会被常规方法遍历:

const obj = { [Symbol('key')]: 'value' };
console.log(Object.keys(obj)); // []
console.log(Reflect.ownKeys(obj)); // [Symbol(key)](包含 Symbol 键)

二、创建 Symbol

1. 基础创建
// 无描述符
const sym1 = Symbol();// 带描述符(用于调试)
const sym2 = Symbol('description');
console.log(sym2.description); // "description"
2. 全局 Symbol 注册表

通过 Symbol.for() 创建或获取全局共享的 Symbol:

const globalSym1 = Symbol.for('globalKey'); // 创建或获取
const globalSym2 = Symbol.for('globalKey');
console.log(globalSym1 === globalSym2); // true// 获取全局 Symbol 的键
console.log(Symbol.keyFor(globalSym1)); // "globalKey"
  • 全局注册表机制:根据 key 在全局注册表中查找或创建 Symbol。

  • 相同 key 返回同一 Symbol。


三、Symbol 作为对象属性

1. 定义 Symbol 属性
const id = Symbol('id');
const user = {name: 'Alice',[id]: 123 // Symbol 键
};console.log(user[id]); // 123
2. 遍历 Symbol 属性

需使用 Object.getOwnPropertySymbols()

const symbols = Object.getOwnPropertySymbols(user); // [Symbol(id)]

四、内置 Symbol 值

JavaScript 预定义了一系列 内置 Symbol,用于改变对象的默认行为:

内置 Symbol用途示例
Symbol.iterator定义对象的默认迭代器obj[Symbol.iterator] = function*() { yield 1; }
Symbol.toStringTag定制 Object.prototype.toString 输出obj[Symbol.toStringTag] = 'MyObject'; → obj.toString() → [object MyObject]
Symbol.hasInstance自定义 instanceof 行为class MyClass { static [Symbol.hasInstance](obj) { ... } }
Symbol.species指定派生对象的构造函数class MyArray extends Array { static get [Symbol.species]() { return Array; } }

五、实际应用场景

1. 避免属性名冲突
// 库 A 的扩展
const LIB_A_KEY = Symbol('libA');
Object.prototype[LIB_A_KEY] = function() { /* ... */ };// 库 B 的扩展
const LIB_B_KEY = Symbol('libB');
Object.prototype[LIB_B_KEY] = function() { /* ... */ };
2. 模拟私有属性
const _counter = Symbol('counter');
class Counter {constructor() {this[_counter] = 0; // “私有”属性}increment() {this[_counter]++;}
}
3. 定义迭代器
const range = {start: 1,end: 5,[Symbol.iterator]() {let current = this.start;return {next: () => ({value: current,done: current++ > this.end})};}
};for (const num of range) {console.log(num); // 1, 2, 3, 4, 5
}

六、注意事项

  1. JSON 序列化
    Symbol 属性会被 JSON.stringify() 忽略:

    const obj = { [Symbol('key')]: 'value' };
    console.log(JSON.stringify(obj)); // {}
  2. 类型转换
    Symbol 无法隐式转换为字符串或数值,需显式调用 toString()

    const sym = Symbol('desc');
    console.log(String(sym)); // "Symbol(desc)"
    console.log(sym + ''); // ❌ TypeError: Cannot convert a Symbol to a string
  3. 跨 Realm 共享
    不同 iframe 或 Web Worker 中的全局 Symbol 注册表是隔离的,需通过 postMessage 显式传递。


七、总结

特性说明
唯一性每个 Symbol 值唯一,避免命名冲突
不可变性创建后无法修改,不可通过 new 实例化
私有性通过 Symbol 键模拟私有属性(需配合模块作用域)
内置 Symbol改变对象默认行为(如迭代、类型标签)

Symbol 的核心价值 在于提供了一种安全、可控的元编程机制,适用于库开发、框架设计及复杂对象行为定制。


   

BigInt类型

BigInt 是 JavaScript 中用于表示 任意精度大整数 的数据类型,解决了传统 Number 类型在超过 2^53 - 1(即 Number.MAX_SAFE_INTEGER)时的精度丢失问题。


一、BigInt 的核心特性

1. 定义与语法
  • 字面量表示法:在数字后加 n

    const bigInt = 9007199254740993n; // 超过 Number 的安全整数范围
  • 构造函数转换:通过 BigInt() 转换其他类型。

    const fromString = BigInt("12345678901234567890");
    const fromNumber = BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991n
2. 类型检测
  • 使用 typeof 检测返回 "bigint"

    typeof 123n; // "bigint"
3. 数值范围
  • 无固定上限:仅受内存限制,可表示任意大的整数。

  • 不支持小数:BigInt 仅用于整数,小数部分会被截断。

    BigInt(3.9); // 3n(直接截断,非四舍五入)

二、BigInt 的运算规则

1. 算术运算

支持常规运算符(+-***/%),但除法返回整数部分。

const a = 10n;
const b = 3n;
console.log(a / b); // 3n(舍去小数)
2. 比较运算

可与 Number 或其他 BigInt 进行比较(=====>< 等)。

10n === 10;   // false(类型不同)
10n == 10;    // true(值相等)
10n > 5;      // true
3. 位运算

支持位操作符(&|^<<>>),但操作数必须同为 BigInt

const mask = 0b1111n;
const result = 0b1010n & mask; // 0b1010n & 0b1111n → 0b1010n(即 10n)
4. 禁止混合运算

BigInt 与 Number 不可直接运算,需显式转换。

// 10n + 5;   // ❌ TypeError: Cannot mix BigInt and other types
10n + BigInt(5); // ✅ 15n

三、BigInt 的创建与转换

1. 类型转换
  • 字符串转 BigInt

    BigInt("123"); // 123n
    BigInt("0xFF"); // 255n(支持十六进制)
    BigInt("0b1010"); // 10n(支持二进制)
  • Number 转 BigInt

    BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991n
2. 类型强制转换
  • 隐式转换:部分操作(如模板字符串)会隐式调用 toString()

    `Value: ${100n}`; // "Value: 100"
  • 显式转换

    Number(100n); // 100(可能丢失精度)
    Boolean(0n);  // false(0n 为假值)

四、BigInt 的应用场景

1. 高精度整数计算

处理金融、加密算法中的大整数运算:

const largePrime = 957496696762772407663n;
const hash = largePrime * 2654435761n; // 避免溢出
2. 时间戳与唯一ID

生成高精度时间戳或分布式唯一ID:

const timestamp = BigInt(Date.now()) * 1000000n + process.hrtime.bigint();
3. 数学库与算法

实现大数阶乘、斐波那契数列等:

function factorial(n) {let result = 1n;for (let i = 2n; i <= n; i++) {result *= i;}return result;
}
console.log(factorial(20n)); // 2432902008176640000n

五、注意事项与兼容性

1. 兼容性
  • 支持环境:现代浏览器(Chrome 67+、Firefox 68+、Node.js 10.4+)。

  • Polyfill:无完美 Polyfill,可通过第三方库(如 big-integer)模拟。

2. JSON 序列化

BigInt 无法直接通过 JSON.stringify() 序列化,需自定义转换:

const data = { id: 12345678901234567890n };
const json = JSON.stringify(data, (key, value) =>typeof value === 'bigint' ? value.toString() : value
);
// {"id":"12345678901234567890"}
3. Math 对象方法

BigInt 不支持 Math 方法(如 Math.pow()),需手动实现:

function pow(base, exponent) {return base ** exponent; // 使用 ** 运算符
}
pow(2n, 10n); // 1024n
4. 性能考量
  • 内存占用:BigInt 比 Number 占用更多内存,需谨慎处理超大数值。

  • 运算速度:BigInt 运算通常慢于 Number,高频计算时需评估性能。


六、示例代码

1. 大数计算
const maxSafe = Number.MAX_SAFE_INTEGER; // 9007199254740991
const unsafe = maxSafe + 2; // 9007199254740992(精度丢失)
const safe = BigInt(maxSafe) + 2n; // 9007199254740993n(精确)
2. 类型检测与转换
const big = 100n;
if (typeof big === 'bigint') {const num = Number(big); // 转换为 Number(可能丢失精度)
}

七、总结

特性BigIntNumber
整数范围任意精度±(2^53 - 1)
小数支持是(双精度浮点数)
运算符兼容需与同类型运算,禁止混合支持常规运算
内存占用较高较低
适用场景大整数计算、加密、高精度ID常规数值运算

BigInt 的核心价值在于解决 JavaScript 中 大整数精度丢失 的问题,适用于科学计算、密码学等领域。使用时需注意兼容性、类型转换及性能影响。


http://www.dtcms.com/wzjs/288542.html

相关文章:

  • 网站建设的介绍seo关键字排名
  • 网站页面设计招聘如何广告推广
  • 怎样做公司的网站建设百度url提交
  • 软件下载中心成都seo正规优化
  • wordpress文章站主题公司产品推广文案
  • ubuntu做网站开发搜狐财经峰会
  • 西宁做腋臭北大网站l青岛网站建设方案服务
  • 个人工商户做网站要上税吗写手接单平台
  • 深圳优化网站公司百度收录查询方法
  • 郑州网站建设修改网站怎么优化自己免费
  • 子网站数量开封网站优化公司
  • 做网站多大上行速度朋友圈广告投放价格表
  • 电气工程专业毕业设计代做网站东莞seo搜索
  • 潍坊 专业网站建设网站seo哪里做的好
  • 手机网站制作代码网站流量排名
  • 做旅游网站挣钱吗百度推广好不好做
  • 网站软件app接推广怎么收费
  • 网站图片上传不上去是什么情况百度云盘搜索引擎入口
  • 有没有电脑做兼职的网站国家免费技能培训平台
  • 网址和网站的区别黄页引流推广网站软件免费
  • 政府类网站开发公司营销网站建设
  • 网站建设sem怎么做电商运营工资大概多少
  • 网站设计专业有前途吗百度推广营销怎么做
  • 对网站建设的建议优化seo是什么
  • 网站建设优化一体关键字是什么意思
  • 免费网站建设推荐自己如何制作一个网页
  • 外管局网站上做预收登记想建立自己的网站
  • 网站建设实训心得及收获如何制作付费视频网站
  • 网站空间ip凡科建站代理登录
  • 把网站内的文本保存到txt怎么做竞价托管公司联系方式