《Javascript启示录》要点汇总
前言:本文是阅读《Javascript启示录》后的一个读书笔记,对本书的要点进行了一个归纳,不是原创内容哦。要想详细了解相关内容,请阅读原书。
-
对象是由存储值的已命名属性组成的。
-
JavaScript中的几乎所有对象都可以表现得像对象。复杂值是对象,原始值也可以看做对象。
-
对象是通过使用new关键字调用构造函数或者通过使用字面量表达式来创建的。
-
构造函数是对象(Function()对象),因此在JavaScript里对象创建对象。
-
JavaScript提供9个原生构造函数:Object(),Array(),String(),Number(),Boolean(),Function(),Date(),RegExp(),和Error()。在需要时,String(),Number(),和Boolean()构造函数可以提供原始值和对象包装器,以便于原始值被当做对象时,它们可以表现得像对象。
-
null、undefined、“string”、10、true和false都是原始值,没有对象属性,除非将它们看做对象。
-
使用new关键字调用JS提供的原生构造函数时,会创建一个对象,被称为“复杂对象”或者“引用对象”。
-
原始形式的null、undefined、“string”、10、true和false等没有对象属性,除非将它们用作对象,然后JavaScript会在后台创建临时包装器对象,这些值就可以表现的像对象。
-
原始值是通过值存储的,复制时是通过字面量进行复制的。另一方面,复杂对象值是通过引用进行存储的,复制时是通过引用进行复制的。
-
当原始值的值相等时,它们即相等,而复杂对象只有在引用相同值的情况下才是相等的。也就是说:都指向同一对象时,一个复杂值才等于另一个复杂值。
-
由于复杂对象和引用的特性,JavaScript对象具有动态属性。
-
JavaScript是可变的,这意味着可以在任何时间操作原生对象和用户自定义的对象属性。
-
可以使用点表示法或括号表示法获取、设置、更新对象属性。
-
当查找对象时,查找链先查看对象引用的属性;如果没有找到,则继续在构造函数的prototype属性上进行查找;如果仍找不到,由于原型拥有一个对象值并且该值是由Object()构造函数创建的,因此在Object()构造函数的ptototype属性上进行查找。如果还找不到,则确定属性值为undefinded。
-
用新对象替换ptototype属性会删除默认构造函数属性,也不会更新以前定义好的实例,只是从新对象替换ptototype属性时刻起影响后面的实例。
-
原型查找链表明了继承在JavaScript是如何实现的。
-
由于对象属性查找链的存在,因此所有对象都继承自Object(),因此prototype属性本身就是一个Object()对象。
-
JavaScript函数是一等公民:函数是拥有属性和值的对象,总有返回值,可以是显式的或者是undefined。
-
函数在命名之前调用,会进行函数提升。
-
在函数内部使用this关键字时,它是一种用于引用包含该函数的对象的通用方法。
-
在运行时基于调用函数所在的上下文,可以确定this的值。
-
在嵌套函数中使用this关键字会引用全局对象,可以用另一个变量缓存this对象来解决这个问题。
-
在全局作用域内使用this关键字,this引用全局对象。
-
JavaScript将函数作为创建唯一作用域的方法。
-
JavaScript提供全局作用域,所有的JavaScript代码都在这个作用域内。
-
JavaScript没有块级作用域,只有全局作用域、局部作用域(函数作用域)和eval作用域。
-
函数创建一个作用域链来解决变量查找问题。
-
作用域链是基于代码的编写方式创建,而不是基于调用函数所在的上下文。也就是说函数定义时确定作用域,而不是调用时确定。这使得函数即使从一个不同的上下文调用对象,也能够访问最初编写代码时所在作用域,这称为闭包。
-
函数内部定义的函数表达式和变量,如果没有使用var声明,则都会变成全局属性。然而,函数作用域内部的函数语句仍在编写代码时所作的作用域内定义。
-
全局作用域内定义的函数和变量(没有使用var),会成为全局对象的属性。
-
全局作用域内定义的函数和变量(使用var),会成为全局变量。
-
Boolean()构造函数接受一个参数,会将它转换成布尔值。除0、-0、null、false、NaN、undefined和空字符串(“”)外的任何有效JavaScript值都将转换成true。
-
由Boolean()构造函数创建的false布尔对象(相对于原始值)是一个对象,并且对象转换为true;如果需要将一个非布尔值转化为布尔值,仅使用没有new关键字的Boolean()构造函数,返回的值将是一个原始值,而不是布尔对象。
-
null是显式的指出对象属性不包含值。
-
undefined第一种使用场景是声明变量,但没有指定值,第二是试图访问的对象属性没有被定义,并且不存在原型链中。
-
Math()对象包含静态属性和方法,它是内置于JavaScript,而不是基于Math()构造函数来创建实例。
-
Math是一种一次性对象,用于容纳静态属性和方法,没有创建Math实例的方法,而且它的很多属性都是无法改变的常数。