重学前端学习
建立知识架构
前端知识结构
- 文法
- 词法
- 语法
- 语义
- 运行时
- 类型
- 执行过程
“用规定的文法,去表达特定语义,最终操作运行时”
程序 = 算法 + 数据结构
对运行时来说,类型就是数据结构,执行过程就是算法
词法中有各种直接量、关键字、运算符,语法和语义则是表达式、语句、函数、对象、模块,类型则包含了对象、数字、字符串等......
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:
console.loh(0.1 + 0.2 == 0.3); // false
因为浮点数运算的精度问题导致左右结果相差微小的值
一般用 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 中对象具有的特定是:对象具有高度的动态性
动态语言
var o = { a: 1 };
o.b = 2;
console.log(o.a, o.b); // 1, 2
能在对象定义后,再往对象上加状态和行为,Java 则不行,因为他是静态的