javascript高级程序设计读书笔记2

<!DOCTYPE HTML>//这个网页的文档类型,这个是html5的写法
Bootstrap使用的某些HTML元素和CSS属性需要文档类型为HTML5 doctype。因此这一文档类型必须出现在项目的每个页面的开始部分

<html lang="en">//这里的lang="en"可以删除,如果不删除的,用谷歌之类打开,它会认为是英文的,会自动给翻译(如果设置了自动翻译的话)

有两个版本的 jQuery 可供下载:
Production version - 用于实际的网站中,已被精简和压缩。
Development version - 用于测试和开发(未压缩,是可读的代码)
这两个版本都可以从 jQuery.com 下载。
提示:您可以把下载文件放到与页面相同的目录中,这样更方便使用。
如果您不希望下载并存放 jQuery,那么也可以通过 CDN(内容分发网络) 引用它。

谷歌和微软的服务器都存有 jQuery 。

如需从谷歌或微软引用 jQuery,请使用以下代码之一:
Google CDN:

<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js">
</script>
</head>
提示:通过 Google CDN 来获得最新可用的版本:

如果您观察上什么的 Google URL - 在 URL 中规定了 jQuery 版本 (1.8.0)。如果您希望使用最新版本的 jQuery,也可以从版本字符串的末尾(比如本例 1.8)删除一个数字,谷歌会返回 1.8 系列中最新的可用版本(1.8.0、1.8.1 等等),或者也可以只剩第一个数字,那么谷歌会返回 1 系列中最新的可用版本(从 1.1.0 到 1.9.9)。
Microsoft CDN:

<head>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js">
</script>
</head>

提示:使用谷歌或微软的 jQuery,有一个很大的优势:

许多用户在访问其他站点时,已经从谷歌或微软加载过 jQuery。所有结果是,当他们访问您的站点时,会从缓存中加载 jQuery,这样可以减少加载时间。同时,大多数 CDN 都可以确保当用户向其请求文件时,会从离用户最近的服务器上返回响应,这样也可以提高加载速度。

基本类型和引用类型:
1 只能给引用类型动态的添加属性
2 var object2 = object1(var object1 = new Object())时,只是创建了一个新指针指向原来存在堆内存中的对象,该对象变化时,两个指针的引用的值都将变化(引用传递)。基本类型采用复制(值传递)数据存在栈中
3 传递参数的区别:在函数内部重写引用类型的参数之前,即使改变了参数的值,引用仍有效,而重写的只是一个局部对象,这个局部对象会在函数执行完之后立即销毁

检查基本类型时操作符typeOf()很有用(返回 类型的字符串),但检查引用类型时需要instanceOf(否则只返回object)
变量的执行环境和作用域链,延长作用域链的两种方式:with和try catch中的catch,里面的属性自动继承括号里的变量
javascript没有块级作用域,函数内没有用var声明的变量默认为全局变量,执行环境为全局环境
查询标识符一级一级向上查询,如果在当前函数环境中找到了标识符则放弃向上查询
内存回收机制

object对象是引用类型的实例:
创建object实例的两种方法:new和对象字面量(看起来更加简洁,大量传参时也亲睐)
两种访问对象属性的方法:通过变量访问属性(方括号)和点(更推崇)

array:
1 创建array的实例也有两种方法
2 array的属性length不是只读的,可以修改,改小可删除多余数据,改大会出现undefined数据
3 检测是否为数据,一般情况下instanceOf就够了,但如果网页用到多个框架的话,则可能出现array重定义,需要用Array.isArray()来检测
4 转换方法:toString(对每个元素调用toString方法),toLocaleString(对每个元素调用toLocaleString方法), valueOf
5 join() 方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。
6 提供一种类似栈的操作方法操作数组(返回值为数组的长度,下同):pop和push,栈顶为数组末尾
7 提供一种队列的方法操作数组:push和shift(取出头部的元素)  pop和unshift可以从反方向模拟队列
8 重排序的方法:reverse和sort,sort默认按升序排,调用每个元素的toString方法然后按字符顺序排序,这种显然不是我们的目的,则可以将一个比较函数作为它的参数,返回值为排序后的数组
9 操作方法:concat基于当前数组的所有项创建一个新数组, slice基于当前数组中的一项或多项创建新的数组(用法很多,详见书)
10 indexOf, lastIndexOf从后往前找,未找到返回-1,第二个参数表示查找起点
11 迭代方法:every, filter, forEach, some, map
12 缩小方法:不知道什么鬼

date:
Date.parse()和Date.UTC(),前者将字符串转化为日期,同样有toString方法,toLocaleString,valueOf返回毫秒数,便于比较

function:
函数名本来就是变量,所以函数可以当做值来使用(可以把函数当做一个参数来传递,或者返回一个函数)
函数内部的属性:arguments,是参数对象数组,它的属性callee为一个指针,指向拥有这个数组的函数
函数对象的属性:length参数的个数,prototype,该属性无法枚举出来
函数的方法apply和call,将一个对象的方法给另一个对象使用
bind()

