阅读:《javascript权威指南》(笔记)
判断是否为NaN类型:x!=x //true 当且仅当x为NaN时,x才不等于自身。
js数字精度值极其接近0.1,如:0.411 - 0.401,期待结果0.01,实际结果结果为0.009999999999999953;通过"\"符号连接字符串,拼接html字符串更简洁,更高效;
parseInt和parseFloat参数若为字符串,则该字符串只能以空格和数字开头,否则解析为NaN,并且只能解析连贯的数字,如:parseInt(" 12abc")//12,parseInt("abc111")//NaN,parseInf(" 1a2b3c")//1,parseInf(" 1 2")//1;
toString或valueOf将对象转换为原始值,但大多数对象无法真正表示原始值,此时valueOf方法返还对象本身;
通过var定义的变量可枚举,可读写,但不可配置,so,无法通过delete删除;
通常,null表示意料之中的空值,而undefined表示意料之外的,不可预见的空值;
"," 操作符,返回第二个操作数,如连续使用,则返回最后一个操作数,如:1,2,3//3;
一般情况下,函数和可执行对象都能用typeof检测出"function",但在ie9之前,非原生可执行对象的检出结果却为"object";
with(o) x = 1,如果o对象中存在x,则对其赋值为1,否则,with语句不起任何作用,x将会挂在window对象下(如果不存在x),并被赋值为1。在严格模式种,禁止使用with;
严格模式(ES5):禁止使用with,
变量必须先声明,否则会抛出引用错误异常,
arguments不再引用函数的参数地址,而是参数的副本,
运用arguments.caller和arguments.callee将抛出异常,
更多见《javascript权威指南》(第六版)5.7.3 "use strict";
属性描述(读写 枚举 配置)在ES5以前都是true,不可配置,ES5及更高版本则可配置;
js无法通过对象(B)修改其原型链上对象(A/B.prototype),可利用这点,实现inherit函数,创建继承目标对象(A)的空对象(B)来代替A做一些事情,从而避免A被意外修改,inherit函数如下:
function inherit(obj){
... //确保obj为非null的对象
if(Object.create){//ES5+
return Object.create(obj)
}else{//ES5以下,利用new function创建继承关系
function f() {}
f.prototype = obj
return new f()
}
}
Object.key与Object.getOwnPropertyNames(ES5),Object.key()返回可枚举的自有属性名的集合A,Object.getOwnPropertyNames()返回所有自有属性名的集合B,A是B的子集;
getter、setter(ES5),属性描述中不具有writable这项,只有getter,则可读,只有setter,则可写,两者都有,则可读写;
getPrototypeOf(ES5)和setPrototypeOf(ES6)来自Object对象,为其私有属性,不可继承,也不能在Object原型链上找到,so,一般情况,只能通过Object.getPrototypeOf/setPrototypeOf的方式调用,而isPrototypeOf(ES5)来自根对象(Object.prototype),可被继承,因此,可直接使用任意对象A.isPrototypeOf的方式使用;
Object的prototype属性为只读(writable:false),不可枚举(enumerable:false),也不可配置和删除(configurable:false)
configurable:false的情况下,不能修改configurable和enumerable;
密封(Object.seal/isSealed):不可拓展(Object.preventExtensions),不可配置和删除(configurable:false);
冻结(Object.freeze/isFrozen):在密封的基础上,属性描述除value外全部设为false,即:不可拓展、删除、枚举、配置,只读
复制对象,需遍历Object.getOwnPropertyNames()所返回的集合,以免for in循环漏掉不可枚举的属性;
Object.prototype.toString.call()在部分低版本浏览器上(如:ie8及以下)并不能正确区分null、和undefined类型;
delete删除数组中元素时,并不会改变数组长度,故用splice来实现删除更合理;
利用slice、concat、map等方法能返回新数组的特性,可实现数组的clone(如:arr.slice(0),arr.concat());
ES5新增数组方法:forEach,map,filter,some,every,reduce,reduceRight,indexOf,lastIndexOf;
typeof判断结果为不为object的话,则为原始值
文档加载分三个阶段,对应document.readyState值分别为loading,interactive(此时文档已加载完毕,触发document对象的DOMContentLoaded事件),complete(触发window对象的load事件),注:三个状态 不同浏览器可能有不同的名称
excanvas.js解决ie对canvas的兼容问题
子窗口内调用window.frameElement可获取加载自身的iframe元素,如果window为顶级窗口,则返回结果为null
iframe元素通过contentWindow/contentDocument可获取该子窗口window/document对象
window.frames返回包含所有子窗口window对象的类数组(不能递归,即不包括子窗口的子窗口等)
Sizzle是jQuery dom选择器独立出来的库
getAttribute(获取非标准属性),setAttribute(设置非标准属性),hasAttribute,removeAttribute
var el = document.querySelector("XXX"),通过data-xxx的方式可以设置el的标准属性,动el.dataset.xxx的方式可以读写xxx属性属性,在html元素上表现为data-xxx=....。还可以通过el.attributes的方式取得el的所有属性
innerHTML,outerHTML,innerText,outerText,textContent
textContent会获取所有元素的content,包括`<script>`和`<style>`元素
innerText不会获取hidden元素的content,而textContent不会
innerText会触发reflow,而textContent不会
innerText返回值会被格式化,而textContent不会
document.createDocumentFragment()方法会创建一个文档片段(想象成一个不存在的dom元素),可以将要添加到dom中的element集合先放到这个文档片段中,再将文档片段append到dom树种,从而只需要进行一次reflow(渲染)