- 不通过var声明的变量叫隐式声明变量,隐式变量是全局变量,即使是在函数内部隐式声明的变量也属于全局变量。
- 对常量进行赋值,常量的值不会改变。
- 匿名函数表达式是一种表达式,所以也可以在表达式内使用。javascript中函数也是一种对象。
- javascript对象可以定义为属性的集合。作为对象属性的函数也可以称为一种方法。
- 在对象中,如果给不存在的属性进行赋值,则将新建该属性并赋值。对象的属性可以用点号和中括号两种方式进行访问。
- 在new之后写函数名的话,就会把该函数作为构造函数进行调用。
- javascript这种以实例来继承属性的方式称为原型继承。
- javascript中有5种基本数据类型:字符串类型、数值型、布尔型、null型、undefined型,其他的都称为Object型。也就是说,总的来看,javascript的数据类型可以分为6种。javascript中没有字符类型,如果需要表达某个字符的话可以使用长度为1的字符串值。注意typeof null 的结果是object。null是空对象,undefined表示是未定义。
- 像java这样,变量具有数据类型的语言,被称为静态数据类型语言;而像javascript这样,变量没有类型的语言,称为动态数据类型语言。
- 在javascript中,浮点数的内部结构遵循IEEE754标准。
浮点小数的特殊数值:Number.POSITIVE_INFINITY(正无穷大)、Number.NEGATIVE_INFINITY(负无穷大)、Number.NaN(Not a number)。 - NaN不但不与其他任何数值相等,就算两个NaN的等值判断,其结果也为假。
- +运算在作为单目运算符的情况下是正号运算。+‘100’ 的结果是100。
- 在字符串值和数值之间进行数据类型转换时需要注意的地方
转换的对象 | 数据类型转换 | 结果 |
---|---|---|
无法被转换为数值的字符串值 | 转换为数值类型 | 数值NaN |
空字符串 | 转换为数值类型 | 0 |
数值NaN | 转换为字符串型 | 字符串“NaN” |
数值infinity | 转换为字符串型 | 字符串“infinity” |
数值-infinity | 转换为字符串型 | 字符串“-infinity” |
- !运算符是用于布尔型操作数的逻辑非运算。在操作数不是布尔型的情况下会自动转换为布尔型。因此,只要使用!!这样的双重否定,就能够将值转换为布尔型。注意Object类型被转换为布尔型之后结果必然为true。
- 字面量(literal)指的是,在代码中写下这些值之后,将会在运行时直接使用这些值的字面含义。
- switch语句所隐藏的等值比较运算是不会对数据类型进行转换的
===
运算(注意与==
的差别)。 - for each in语句在ECMAScript中并不存在,是javascript独有的增强功能。注意与for in的区别。
var obj = { x:1, y:3, z:2};
for (var k in obj) {
console.log(obj[k]);
}
for each(var v in obj) {
console.log(v);
}
- 异常处理时,catch和finally不能同时省略。finally在try没有异常的情况下也会被执行。javascript中的一个try语句只能使用一个catch子句,因此这个catch子句可以捕捉任意类型的异常。要把异常传递至上一层(函数的调用方),就不能使用catch,或者需要在catch中重新抛出异常对象。
- ++运算符这种会改写操作数本身的运算符叫做破坏性运算符。
- ~是取反运算符。
- delete是用于删除属性的单目运算符,其功能是从对象中删除以操作符指定的属性。通过var声明的全局变量无法被delete,而没有使用var声明的隐式的全局变量可以被delete。
- void是undefined类型的单目运算符。
- 比较运算符中,数值比较优先于字符串比较。
- 有一种常用的变量声明方式,如下所示
var a = a || 7; //该代码利用了对已经声明的变量再次声明不会产生副作用的特性
- 几乎所有的javascript实现都采用了引用复制的方式。这是因为,如果在进行变量赋值时进行只服从的复制,效率将变得非常低。
- 实际开发中,通常会分别设计用于函数调用的函数和用于构造函数的函数,所以方便起见,将为了构造函数而设计的函数称为构造函数,构造函数的名称一般以大写字母开头(如MyClass)。不建议在构造函数中使用return语句。
- 通过原型继承而得到的属性无法被delete。
- 所谓循环引用,指的是对象通过属性相互引用而导致他们不会被判定为不再使用的状态。
- ECMAScript标准中并没有_proto_属性(隐式链接), ECMAScript标准第5版中有getPrototypeOf这样一个方法,它将会返回“隐式链接”所引用的对象。
- constructor属性不是对象的直接属性,而是通过原型链查找到的属性。
- Object是javascript中所有的类的基类。Object类的属性:create、defineProperty、defineProperties、freeze、getPrototypeOf、getOwnPropertyDescription、getOwnPropertyNames、isSealed、isFrozened、isExtensible、keys、length、preventExtensions、prototype、seal。
- Object.prototype对象的属性:constructor、hasOwnProperty、isPrototypeOf、propertyIsEnumerable、toSource、toLocaleString、toString、unwatch、valueOf、unwatch、watch、_defineGetter、defineSetter、lookupGetter、lookupSetter、noSuchMethod、proto。
- 虽然arguments可以以数组的方式使用,不过它本身并不是数组对象。因此,无法对其使用数组类的方法。
- ECMAScript第5版的静态模式中,ECMAScript.callee、ECMAScript.caller被禁止使用。
- 在通常的语境中,函数的概念等价于Function对象的引用。
- Function.prototype对象的属性名:apply、bind、call、caller、constructor、isGenerator、length、name、toSource、toString。
- 闭包是一种具有状态的函数,其相关的局部变量在函数调用后将会继续存在。闭包的前提条件是需要在函数声明的内部声明另外一个函数(即嵌套的函数声明)。
- 通过将回调函数与异步处理相结合,就能够实现并行处理。
- Iterator类示例:
var arr = ['zero', 'one', 'two'];
var it = new Iterator(arr, true);
console.log(it.next);
- RegExp.prototype对象的属性:constructor、exec、test、toSource、toString。
- String对象中将正则表达式对象最为参数的方法:match、replace、search、split。
- 基于用户代理的跨浏览器事件侦听支持策略
var addEvent(target, name, fn) = function() {
var isIE = navigator.userAgent.indexOf('MISE') > 0;
if(isIE){
addEvent = function(target, name, fn) {
target.attchEvent('on'+name, fn);
}
} else {
addEvent = function(target, name, fn) {
target.addEventListener(name, fn, false);
}
}
addEvent(target, name, fn);
}
- 基于功能测试的跨浏览器事件侦听支持策略
var addEvent(target, name, fn) = function() {
if(!window.addEventListener){
addEvent = function(target, name, fn) {
target.attchEvent('on'+name, fn);
}
} else {
addEvent = function(target, name, fn) {
target.addEventListener(name, fn, false);
}
}
addEvent(target, name, fn);
}
- HTML DOM节点:元素节点、属性节点、文本节点、注释节点、文档节点。
- 节点的选择:document.getElementById、document.getElementByTagName、document.getElementByClassName、document.getElementByName。
var allElements = document.getElementByTagName('*'); // 获取所有的元素
- 节点属性:parentNode、childNodes、firstChild、lastChild、nextSibling、perviousSibling。空白符也会作为文本节点处理。
- 元素属性:child、firstElementChild、lastElementChild、nextElementSibling、previousElementSibling、childElementCount。
- Selector API:document.querySelector
var a = document.querySelector('#foo');
- 节点的创建与新增
var elem = document.createElement('div');
var text = document.createTextNode('this is a new div element');
document.body.appendChild(elem);
elem.appendChild(text);
var comment = document.createComment('this is comment');
document.body.insertBefore(comment, elem);
- 节点内容的更改
var newNode = document.createElement('div');
var oldNode = document.getElementById('foo');
var parentNode = oldNode.parentNode;
parentNode.replaceChild(newNode, oldNode);
- 节点的删除
var elem = document.getElementById('foo');
elem.parentNode.removeChild(elem);
- innerHTML/textContent,IE使用innerText。
- 使用document.createDecumentFragment可以将画面的重绘次数降低到1次。
- 有些事件无法通过在事件中使用preventDefault()方法来终止,blur事件就是其中之一。
- 样式的变更方法:通过className更改、通过classList属性更改、通过style属性更改、直接更改样式表(document.stylesheets)。可以使用的classList属性的方法:contains、add、remove、toggle。
- ajax示例
function showHint(str)
{
var xmlhttp;
if (str.length==0)
{
document.getElementById("txtHint").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 浏览器执行代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","/try/ajax/gethint.php?q="+str,true);
xmlhttp.send();
}
var $j = jQuery.noConflict(true); //同时删除window.$与window.jQuery两者。返回值是一个jQuery对象
- 点击查看[popstate]
- onLine 属性是一个只读的布尔值,声明了系统是否处于脱机模式。语法:
navigator.onLine
。 - 能够设定拖动元素的事件处理程序:ondragstart、ondrag、ondragend。能够设定释放区域的时间处理程序:ondragenter、ondragover、ondragleave、ondrop。DataTransfer接口:setData、getData、clearData、types、files、setDragImage、addElement、effectAllowed、dropEffect。
- FileReader方法:readAsArrayBuffer、readBinaryString、readAsText、readAsDataURL、abort。 FileReader事件处理程序:onloadstart、onprogress、onload、onerror、onabort、onloadend。FileReader属性:result、error、readyState、EMPTY、LOADING、DONE。文件读取错误:NOT_FOUND_ERR、SECURITY_ERR、ABORT_ERR、NOT_READABLE_ERR、ENCODING_ERR。progress事件对象属性:lengthComputable、loaded、total。dataURL格式:
data:[<MINE Type>] [;base64], <data>
。FileReaderSyn接口:readAsArrayBuffer、readAsText、readDataUrl。 - 使用web storage,如果指定了一个不存在的键并试图引用,则会返回null。而对于通常的对象来说,如果指定了一个不存在的键并试图引导,返回的将是undefined。数据的删除:
delete localStorage.foo
、localStorage.clear()
。可以使用命名空间localStorage['SERVICE_NAME']
和版本管理localStorage.version
。 - web worker示例:
主线程:
var worker = new Worker('worker.js');
worker.postMessage('foo');
worker.onmessage = function(event) {
var receiveMessage = event.data;
/*进一步处理*/
}
// worker.terminate(); // 删除进程
worker.js
self.postMessage('foo');
self.onmessage = function(event) {
var receiveMessage = event.data;
/*进一步处理*/
}
// self.close(); // 删除自身
- 共享工作线程示例:
主线程:
var worker = new ShareWorker('http://www.foo.org/share-worker.js');
worker.port.postMessage('foo');
worker.port.onMessage = function() {
var receiveMessage = event.data;
// ToDo
}
share-worker.js,单个窗口
self.onconnect = function(connectEvent) {
var port = connectEvent.ports[0];
portpostMessage('hello, ShareWorder');
port.onMessage = function(messageEvent) {
port.postMessage(messageEvent.data);
}
}
// self.close();
share-worker.js,多个窗口
self.onconnect = function(connectEvent) {
var port = connectEvent.ports[0];
ports.push(port);
port.onMessage = function(messageEvent) {
ports.forEach(function(e){
e.postMessage(messageEvent.data);
});
}
}
// self.close();