布尔型和数字型和字符串型
重写了toString方法,toLocaleString, valueOf,基本类型的Boolean和引用类型的Boolean型差别很大,最好不要用引用类型的Boolean
number也一样重写了三个方法,第一个返回值的字符串,第三个返回基本类型的值,第一个还可以设定参数控制转成字符串的进制
toFixed()按照指定的小数位格式返回字符串形式
toExponential()返回指数形式的字符串,同样可以指定小数位
toProcession()返回最合适的格式,也可以指定小数位
String类型的字符方法:charAt()charCodeAt()
slice(),substring(), substr()的异同,参数为负的情况
trim()返回字符串副本,并去掉前置和后置空格
toLocaleUpperCase(), toUpperCase(), toLocaleLowerCase(), toLowerCase()
字符串的模式匹配函数match(),与正则式的exec()类似,参数为正则式对象或正则表达式
另一个查找模式的方法search(),唯一的参数与match相同,返回第一次找到匹配的字符索引
为了简化替换子字符串的操作,方法replace()应运而生
split();
localeCompare();
fromCharCode();

内置对象:程序员不必显式的实例化对象,因为在程序进行之前已经被实例化了
Global:所有在全局域内的方法和属性,不属于其他对象的,都是Global对象的属性和方法
encodeURIComponent()和encodeURI(),对通用资源标识符进行编码,后者只对空格编码,前者则对任何非标准字符编码,所以一般对整个URI使用encodeURIne而对URI后面的字符串使用encodeURIComponent,在实际使用中后者用的更多,因为实际中常常需要查询字符串参数而不是URI本身
与上面相反的方法decodeURI和decodeURIComponent,前者只能对对应函数编码的部分进行转码
eval()能够解释代码字符串,并将解释的代码插入原执行空间,虽然功能很强大,但是在严格模式下有问题,涉及用户输入的部分谨慎,存在恶意用户代码注入的问题
window除了扮演javascript中的global对象以外,还扮演了很多其他角色

math
对象的常用属性:Math.E, Math.PI...
min()和max()方法
apply()
舍入方法:ceil(), floor(), round()
random()

在读取模式下访问基本类型时,会常见对应的基本包装类型的一个对象,从而方便数据操作,但操作基本类型的语句一经执行完毕,就会立即销毁新创建的包装对象。

数据属性和访问器属性
Configurabale,Enumerable,Writable,Value
Configurabale,Enumerable,get,set使用访问器属性的常用方法,即设置一个属性的值会导致其他属性发生变化,浏览器兼容问题,老版非标准实现
difinePropertities()一次定义多个属性

创建对象可以采用工厂模式,将创建代码抽象成函数,避免代码冗余,问题是无法知道对象的类型
采用构造函数模式,构造函数第一个字母大写(借鉴其他OO语言),采用new操作符,这样不同的实例都有一个constructor属性为构造函数名,但是检测对象类型还是用instanceOf比较靠谱,当然构造函数模式并不是没有缺点,所以产生了原型模式:所有实例共享一组属性和方法,将属性和方法定义为构造函数原型的属性和方法,默认情况下所有的原型对象都含有一个属性constructor指向拥有该prototype的构造函数,所有实例内部又有一个原型属性指向函数原型,而不是构造函数,虽然在所有实现中都无法访问到prototype,但是可以通过函数isPrototypeOf()来判断原型是不是实例的原型,getPrototypeof(),获取原型对象,取实例属性时先找到实例有没有这个属性值,找不到在向上看看它的原型的属性值,实例自己的属性值可以把原型的属性值屏蔽掉,用函数hasOwnProperty()可以检测属性是实例的还是原型的
in操作符,能访问到该对象就返回true
hasPrototypePropertity(),如果实例中重写了属性值,那么返回false,因为实例不再用原型中的该属性值
for in返回所有可通过对象访问的,可枚举的属性,包括实例属性,本身规定开发人员设置的属性都是可枚举的(在IE8及以前例外)
早期的IEbug为使用for in会屏蔽所有默认不可枚举的属性,包括hasOwnProperty(),toString()等等,ECMA5script也将prototype和constructor设为不可枚举属性,但在不同的浏览器中实现不同
取得实例对象的所有可枚举的实例属性名的方法keys(),该方法返回字符串数组
得到所有实例属性名的方法getOwnPropertyNames,不管可不可枚举
用对象字面量写 原型属性来减少代码量,不过属性constructor就会指向object,如果constructor属性很重要,可显式的将该变量设置回去,不过这样它的访问属性就会被改为可枚举的了(默认是不可枚举的),还有新的方法,详见书
重写原型对象切断了现有原型与重写之前创建的实例的联系,以前的实例的指针依然指向在原型重写之前的原型对象
原生对象也有原型,也可以通过重写原型方法修改特性
不过原型方法也有缺点:很明显,原型的所有实例共享属性就是最大的问题,对一个实例修改它的原型属性会导致另一个实例属性的改变,这与我们平时所需要的要求不和
所以最常见的方法是采用自定义模式:构造函数用来定义一些个性的属性,而原型则定义一些共有的属性和方法
动态原型模式:在定义原型属性时先判断属性是否存在,如果不存在,才创建,这样的好处是可以减少代码的执行次数,在第一次调用构造函数就创建了原型属性,此后则可不需执行中间的代码
在上面的模式都不合用时,考虑parasitic构造,与工厂模式类似,但是创建时实例时需要new,这个模式用于特殊情况的为对象创建构造函数
稳妥函数模式:不适用new和this,避免其他应用程序对数据的调用,限制访问数据的途径,只能通过方法获得属性值,最后两种方法实例与构造函数之间没有关系,instanceOf操作符 对其没有意义

