首页 > 编程语言 > 详细

《JavaScript高级程序设计》读书笔记

时间:2020-05-09 20:47:47      阅读:45      评论:0      收藏:0      [点我收藏+]

前言

在看书的过程中,发现有一些内容属于那种边边角角容易忘记却又非常重要。
所以,在这里留下一篇笔记,以便查阅。

第1章 js简介

js组成部分:ECMAScript、DOM、BOM
浏览器就是js的解释器。
DOM是文档对象模型,通过它来操作网页对象上的元素,这些元素就是HTML上的各种标签。
BOM是浏览器对象模型,可以操作浏览器,其中XMLHttpRequest这个对象很重要,ajax异步处理技术就会用到它。

第2章 在HTML中使用js

js脚本默认是从上到下依次执行的,如果写在head里,就会堵塞。
script元素用来将js脚本插入HTML文件。
script中的async属性的作用是异步加载,不用等待,不用排队,要注意的是它不保证哪一个脚本先执行完毕,所以在加载期间不要改DOM。
script中的defer属性的作用是延迟加载,相当于放在body元素的底部位置,等页面全部呈现了才会执行。它也不保证谁先执行完毕。
综上,最后把脚本放在body元素内的底部,即主体内容后面,</body>的前面。
noscript元素内的文本会在浏览器不支持js的情况下显示出来。

第3章 基本概念

标识符就是变量、函数、属性、函数参数的名字。
区分大小写。
字母数字下划线和美元符号。
其中,数字不可以作为开头。
最好用小驼峰,像这样:myName,hisAge。
保留字、关键字、布尔值(true、false)、null不可以做标识符。
严格模式:"use strict" 对那些不确定的行为和不安全的方式加以限制,如果发生会报错,让代码更强壮。
语句最好加分号。
关键字就是像声明时用的var、let、function……
保留字就是暂时还没有规定用途的准关键字。
未初始化的变量(就是没有给值的变量)保存了undefined。
在函数中不加var来声明的变量,就会保存到window上,变成全局变量。
全局变量哪都能用。
typeof操作符可以判断:undefined boolean number string function object
其中null经过typeof也返回给你object,因为它被当成一个空的引用。
数组、函数、对象都是对象,它在内存上保存的仅仅是一个引用地址,通过这个引用才可以找到真正的值。

undefined == null => true
undefined === null => false
NaN === NaN => false
+0 === -0 => true
Object.is()用来判断两者是否相等。
Object.is(NaN, NaN); => true
Object.is(+0, -0); => false
parseInt(开头不是数字的字符串); => NaN
parseFloat(开头不是数字的字符串); => NaN
null和undefined没有toString()方法。

var o = new Object();
var o = new Object; // 可以省略 但最好不要省略
Object相当于Object类,而o就是Object这个构造函数原型派生出来的一个对象。
Object的实例的属性方法:
o.constructor:构造函数,保存着当前实例的函数。比如上面的Object。
o.hasOwnProperty(propertyName):检查当前实例上是否存在给定的属性。(跟原型无关)
Object.prototype.isPrototypeOf(o):用于测试一个对象是否存在于另一个对象的原型链上。
toString():返回字符串表示。
valueOf():返回当前对象的字符串、数组或布尔值表示。

var a=0
++a; // 0
a // 1
var b=0
b++; // 1
b // 1

与&&
或||
非! !true === false
逻辑短路:
true && 1 => 1
true || 1 => true
false && 2 => false
false || 2 => 2

2**3 => 8
23 < 3 => false
"23" < 3 => false 先把"23"转换成数字23,然后比较
"a" < 3 => false "a"转换成数字变成NaN,NaN不等于任何数字
"23" < "3" => true 都是字符串就比较字符编码的大小
如果是对象的比较,先执行valueOf(),如果没有valueOf()方法,那么就调用toString()方法。然后用基本类型值继续比较。
三元运算符:var value = 5 > 10? ‘5胜出!‘ : ‘10胜出‘;

循环语句可以重复做一件事情,这样就不用每一次代码都写出来了。
有固定次数时,使用for循环,否则用while循环。
循环中有两种特殊用途的语句:break语句和continue语句。
break语句跳出当前循环体,不循环了。
continue语句跳过当前一轮的循环,进行下一轮循环。

