js 关于类型

全局对象

全局对象:对于任何JS程序,在程序开始之前,JS解释器都会初始化一个全局对象供程序使用,这个全局对象占且称为“JS全局对象”

  • “JS全局对象”拥有一些全局属性:比如undefined, Infinity和NaN。
  • “JS全局对象”拥有一些全局对象:比如Math和JSON。
  • “JS全局对象”拥有一些全局普通函数:比如isNaN(), parseInt()和eval()。
  • “JS全局对象”拥有一些全局构造函数:比如Object(), Array(), Date(), RegExp()和String()。
Number
  • NaN,占用了 9007199254740990,这原本是符合 IEEE 规则的数字;
  • Infinity,无穷大;
  • -Infinity,负无穷大

1,区分 +0 和 -0 的方式,正是检测 1/x 是 Infinity 还是 -Infinity。
2,Number 类型中有效的整数范围是 -0x1fffffffffffff 至 0x1fffffffffffff
同样根据浮点数的定义,非整数的 Number 类型无法用 = 也不行) 来比较
正确的比较方式是:Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON

Symbol

:::info
这个类后续需要加强学习一下,目前不太懂
:::
symbol 防止对象中出现相同的key:比如你用了别人提供的类,在定义方法的时候,为了防止与原来的方法冲突,从而可以使用symbol解决这个问题
Symbol 可以具有字符串类型的描述,但是即使描述相同,Symbol 也不相等。

Object

在 JavaScript 中,对象的定义是“属性的集合”
StringToNumber

在不传入第二个参数的情况下,parseInt 只支持 16 进制前缀“0x”,而且会忽略非数字字符,也不支持科学计数法。
在一些古老的浏览器环境中,parseInt 还支持 0 开头的数字作为 8 进制前缀,这是很多错误的来源。所以在任何环境下,都建议传入 parseInt 的第二个参数,而 parseFloat 则直接把原字符串作为十进制来解析,它不会引入任何的其他进制。
所以String 转数字,推荐使用StringToNumber。而不要用parseInt 和 parseFloat

NumberToString

在较小的范围内,数字到字符串的转换是完全符合你直觉的十进制表示。当 Number 绝对值较大或者较小时,字符串表示则是使用科学计数法表示的。这个算法细节繁多,我们从感性的角度认识,它其实就是保证了产生的字符串不会过长。

JavaScript 标准对基于对象的定义,这个定义的具体内容是:“语言和宿主的基础设施由对象来提供,并且 JavaScript 程序即是一系列互相通讯的对象集合”

在 ES6 出现之前,大量的 JavaScript 程序员试图在原型体系的基础上,把 JavaScript 变得更像是基于类的编程,进而产生了很多所谓的“框架”,比如 PrototypeJS、Dojo。

对象有如下几个特点。:
对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象。
对象有状态:对象具有状态,同一对象可能处于不同状态之下。
对象具有行为:即对象的状态,可能因为它的行为产生变迁。

JavaScript 中对象独有的特色是:对象具有高度的动态性,这是因为 JavaScript 赋予了使用者在运行时为对象添改状态和行为的能力。

Js 的属性分为两类: 数据属性和访问器属性
数据属性:

  • value: 属性的值
  • writable: 能否被赋值
  • enumerable: 能否for in 枚举该属性
  • configurable:能否被删除或者改变特征值

访问器属性(getter/setter)

  • getter: 函数/undefined 在取属性值的时候被调用
  • setter:函数/undefined 在设置属性值的时候被调用
  • enumerable: 能否for in 枚举该属性
  • configurable:能否被删除或者改变特征值

默认的属性,writable、enumerable、configurable 都为true;如果想设置他们的默认值可以用以下写法


    var o = { a: 1 };
    Object.defineProperty(o, "b", {value: 2, writable: false, enumerable: false, configurable: true});
    //a和b都是数据属性,但特征值变化了
    Object.getOwnPropertyDescriptor(o,"a"); // {value: 1, writable: true, enumerable: true, configurable: true}
    Object.getOwnPropertyDescriptor(o,"b"); // {value: 2, writable: false, enumerable: false, configurable: true}
    o.b = 3;
    console.log(o.b); // 2

:::info
JavaScript 对象的具体设计:具有高度动态性的属性集合。
:::
JavaScript是基于原型编程
从 ES6 以来,JavaScript 提供了一系列内置函数,以便更为直接地访问操纵原型。三个方法分别为:

  • Object.create 根据指定的原型创建新对象,原型可以是 null;
  • Object.getPrototypeOf 获得一个对象的原型;
  • Object.setPrototypeOf 设置一个对象的原型。

new 运算 接受了一个构造器和一组调用参数,实际上做了几件事

  • 将构造器的prototype 属性(注意与私有字段[[prototype]])为原型,创建新对象
  • 将this和调用参数传给构造器,执行
  • 如果构造器返回的是对象则返回,否则返回第一步创建的对象

在新的 ES6 版本中,我们不再需要模拟类了:我们有了光明正大的新语法。而原型体系同时作为一种编程范式和运行时机制存在。
我们可以自由选择原型或者类作为代码的抽象风格,但是无论我们选择哪种,理解运行时的原型系统都是很有必要的一件事。

JavaScript 中的对象分类

  • 宿主对象:有JavaScript宿主环境提供的对象,他们的行为完全有宿主环境决定
  • 内置对象:有JavaScript语言提供的对象
    • 固有对象:有标准规定随着JavaScript运行时创建而自动创建的对象实力
    • 原生对象:可以由用户通过Array、RegExp等内置构造器或者特殊语法创建的对象
    • 普通对象:由{}语法、Object构造器或者class关键字定义类创建的对象,它能够被原型继承
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值