Skip to content

重学前端学习

建立知识架构

前端知识结构

  • 文法
    • 词法
    • 语法
  • 语义
  • 运行时
    • 类型
    • 执行过程

“用规定的文法,去表达特定语义,最终操作运行时”

程序 = 算法 + 数据结构

对运行时来说,类型就是数据结构,执行过程就是算法

词法中有各种直接量、关键字、运算符,语法和语义则是表达式、语句、函数、对象、模块,类型则包含了对象、数字、字符串等......

05-JavaScript 类型:关于类型,有哪些你不知道的细节

问题:

  • 为什么有的编程规范要求用 void 0 代替 undefined?
  • 字符串有最大长度吗?
  • 0.1 + 0.2 不是等于 0.3 么?为什么 JavaScript 里不是这样的?
  • ES6 新加入的 Symbol 是个什么东西?
  • 为什么给对象添加的方法能用在基本类型上?

运行时类型是代码实际执行过程中我们用到的类型。所有的类型数据都会属于 7 个类型之一。从变量、参数、返回值到表达式中间结果,任何 JavaScript 代码运行过程中产生的数据,都具有运行时类型

1.为什么有的编程规范要求用 void 0 代替 undefined?

Undefined 类型表示为定义,它的类型只有一个值,就是 undefined。任何比那里在赋值前是 Undefined 类型,值为 undefined,一般我们可以用全局变量 undefined(就是名为 undefined 的这个变量)来表示这个值,或者 void 运算来把任一表达式变成 undefined 值。

但是 javascript 中的 undefined 是一个变量,而并非一个关键字,这是 javascript 语言公认的设计失误之一,所以为了避免无意被篡改,建议 void(0)来获取 undefined 值

undefined 和 null 有一定的表意差别,null 表示的是:定义了但是为空 。所以实际编程时,一般把变量赋值为 undefined,这样可以保证所以值为 undefined 的遍历,都是从未赋值的自然状态

Null 类型也是一个值,就是 null,它的语义表示控制,与 undefined 不同,,null 是 JavaScript 关键字,所有在任何代码中,你都可以放心用 null 关键字来获取 null 值

2.我们来看看字符串是否有最大长度。

2^53 - 1

JavaScript 中的 Number 类型有 18437736874454810627(即 2^64-2^53+3) 个值

3.为什么在 JavaScript 中,0.1+0.2 不能=0.3:

js
console.loh(0.1 + 0.2 == 0.3); // false

因为浮点数运算的精度问题导致左右结果相差微小的值

一般用 JavaScript 提供的最小精度值

javascript
console.log(Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON); // true

Symbol

symbol 是 ES6 中引入的新类型,它是一切非字符串的对象 key 的集合,在 ES6 规范中,整个对象系统被用 Symbol 重塑

Object

Object 是 JavaScript 中最复杂的类型,也是 JavaScript 的核心机制之一。Object 表示对象的意思,它是一切有形和无形物体的总称

JavaScipt 对象的特征

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

对象具有唯一性

一般来说,各种语言的对象唯一标识性都是用内存地址来体现的,对象具有唯一标识的内存地址,所以具有唯一的标识

在 JavaScript 中,对象的状态和行为其实都被抽象为了属性

JavaScript 中对象具有的特定是:对象具有高度的动态性

动态语言

javascript
var o = { a: 1 };
o.b = 2;
console.log(o.a, o.b); // 1, 2

能在对象定义后,再往对象上加状态和行为,Java 则不行,因为他是静态的

JavaScript 对象的两类属性