持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
阅读《JavaScript语言精粹》(修订版)的笔记记录,这里是1-4章的笔记,书虽然老了,但了解一下并不会吃亏。
第一章 精华
弱类型的影响
并不大
大部分编程语言都要求强类型,原因是允许编译器在编译时检测错误;这样我们能越早检测和修复错误,付出的代价越小
但强类型并不会让测试工作变得轻松,强类型检测找到的错误并不头疼,且若类型比较自由,写的爽
为什么要使用js
1.js是唯一一门所有浏览器可以识别的语言
2.确实优秀,轻量且具有表现力
其他
- 不要直接用基于类的设计模式,要用原型继承
- 全局变量是魔鬼
- 有很多糟粕
第二章 语法
- 注释
有两种方式,一种是行注释一种块注释,块注释的字符容易在正则表达式里出现,所以为了安全,尽量用
//
- 标识符
由一个字母开头,后面可以选择性加字母数字和下划线,不可以用那些关键词做的保留字(return if byte这些)
- 数字
和java不同,没有分出double和int出来,内部表示为64位浮点数
NaN是一个数值,表示一个不能正常计算的运算结果,不表示任何值,包括自己,可以用isNaN来判断
- 字符串
没有字符类型,每个字符都是16位,字符串字面量可以包含在一对单引号或者双引号中
转义字符用来把那些正常情况下不被允许的字符插入到字符串中,"A"==="\u0041"
字符串有length属性,表示长度
字符串不可变,一旦创建就永远不能改变,但是包含相同顺序字符的字符串被认为是相同的
- 语句
被认为是false的值:false,null,undefined,‘’,0,NaN
for...in遍历对象时会把原型的属性也遍历出来,需要用
hasOwnProperty来判断是否是对象成员throw语句中的表达式通常是一个对象,包含name和message,用来让异常捕获器做相应的处理,但在我的实际操作中,
throw(new Error('a'))和throw('a')差不多,
throw(new Error('a'))是Error: abcthrow一个对象也是在cache里接收这个对象,throw啥catch就接收啥。
暂时性死区里的cache是
ReferenceError: Cannot access 'a' before initialization
- 表达式
typeof 数组、null返回 object ,这其实是不对的
第三章 对象
- 对象属性的名字是可以包含空字符串在内的任意字符串,属性值除了undefined都可以
- 对象可以继承另一个对象,正确使用可以减少对象初始化消耗的时间和内存
- 在对象字面量中如
var obj={a:'b'},如果属性名是标识符且不是保留字,那可以不用引号包属性名,var obj={'a-a':b}这种就需要 - 检测对象是否有某属性,用
hasOwnProperty,用typeof也没什么问题,不过他会查你原型链上的。 - 遍历对象属性时,属性名出现的顺序是不确定的,最好就是创建个数组里面用正确的顺序排一下属性名。
- 可以用
delete删除对象某个属性,可能会让原型链的属性透视出来。
其他老鸟熟悉的或旧时代的方法
- 检索属性可能套两层访问不到会报错,一般用
a.b&&a.b.c来访问,老鸟用a?.b?.c - 检索属性如果找不到会去原型链上找,这个过程叫委托。
- 为了减少全局污染,建议只创建一个唯一的全局对象
obj,把不同模块里的变量都放进这个里,比如obj.header={},或者闭包。现在用模块化了,时代变了大人。
第四章 函数
- 每个函数在创建时会附加两个隐藏属性:函数的上下文和实现函数行为的代码(或者说函数的调用属性),配有一个
prototype,值是一个拥有constructor且值为该函数的对象 - 参数调用时接收两个附加的参数,
this和argument,this取决于调用的模式:方法、函数调用、构造器调用、apply调用模式。
按我理解,依次是 调用对象,全局对象,新建实例对象,apply参数指定的对象
- 因为语言的一个设计错误,函数参数
arguement是类数组,有length属性,但没有任何数组方法 - 我们可以主动用
throw抛出异常,异常是一个exception对象,包含name和message描述属性,也可以加其他属性 - 模块:函数里加闭包避免全局变量;可以产生安全的对象(私有变量)
其他
-
如果一个函数创建的目的就是结合
new来使用,那就是构造器函数,按约定函数名字要大写,如果调用构造函数没用new,那很糟糕,this会绑定到全局对象上,也不会报错。有其他更好的构造器函数的形式。 -
级联 用了方法后返回
this,方便继续使用,在flutter用过 -
柯里化 把多参数函数转化单参数函数并调用的技术
-
记忆,斐波那契的递归重复运算可以用数组保存运算的结果避免重复运算。嗯,力扣那边是用动态规划做的