《YDKJS 中卷》读书笔记

《YDKJS 中卷》读书笔记

类型

7 个内置类型:stringnumberbooleanobjectundefinedsymbolnull

1
2
3
4
5
6
7
8
9
10
11
12
typeof undefined      === "undefined";
typeof true === "boolean";
typeof 42 === "number";
typeof "42" === "string";
typeof {} === "object";
typeof null === "object";
typeof [] === "object";
typeof Symbol() === "symbol";
typeof function () {} === "function"

// 检测a是否为null
(!a && typeof a === "object")) === true;

函数对象

函数对象是object的一个子类型,具有一个内部属性[[call]],该属性使其可以被调用。

属性 含义
[[call]] 表明该对象是一个可调用对象
length 函数对象声明的行参个数
阅读更多
《YDKJS 上卷》读书笔记

《YDKJS 上卷》读书笔记

第一部分 作用域与闭包

作用域

为 JS 引擎提供支持,主要做以下 2 件事:

  1. 收集维护所声明的标识符(变量、函数)组成的一系列查询
  2. 确定当前代码对这些标识符的访问权限

JS 引擎主要通过LHSRHS从内向外(作用域可以嵌套)访问作用域。

LHS 找到标识符(变量)容器本身,然后引擎给它赋值
RHS 则是找到该容器的值,引擎使用该值进行其他操作

查询结果:

  1. RHS 找不到,抛出ReferenceError异常
  2. LHS 找不到
    1. 非严格模式下在全局作用域创建同名变量
    2. 严格模式抛出ReferenceError异常

另,TypeError异常表示作用域查询成功了但是对结果的操作是非法的,比如对不可调用对象执行调用操作、引用nullundefined的属性等。

阅读更多
JS设计模式

JS设计模式

设计模式的主题是将不变的部分与变化的部分找出来,然后将变化的地方通过模式封装起来。

基础

new、this、call、apply、bind

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function Person(name) {
this.name = name;
}

Person.prototype.getName = function () {
return this.name;
};

function New() {
// 新建一个对象,原型默认为Object.prototype
const obj = new Object();
// 取出构造函数
const construct = [].shift.call(arguments);
// 将新建的对象原型设置为构造函数对象的原型
Object.setPrototypeOf(obj, construct.prototype);
// 调用构造函数,设置构造函数的this为新建对象,返回构造函数结果
const ret = construct.apply(obj, arguments);
// 如果构造函数返回了一个对象则返回构造函数的对象,否则返回新建的对象
return typeof ret === "object" ? ret : obj;
}

const a = New(Person, "sven");
const b = new Person("sven");

console.log(a.getName()); // => sven
console.log(b.getName()); // => sven

console.log(Object.getPrototypeOf(a) === Person.prototype); // => true
阅读更多

《Java8实战》读书笔记

第一章 为什么要关心 Java 8

从有点修正主义的角度来看,在 Java 8 中加入 Streams 可以看作把另外两项扩充加入 Java 8 的直接原因:把代码传递给方法的简洁方式(方法引用、Lambda)和接口中的默认方法。

多核 CPU 的每个处理器内核都有独立的高速缓存。加锁需要这些高速缓存同步运行,然而这又需要在内核间进行较慢的缓存一致性协议通信。

流是一系列数据项,一次只生成一项。程序可以从输入流中一个一个读取数据项,然后以同样的方式将数据项写入输出流。一个程序的输出流很可能是另一个程序的输入流。

编程语言中的函数一词通常是指方法,尤其是静态方法;这是在数学函数,也就是没有副作用的函数之外的新含义。

在 Java 8 里写下 File::isHidden 的时候,你就创建了一个方法引用,你同样可以传递它。

Collection 主要是为了存储和访问数据,而 Stream 则主要用于描述对数据的计算。

阅读更多