《javascript语言精粹》——读书笔记

《javascript语言精萃》
摘要:
  • 继承、原型对象
  • 减少全局变量使用
  • 所谓编程即是一组需求分解成一组函数和数据结构的技能


函数:
  • 函数:基础模块,代码复用,信息隐藏,组合调用 // 函数创建时会附加两个隐藏属性:函数上下文和实现函数行为的代码。//函数对象有个调用属性,当函数被调用,可理解为调用函数的调用属性 //函数除了接受形参,另外接受两个参数,this和arguments // 调用模式分为:方法调用模式—this指向对象、函数调用模式—this指向window、构造器调用模式—new 方式调用,背地创建一个连接到该函数prototype的新对象,将this绑定到新对象,返回this(新对象)、和apply调用模式(对一个对象调用本不属于他的方法)
  • 对象是“名/值”对的集合并拥有一个连接到原型对象的隐藏连接
  • 原型继承动态本质,新的方法立刻被赋予到所有对象实例上,哪怕是在增加前定义的。也可以给基本类型添加方法。//for in 循环会把所有原型对象上的属性方法都算进去// 使用hasOwnProperty来分别//
  • 递归 汉诺塔,dom渲染,全局抓取元素,阶乘(尾递归)
  • 由于函数作用域,最好在一开始声明变量
  • 闭包的好处,内部函数可以访问到外部函数中的变量(除了this和arguments)//函数可以访问它被创建时的上下文,这被称为闭包//应用:辅助函数内返回函数,让辅助函数存储变量i的值(函数接受的参数取决于最外层函数中的变量,辅助函数自执行,访问到当层变量的值,下一次循环又重新覆盖)//
  • 回调函数,让原本同步的(http请求)阻塞代码放入函数内部,异步执行。
  • 闭包可以访问到私有变量和函数的特权函数。 模块化
  • 函数返回自己,级联,可以链式调用。
  • 科里化。函数的值作为函数,二次调用
  • 函数的值可以缓存,减少递归函数的调用次数,加速运算
继承:
  • javascript是弱类型语言,对象继承关系无关紧要,重要的是能做什么//js是基于原型的语言,这意味着对象直接从其他对象继承。而非java 对象是类的实例,类从类继承。
  • 构造继承函数,并且链式调用
  • 原型继承,object.create(原型对象,{{属性:{设置},})
  • 继承弱点,无法保护内部的私有变量
  • apply的优势:延长函数的作用域,对象不需要与方法有任何耦合关系

数组:
  • 判断是不是数组:Array.isArray()或者 Object.prototype.toString.apply(value)=== “[Object Array]”;
正则:
  • exec  ?? 返回一个匹配的数组
方法:
  • 用apply实现bind
对象:
  • for in 和 Object.keys都可以枚举对象的key,但是前者会连带上它原型链上的属性,一般配上hasOwnProperty使用。后者直接返回一个数组。两者顺序一致
  • for of 用于遍历数组、集合的值,无法遍历对象,不会访问原型链属性
风格:
  • 通过一个清晰且始终如一的风格下编写,你的程序会易于阅读。
  • 尽可能避免那些看起来像有错误的习惯用法
  • 对于工具库,只用唯一一个全局变量。使用对象去管理代码。使用闭包等(ES6模块化)
  • 分行写代码可以使用标点:,+等结尾
  • throw{name:“”;message:“”} 配合 try catch(err)
设计优点:
  • 函数是顶级对象,函数有词法作用域和闭包。
  • 基于原型继承的动态对象 ,对象属性可以赋值得到,也可继承得到。
  • 对象和数组字面量,方便
  • 恰好可以工作的特性,创造了大部分价值,追求简单易用,但这种产品缺乏时,就要去创造它。使用编程语言精华
设计毒瘤:
  • 全局变量是window的属性
  • 函数内的函数声明中this指向window
  • 可以在同一作用域下反复var 生命变量如(循环因子)
  • typeof 返回的不准确性
  • +、= 是bug常见来源
  • 不能处理十进制小数,0.1+0.2不等于0.3 , 可以通过乘以一个数去避免错误
  • NaN常在非数字形式字符串转化为数字时产生。辨别数字isNaN() , isFinite()
  • 检查类型:Object.prototype.tostring.apply(my_value)===“[object Array]”
  • arguments并不是数组
设计糟粕:
  • == 和 != 不精确
  • with 语义不清
  • eval 难以阅读,性能降低
  • continue 跳出循环性能低
  • switch 穿越,否则写case,常见错误来源
  • 类型包装 类似new Number()
  • es6以前没有代码块,for循环内的变量和全局一样 
  • javascript设计散漫,内藏优雅

猜你喜欢

转载自blog.csdn.net/weixin_40821790/article/details/78829905