《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