时间: 2024-10-09 10:19:17

javascript高级程序设计读书笔记2的相关文章

Javascript高级程序设计读书笔记(第六章)

第6章  面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新对象. 构造函数的问题:每个方法都要在每个实例上重新创建一遍: 理解原型对象: 无论何时,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象.默认情况下,所有原型对象都会自动获得一个constructor属性,这个属性包含一个指向proto

JavaScript高级程序设计-读书笔记(6)

第20章 JSON JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量 JSON的语法可以表示一下三种类型的值 l        简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串.数值.布尔值和null.但JSON不支持JavaScript中的特殊数值undefined. “Hello world!” l        对象(属性的值可以是简单值,也可以是复杂类型值,如下这样在对象嵌入对象) { “name” : ”Nicholas”, “age” : 29

JavaScript高级程序设计-读书笔记(2)

第6章 面向对象的程序设计 创建对象 1.最简单方式创建Object的实例,如 var person = new Object(); person.name = “Greg”; person.age = 27; person.job = ”Doctor”; person.sayName = function() { alert(this.name); }; person. sayName(): 缺点:会产生大量重复代码 2.工厂模式:用函数来封装以特定接口创建对象的细节,如 function c

JavaScript高级程序设计读书笔记之OOP

关于JavaScript创建对象的方式: 1.工厂模式 1 function createPerson(name, age, job){ 2 var o = new Object(); 3 o.name = name; 4 o.age = age; 5 o.job = job; 6 o.sayName = function(){ 7 alert(this.name); 8 }; 9 return o; 10 } 11 var person1 = createPerson("Nicholas&qu

JavaScript高级程序设计-读书笔记(4)

第11章 DOM扩展 1.选择符API Selector API Level 1 的核心是两个方法:querySelector()和querySelectorAll().在兼容的浏览器中,可以通过Document及Element类型的实例调用它们.目前完全支持Selector API Level 1的浏览器有IE 8+. Firefox 3.5+. Safari 3.1+. Chrome和Opera 10+. querySelector()方法接收一个CSS选择符,返回与该模式匹配的第一个元素,

JavaScript高级程序设计-读书笔记(3)

第8章 BOM 1.window对象 (1)全局作用域 BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象. 所有在全局作用域中声明的变量.函数都会变成window对象的属性和方法. (2)窗口关系及框架 如果界面中包含框架,这每个框架都拥有自己的window对象,并且保存在frames集合中,可以通过数值的索引(从0开始,从左至右,从上到下)或者框架名称来访问相

JavaScript 高级程序设计读书笔记(1)

第6章 面向对象的程序设计 属性的类型 JS 中对象的属性有两种,数据属性和访问器属性(accessor property ),属性有其自身的特性(arrribute),可以理解为关于属性的属性. 数据属性包含4个特性,分别是[[Configurable]], [[Enumerable]], [[Writable]], [[Value]]. 使用 Object.defineProperty 修改属性描述符时,若该属性之前不存在,除了代码里指定的特性值,其他特性值默认将是 false, 举例如下:

Javascript高级程序设计读书笔记(第二章)

第二章  在HTML中使用Javascript 2.1<script>元素 延迟脚本(defer = "defer")表明脚本在执行时不会影响页面的构造,脚本会被延迟到整个页面都解析完毕后再运行.相当于告诉浏览器立即下载,但延迟执行.HTML5规定要求脚本按照它们出现的先后顺序执行. 异步脚本(async)如果有多个脚本文件,执行顺序不确定,指定async属性的目的是不让页面等待两个脚本下载和执行,从而异步加载页面其他内容. XHTML代码的规则比编写HTML严格得多,下面

JavaScript高级程序设计 读书笔记 第二章

<script>元素 直接在页面中嵌入JavaSript代码或包含外部JavaSript文件. 在代码中任何地方不能出现</script>,可通过转义字符'\'解决. 在XHTML中可省略</script>,HTML中不能. 延迟脚本:defer属性(defer="defer"),告诉浏览器立即下载,延迟执行.最好只包含一个延迟脚本. 异步脚本:async属性(async="async"),不让页面等待两个脚本下载和执行,异步加载