Logan

Results 45 issues of Logan

# 开源项目中应用原型继承的案例 ## jQuery [jQuery源码](https://github.com/jquery/jquery/blob/master/src/core.js) ```js var jQuery = function(selector, context) { return new jQuery.fn.init(selector, context) } jQuery.fn = jQuery.prototype = { constructor: jQuery, ... // 各种原型方法 } jQuery.fn.init =...

前端知识体系-JavaScript基础

# 一、函数的调用 > 全局环境的this指向全局对象,在浏览器中就是我们熟知的window对象 说到`this`的种种情况,就离不开函数的调用,一般我们调用函数,无外乎以下四种方式: 1. 普通调用,例如`foo()`。 2. 作为对象方法调用,例如`obj.foo()`。 3. 构造函数调用,例如`new foo()`。 4. 使用`call`、`apply`、`bind`等方法。 除箭头函数外的其他函数被调用时,会在其词法环境上绑定`this`的值,我们可以通过一些方法来指定`this`的值。 1. 使用`call`、`apply`、`bind`等方法来显式指定`this`的值。 ```js function foo() { console.log(this.a) } foo.call({a: 1}) // 输出: 1 foo.apply({a: 2})...

深入JavaScript系列

# 实现继承的方式及优缺点 ## 面向对象编程 面向对象编程(Object Oriented Programming),简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。 面向对象编程的三大基本特性:**封装,继承,多态**。 ## 封装 将一段逻辑/概念抽象出来做到“相对独立”。封装的概念并不是OOP独有的,而是长久以来一直被广泛采用的方法。主要目的总结为两点: - **封装数据和实现细节**。达到保护私有内容、使用者无需关心内部实现、且内部变化对使用者透明的目的。 - **封装变化**。将不变和可变部分隔离,提升程序稳定性、复用性和可扩展性。 JavaScript中典型的封装就是模块化,实现方法有**闭包**、**ES Module**、**AMD**、**CMD**、**CommonJS**等。 ## 多态 多态的概念也不是OOP独有的。所谓多态就是同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。 多态的目的就是**用对象的多态性消除条件分支语句**,提升程序的可拓展性。 JavaScript是一门弱类型多态语言,具有与生俱来的多态性。 ## 继承 两大概念: - 类(Class):抽象的模板; - 实例(Instance):根据类创建的具体对象。 JavaScript中没有类的概念,使用**构造函数**作为对象模板,通过原型链来实现继承(ES6...

前端知识体系-JavaScript基础

# 隐式类型转换 - 1. 在加法运算时 - 1-1 若两操作数中有字符串,则优先转字符串; - 1-2 若两操作数都不是字符串,则优先转数字,若是引用类型转换得到字符串,则回到1-1。 - 2. 其他运算及`==`,均优先转数字,若是转换得到字符串,再尝试转数字,转成则计算,转不成则`NaN`; - 3. `null`转数字为0,`undefined`转数字为`NaN`; - 4. 引用类型转数字`valueOf`优先级大于`toString`,转字符串`toString`优先级大于`valueOf`,先调用优先级高的,得不到基本类型再调用优先级低的。 - 5. `+varible`强制转数字,失败则为`NaN`; - 5. 多个加号从左到右依次计算。 ```js // 满足1-1,左边的1转字符串'1',相加为'11' 1...

前端知识体系-JavaScript基础

# 原型及JavaScript中的原型规则 ## 原型与原型链 **原型** JavaScript中,一个对象从被创建开始就和另一个对象关联,从另一个对象上继承其属性,这个`另一个对象`就是**原型**。 **获取原型的方法** 1. 可以通过`Object.getPrototypeOf(obj)`来获取`obj`的原型。 2. 当然对象都是通过构造函数`new`出来的(字面量对象也可以这么理解),也可以通过访问对应构造函数的`prototype`属性来获取其原型。 ```js const obj = {} expect(Object.getPrototypeOf(obj) === Object.prototype).toBe(true) ``` **原型链** 当访问一个对象的属性时,先在对象的本身找,找不到就去对象的原型上找,如果还是找不到,就去对象的原型(原型也是对象,也有它自己的原型)的原型上找,如此继续,直到找到为止,或者查找到最顶层的原型对象中也没有找到,就结束查找,返回`undefined`。这条由对象及其原型组成的链就叫做**原型链**。 ## 特殊原型规则 **原型链顶层** 普通对象可以理解为`Object`构造函数创建的,即普通对象的原型都指向`Object.prototype`,`Object.prototype`也是个对象,但是其原型比较特殊,为`null`,是原型链的顶层,**切记!!!** ```js expect(Object.getPrototypeOf({})).toBe(Object.prototype) expect(Object.getPrototypeOf(Object.prototype)).toBe(null) ```...

