1、导论javascript
2、基本语法java
一、严格来讲var a=1与a=1效果不太同样,delete命令没法删除前者。编程
JavaScirpt是一种动态类型语言,也就是说,变量的类型没有限制,能够赋予各类类型的值。数组
JavaScript引擎的工做方式是,先解析代码,获取全部被声明的变量,而后再一行一行地运行。中文是合法的标识符,能够用做变量名。浏览器
switch语句后面的表达式与case语句后面的表示式,在比较运行结果时,采用的是严格相等运算符(===
)。swidth结构不利于代码重用,每每能够用对象形式重写。缓存
do...while语句中,while后的分号不能省略。服务器
typeof(null)=='object',typeof(undefined)=='undefined',null==undefined,null转数值是0,undefined转数值是NaN。
二、JavaScript内部,全部数字都是以64位浮点数形式储存,cookie
+0===-0,惟一有区别的场合是,+0
或-0
看成分母,返回的值是不相等的,0/0返回NaN,NaN类型number,NaN===NaN为false。isFinite函数返回一个布尔值,检查某个值是否是正常数值,而不是Infinite。session
三、Base64是一种编码方法,能够将任意字符转成可打印字符。使用这种编码方法,主要不是为了加密,而是为了避免出现特殊字符,简化程序的处理。btoa():字符串或二进制值转为Base64编码,atob():Base64编码转为原来的编码。要将非ASCII码字符转为Base64编码,必须中间插入一个转码环节encodeURIComponent(str),再使用这两个方法。闭包
四、对象中键名不符合标识名的条件,则必须加上引号。JavaScript的保留字能够不加引号看成键名。
若是不一样的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其余全部变量。可是,这种引用只局限于对象,对于原始类型的数据则是传值引用,也就是说,都是值的拷贝。
检查变量是否声明:if('a' in window){}else{}。
查看全部属性:Object.keys(o)。
delete命令只能删除对象自己的属性,没法删除继承的属性,不能删除var
命令声明的变量,只能用来删除属性。
with的做用是操做同一个对象的多个属性时,提供一些书写的方便。
五、任何类型的数据,均可以放入数组。将数组清空的一个有效方法,就是将length
属性设为0。
数组的slice方法将相似数组的对象,变成真正的数组:Array.prototype.slice.call(arrayLike)。
数组的某个位置是空位,与某个位置是undefined,是不同的。若是是空位,使用数组的forEach方法、for...in结构、以及Object.keys方法进行遍历,空位都会被跳过。
六、JavaScript引擎将函数名视同变量名,因此采用function命令声明函数时,整个函数会像变量声明同样,被提高到代码头部。若是同时采用function
命令和赋值语句声明同一个函数,最后老是采用赋值语句的定义。
对于var命令来讲,局部变量只能在函数内部声明,在其余区块中声明,一概都是全局变量。
若是函数A
调用函数B
,函数B
不会引用函数A
的内部变量。函数体内部声明的函数,做用域绑定函数体内部。
函数参数若是是原始类型按值传递,若是是复合类型按地址传递,若是函数内部修改的,不是参数对象的某个属性,而是替换掉整个参数,这时不会影响到原始值。
闭包就是函数可以读取其余函数内部变量的函数。闭包做用:读取函数内部变量,让这些变量始终保存在内存中,封装对象的私有属性和私有方法。
七、否运算(~)
八、Number:调用对象自身的valueOf
方法。若是返回原始类型的值,则直接对该值使用Number
函数,再也不进行后续步骤。若是valueOf
方法返回的仍是对象,则改成调用对象自身的toString
方法。若是返回原始类型的值,则对该值使用Number
函数,再也不进行后续步骤。若是toString
方法返回的是对象,就报错。
String:先调用对象自身的toString
方法。若是返回原始类型的值,则对该值使用String
函数,再也不进行如下步骤。若是toString
方法返回的是对象,再调用valueOf
方法。若是返回原始类型的值,则对该值使用String
函数,再也不进行如下步骤。若是valueOf
方法返回的是对象,就报错。
Boolean:undefined null -0 0或+0 NaN ''(空字符串)为false,其他为true。
九、Error
构造函数,全部抛出的错误都是这个构造函数的实例。
原生错误类型:SyntaxEror(语法错误),ReferenceError(引用一个不存在的变量),RangeError(值超出范围),TypeError,URIError,EvalError。
若是没有发生错误,则运行finally
代码块关闭文件;一旦发生错误,则先使用catch
代码块处理错误,再使用finally
代码块关闭文件。
十、避免使用全局变量。若是不得不使用,用大写字母表示变量名。
全部函数都应该在使用以前定义,函数内部的变量声明,都应该放在函数的头部。
建议使用Object.create()
命令,替代new
命令。
不要使用“相等”(==
)运算符,只使用“严格相等”(===
)运算符。
建议自增(++
)和自减(--
)运算符尽可能使用+=
和-=
代替。
建议避免使用switch...case
结构,用对象结构代替。
3、标准库
一、Object.keys
方法只返回可枚举的属性,Object.getOwnPropertyNames
方法还返回不可枚举的属性名。
var type = function (o){
var s = Object.prototype.toString.call(o);
return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};比typeof更准确。
二、concat
方法返回当前数组的一个浅拷贝。所谓“浅拷贝”,指的是若是数组成员包括复合类型的值(好比对象),则新数组拷贝的是该值的引用。
push
方法还能够用于向对象添加元素,添加后的对象变成相似数组的对象,即新加入元素的键对应数组的索引,而且对象有一个length
属性。[].push.call(a,1)。
slice
方法的一个重要应用,是将相似数组的对象转为真正的数组。Array.prototype.slice.call({...})。
map
方法对数组的全部成员依次调用一个函数,根据函数结果返回一个新数组。map经过call方法还能够用于字符串。
三、valueOf()返回包装对象实例对应的原始类型的值。toString()返回实例对应的字符串形式。
原始类型的值,能够自动看成对象调用,即调用各类对象的方法和参数。这时,JavaScript引擎会自动将原始类型的值转为包装对象,在使用后马上销毁。
四、Number:toString(),toFixed()小数位数,toExponential()科学计数法,toPrecision()指定位数的有效数字。
五、String:用slice代替substring。search
方法的用法等同于match
,可是返回值为匹配的第一个位置。
六、Math.round(-1.5)。返回随机字符串:
1 function random_str(length) { 2 var a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 3 var str = ''; 4 for (var i=0; i < length; ++i) { 5 var rand = Math.floor(Math.random() * a.length); 6 str += a.slice(rand, rand + 1); 7 } 8 return str; 9 }
七、Date:getYear()
:返回距离1900的年数。valueOf
方法返回实例对象距离1970年1月1日00:00:00 UTC对应的毫秒数,该方法等同于getTime
方法。
八、正则:regex.test(string)返回布尔值
。regex.exec(string)返回数组,有lastIndex属性。string.match(regex)不匹配返回null。search返回第一个知足条件的匹配结果在整个字符串中的位置,不然-1。
九、JSON:JSON.stringify,
JSON.parse
方法用于将JSON字符串转化成对象。
十、console
十一、属性描述对象
4、面向对象编程
一、JavaScript的对象体系是基于构造函数(constructor)和原型链(prototype)的。使用构造函数(constructor)做为对象的模板(首字母大写)。
new
命令的做用,就是执行构造函数,返回一个实例对象。new命令总返回一个对象。
若是构造函数内部有return
语句,并且return
后面跟着一个对象,new
命令会返回return
语句指定的对象;不然,就会无论return
语句,返回this
对象。
二、this
在全局环境使用this
,它指的就是顶层对象window。构造函数中的
this
,指的是实例对象。当A对象的方法被赋予B对象,该方法中的this
就从指向A对象变成了指向B对象。
三、prototype
原型对象的做用,就是定义全部实例对象共享的属性和方法。
constructor
属性的做用,是分辨原型对象到底属于哪一个构造函数。
instanceof
运算符用来比较一个对象是否为某个构造函数的实例。
Object.getPrototypeOf
方法返回一个对象的原型。
Object.setPrototypeOf
方法能够为现有对象设置原型,返回一个新对象。
对象实例的isPrototypeOf
方法,用来判断一个对象是不是另外一个对象的原型。
四、Object对象与继承
五、面向对象编程的模式
5、DOM(未看)
一、对于HTML文档,节点主要有如下六种类型:Document节点、DocumentType节点、Element节点、Attribute节点、Text节点和DocumentFragment节点。
6、浏览器环境
一、浏览器核心:渲染引擎和JavaScript引擎,
若是脚本之间没有依赖关系,就使用async
属性,若是脚本之间有依赖关系,就使用defer
属性。若是同时使用async
和defer
属性,后者不起做用,浏览器行为由async
属性决定。
重流必然致使重绘,重绘不必定须要重流。
根据页面自己的协议来决定加载协议,这时能够采用下面的写法。<script src="//example.js"></script>
二、window.location === document.location。
URL编码:
encodeURI(),
encodeURIComponent(),
decodeURI(),
decodeURIComponent()。
三、history.back()返回上一页(从浏览器缓存中加载)。
URLSearchParams API用于处理URL之中的查询字符串,即问号以后的部分。
URLSearchParams
还能够与URL
接口结合使用。var url = new URL(location);
url.searchParams就是URLSearchParams {}对象。
四、每一个Cookie的大小通常不能超过4KB。
Cookie保存如下几方面的信息:Cookie的名字,Cookie的值,到期时间,所属域名(默认是当前域名),生效的路径(默认是当前网址)。
window.navigator.cookieEnabled
属性返回一个布尔值,表示浏览器是否打开Cookie功能。document.cookie
属性返回当前网页的Cookie。
两个网址只要域名相同和端口相同,就能够共享Cookie。
五、sessionStorage和localStorage。
JSONP:网页经过添加一个<script>
元素,向服务器请求JSON数据,这种作法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。
WebSocket是一种通讯协议,使用ws://
(非加密)和wss://
(加密)做为协议前缀。
六、浏览器将CORS请求分红两类:简单请求(simple request)和非简单请求(not-so-simple request)。
JSONP只支持GET
请求,CORS支持全部类型的HTTP请求。
七、Notification API是浏览器的通知接口,用于在用户的桌面(而不是网页上)显示通知信息。
八、Performance API用于精确度量、控制、加强浏览器的性能表现。
7、语法专题:
一、JavaScript引擎有多个线程,单个脚本只能在一个线程上运行,其余线程都是在后台配合。
为了利用多核CPU的计算能力,HTML5提出Web Worker标准,容许JavaScript脚本建立多个线程,可是子线程彻底受主线程控制,且不得操做DOM。
所谓Event Loop机制,指的是一种内部循环,用来一轮又一轮地处理消息队列之中的消息,即执行对应的回调函数。(异步模式)
全部任务分为同步任务和异步任务。
二、若是被setTimeout
推迟执行的回调函数是某个对象的方法,那么该方法中的this
关键字将指向全局环境。
setIntervel具备累积效应。
三、Promise是JavaScript异步操做解决方案。
四、严格模式
以上笔记总结自—— http://javascript.ruanyifeng.com/