《JS启示录》笔记

  • 此书让你深入了解JS对象,JS几乎所有东西都是对象或用起来像对象

摘要

  • 自定义构造函数,保持名称第一个字母大写
  • 字面量表达式创建对象
    {},[]创建的是对象
    1,’string’,true,创建的是原始值
  • new关键字调用构造函数的语法来创建对象
    new Number()
    new String()
    new Boolean() 创建的是对象
    Number()
    String()
    Boolean() 没有new关键字的,则创建的是原始值
  • null undefined是原始值
  • 原始值 按值复制;对象 按引用存储,===比较是否指向同一个对象
  • 构造函数实例都拥有指向其构造函数的constructor属性,instanceof只适用于构造函数创建返回的复杂对象和实例

  • 相较于点,中括号可用来访问特殊名的属性

  • in可坚持一个对象的属性,包括原型链;hasOwnProperty()可检查来自非原型链属性的对象

Chapter4 函数

  • 函数返回值默认undefined,构造函数返回值为对象实例
  • 函数是对象,因为可有属性,是个值(最终返回值)
  • this arguments适用于所有函数,argums.callee
  • 函数定义有三种
    • 函数构造函数new Function()
    • 函数语句function a(){}
    • 函数表达式var a = function(){}
  • 调用函数,call(),apply()区别是参数传递的不同,前者传递多个分开的参数,后者传递多个参数组成的数组
  • 自调用的函数表达式,若要立即调用函数,需在函数外面的圆括号,或任何将函数转换为表达式的符号。
    (function (){}()) ,(function (){})(),!function (){}(),var a = function (){}()
    function (){}()不会立即执行
  • 函数表达式没有被提升,只有函数语句被提升,即函数定义前可被调用

Chapter5 head/全局对象

  • head对象,包含所有对象的对象浏览器是window,this
  • 全局对象,全局属性是直接包含在head对象内不的值
  • 显示引用head,性能代价高,若只依靠作用域链,避免显示引用head会更快

Chapter6 this

  • this在函数内部使用,引用包含函数的对象
  • 自定义构造函数:new,this指对象实例;若没有new,this是上下文
  • call apply,控制this值
  • this的宿主函数北封装在另一个函数内或另一个函数的上下文中被调用,this永远是对head对象的引用;可在父函数that保留this引用
  • 构造函数的prototype属性的函数中使用this,this引用调用方法的实例

Chapter7 作用域&闭包

  • 作用域是执行代码的上下文,js作用域包括全局作用域,函数作用域,eval作用域
  • 作用域链(词法作用域):包含函数的函数,会创建堆栈执行作用域,这些链接在一起的栈称为作用域链;
  • var vs 全局作用域
  • 函数定义时确定作用域,而非调用时确定,所以又叫词法作用域
  • 闭包:让函数向全局作用域返回一个嵌套函数,但该函数仍能通过作用域链访问其父函数的作用域;闭包是由作用域链引起的
    • 作用域链式基于代码的编写方式创建的,而不是基于调用函数所在的上下文,这使得函数即使从一个不同的上下文调用函数,也能够访问最初编写代码时所在的作用域,这称为闭包。

Chapter8 函数原型属性

  • 原型链 最后是Object.prototype
  • 默认的prototype属性是Object()对象
  • myArray.proto或myArray.constructor.prototype引用Array.prototype
  • 用新对象替换prototype属性回删除默认构造函数属性,constructor
  • Array.prototype={},myArray.constructor===Object();所以要Array.prototype={constructor:Array};
  • 用新对象替换prototype属性不会更新以前的实例:Array.prototype={a:1}不会更新;Array.prototype.a=2会更新
  • 原型继承链,实例化想要继承的对象,将该对象实例作为要继承该对象实例的函数的prototype属性值,eg:
    var Person = function () { } var Chef = function () { } Chef.prototype = new Person(); var cody = new Chef()

Chapter12 Boolean()

  • Boolean(0 -0 null false NAN undefined “”) 都是false
  • 非原始false布尔对象转换为true,eg:
    Boolean('false')//true var falseValue=new Boolean(false); if(falseValue){console.log('falseValue is truthy');}

Others

  • 直接在原始数字上访问属性时,该值被当作对象之前必须进行评估,1..toString(),第一个点被认为是数字十进制的小数点;临时包装器对象
  • null可表明属性拥有一个空值,等待赋值;typeof null返回object,===null 来判断,==无法区分null和undefined
  • undefined告诉你有东西丢失了;永远不要将一个值设置为undefined,若制定一个属性或变量值不可用,应为null
    • 声明的变量未指定值
    • 试图访问的对象属性未定义,并且不存在于原型链
  • undefined in this全局作用域定义undefined
`