《js语言精粹》笔记(1-4章)

151 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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: abc

throw一个对象也是在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且值为该函数的对象
  • 参数调用时接收两个附加的参数,thisargumentthis取决于调用的模式:方法、函数调用、构造器调用、apply调用模式。

按我理解,依次是 调用对象,全局对象,新建实例对象,apply参数指定的对象

  • 因为语言的一个设计错误,函数参数arguement是类数组,有length属性,但没有任何数组方法
  • 我们可以主动用throw抛出异常,异常是一个exception对象,包含namemessage描述属性,也可以加其他属性
  • 模块:函数里加闭包避免全局变量;可以产生安全的对象(私有变量)

其他

  • 如果一个函数创建的目的就是结合new来使用,那就是构造器函数,按约定函数名字要大写,如果调用构造函数没用new,那很糟糕,this会绑定到全局对象上,也不会报错。有其他更好的构造器函数的形式。

  • 级联 用了方法后返回this,方便继续使用,在flutter用过

  • 柯里化 把多参数函数转化单参数函数并调用的技术

  • 记忆,斐波那契的递归重复运算可以用数组保存运算的结果避免重复运算。嗯,力扣那边是用动态规划做的