前端知识体系-JavaScript基础

# 数字精度丢失(0.1 + 0.2 = 0.30000000000000004) ## IEEE754 JavaScript中的`Number`类型是基于 [IEEE 754](https://zh.wikipedia.org/wiki/IEEE_754) 标准的双精度 64 位二进制格式的值。 ![](https://user-gold-cdn.xitu.io/2018/9/16/165e0eb7f4d6c50f?imageView2/0/w/1280/h/960/format/webp/ignore-error/1) - **符号位**:1位,标识数值正负,**0为正,1为负**; - **指数部分**:11位,表示范围为`0~2047`,减去偏移常数`bias`为1023,即实际范围为`-1023~1024`; - 展开指数部分详细讲解 **指数偏移常量**:计算指数时要减去的常量。 指数位数若为e,指数偏移常量`bias`则为 2e-1,双精度64位浮点数中,指数位数为11位,故偏移常量为`1023`,指数最终取值为 `0 - 1023` ~ `2047 -...

前端知识体系-JavaScript基础

# 判断JavaScript数据类型 ## 实现判断数据类型功能 ```js function getType(v) { // `null` if (v === null) return 'null' const baseType = typeof v // `undefined`、`number`、`string`、`boolean`、`symbol`、`bigInt`、`function` if (baseType !== 'object') return baseType //...

前端知识体系-JavaScript基础

# Null 与 Undefined - `null`表示已被赋值,但值为空,即将一个变量显式赋值为`null`是正常的 - `undefined`表示已声明还未定义的变量 或 对象上不存在的属性,故将变量或属性显式赋值为`undefined`是不正常的 - `null`和`undefined`转换为布尔值均为`false` - `null`转换为数值为`0`,`undefined`转换为数值为`NaN` - `null == undefined`,因为`ECMAScript`定义如此,并没有发生隐式类型转换 > ECMAScript中定义 "If x is null and y is undefined, return true."...

前端知识体系-JavaScript基础

# 基本类型的装箱与拆箱 ## 包装类型 为了便于操作基本类型值,JavaScript定义了 `Boolean`、`Number`、`String`、`Symbol`、`BigInt` 几种包装类型(属于引用类型),每种包装类型都有一种对应的基本类型。 操作基本类型时,JS引擎会自动创建基本类型对应的包装类型。 展开查看模拟代码 ```js const name = 'Logan Lee' const firstName = name.substr(6) // 执行时相当于 const name = 'Logan Lee' const nameObj = new...

前端知识体系-JavaScript基础

# Symbol的应用及实现 ## Symbol `Symbol([description])`函数会返回`symbol`类型的值。 - *description*:可选的字符串。`symbol`的描述,可用于调试但不能访问symbol本身。 - 每个从`Symbol()`返回的`symbol`值都是唯一的; - `symbol`是一种基本数据类型; - `symbol`类型唯一目的:作为对象属性的标识符。 ```js const symbol1 = Symbol() const symbol2 = Symbol('foo') ``` ## 全局共享的Symbol `Symbol.for(key)`:全局symbol注册表中有与`key`对应的`symbol`则返回,否则在全局symbol注册表新建与`key`关联的`symbol`并返回。 `Symbol.keyFor(symbol)`:获取全局symbol注册表中与某个 `symbol` 关联的键,没有则返回`undefined`。 ```js...

前端知识体系-JavaScript基础