函数是一组逻辑的封装,一般一个函数就代表一个功能。通过执行函数来实现对应的功能。
函数放在对象里,就称为对象的方法。执行对象里的函数,我们称之为调用对象的方法。
函数无需指定返回值,因为它没有指定返回值类型这一说,但最好有返回值,格式是return 返回值。
如果没有指定返回值,那么会默认返回一个undefined作为返回值。
return语句后面的语句永远不会执行。
函数的实参可以随便传几个,它们会被保存在arguments对象里,arguments是一个类数组。(一个有length属性,类似数组,保存着实参的列表。)
如果没有传递参数,和var未初始化一样,会被赋值为undefined。
Java中可以定义函数签名(接受参数的类型和数量),只要签名不同,就可以同时存在同名的函数,
但是JS中不可以!它的函数参数是一个类数组,因此JS没有函数重载,重名会被后者覆盖!

第4章 变量作用域和内存问题

变量的值分两种,一种是基本数据类型值,一种是引用类型值。
基本数据类型值是按值访问的,它可以直接操作保存在变量中的实际的值。他们被放在栈内存中。
引用类型值是按引用访问的,只能操作它的引用地址,不能操作对象的内存空间。他们被放在堆内存中。
技术分享图片
引用类型会有各种属性和方法。
当我们复制基本类型值时,原来的值和复制得到的值是相互独立、互不干扰的,是两码事。
当我们复制引用类型值时,复制的值只是一个指针一个地址而已,这两个指针指向同一个对象。当操作任何一个变量时,都会互相发生作用。
js中的所有函数参数都是按值传递的,这意味着函数执行后并不会改变作为参数传递进去的那个外部的变量值。
通过instanceof操作符检测对象的类型,看它是哪个构造函数的实例对象。(instance就是例子的意思。)
如果用基本类型就会返回false,因为基本类型不是对象。基本类型使用typeof来检测。

执行环境又叫执行上下文, 环境中的变量和函数可以访问其他数据,而每个环境中都有一个对应的变量对象(VO)。这个变量对象里保存着环境中所有的变量和函数。
按规则在浏览器中,window对象被认为是全局的执行环境,所以所有的全局变量和函数都是挂载在window对象上的。这个window对象就是全局环境中的变量对象。
这就是当你var value = 123;时,你就能访问到window.value是123的原因。
每个函数都有自己的执行环境。当执行函数时,函数会产生一个环境,这个环境被推入到一个环境栈中(此时它掌握控制权),而函数一旦执行完成,函数环境就会从环境栈中弹出。
注意,当环境出现时,就会随之产生一个变量对象,通过变量对象的作用域链,我们可以访问所有的变量和函数。
活动对象:如果这个执行环境是函数产生的,它的变量对象就是活动对象(AO),这里面一开始只有一个arguments对象(全局环境中并没有它),沿着作用域链可以找到上一层的变量对象,最外层就是全局的变量对象(GO)。(全局的变量对象始终是作用域链的最后一个对象。)
原生JS中只有全局作用域和函数作用域。(函数作用域也叫局部作用域)
简而言之就是,每一个环境下(不管是全局环境还是函数的局部环境),都会对应有一个变量对象,变量对象包含着当前作用域中所有的变量和函数。
比如,全局环境下的变量对象就有全局中所有的变量和函数。
特殊一点的是,在执行函数时会产生函数环境,它的变量对象叫做活动对象,与全局环境不同的是,arguments对象是函数变量对象的专属。
在函数环境中,可以访问到父级作用域内变量的原因就是作用域链,沿着它就能访问上一层作用域的变量了。这就是为什么函数内部可以访问全局变量的原因。
另外,外部环境是没有办法反过来访问到内部环境中的变量的。函数一旦执行完毕,函数环境内的变量就会被销毁。
但是如果在执行函数时,函数内部的变量被返回出来,因为它是连着活动对象的作用域链,所以这时外部就能访问内部的值,这就是闭包。
(上面的变量包括基本类型和引用类型,执行环境也叫作作用域。)

原生JS只有全局作用域和局部作用域(函数),但是没有块级作用域,这就意味着类似于for循环这种代码块里的变量可以被全局使用,这样代码块里的变量就很容易被污染。
标记清除,给当前不适用的值加上标记,然后再回收内存。(主流)
引用计数,当声明一个变量并引用值给它时,就会产生1个引用计数,变量每次被引用时次数+1,使用完成后次数-1,当计数为0时意味着它的内存被回收。(几乎不用)
JS的内存分配和回收会自动执行,它有自动垃圾收集机制。

未完待续。。。

《JavaScript高级程序设计》读书笔记

原文:https://www.cnblogs.com/buildnewhomeland/p/12859746.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!