新博客地址:http://gengliming.com
再讀js高級程序設(shè)計(第3版)匹舞,把一些細節(jié)記錄一下
未完待續(xù)揩徊。平夜。蝶棋。
第三章 基本概念
1、null == undefined;// true
2忽妒、typeof null;// 'object' typeof NaN;// 'number'
3玩裙、js中可以保存+0和-0,但是兩者相等;
4段直、浮點數(shù)值需要的內(nèi)存空間是整數(shù)值的兩倍;
5吃溅、不要做這樣的判斷,因為浮點數(shù)最高精度是17位坷牛,0.1+0.2=0.300000000000000004罕偎;
if (a + b == 0.3) { }
6、任何數(shù)除以0返回NaN京闰,涉及NaN的操作都返回NaN颜及;
7、NaN == NaN;// false
8蹂楣、isNaN()適用于對象俏站,先調(diào)對象的valueOf(),如果返回的值不能轉(zhuǎn)換為數(shù)值痊土,再測試toString()的返回值肄扎;
9、parseInt()的第二個參數(shù)可以制定進制,parseFloat只能轉(zhuǎn)化10進制犯祠;
10旭等、String():如果參數(shù)有toString()方法,則調(diào)用衡载;如果參數(shù)是null/undefined則返回"null"/"undefined";
11搔耕、Infinity * 0 = NaN; Infinity *Infinity = Infinity; Infinity/Infinity = NaN;
第四章:變量、作用域和內(nèi)存
1痰娱、ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的弃榨,文中是這么解釋的;參數(shù)是引用類型時梨睁,只是對地址的值拷貝鲸睛;
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //Nicholas
第五章 引用類型
1、使用字面量定義對象時坡贺,實際上不會調(diào)用Object構(gòu)造函數(shù)官辈,Array也是這樣;
2遍坟、以下方式不推薦钧萍,因為會導致解析兩次代碼(第一次試解析常規(guī)ECMAScript代碼,第二次是解析傳入構(gòu)造函數(shù)中的字符串)
var sum = new Function('num1', 'num2', 'return num1 + num2 ');
3政鼠、jQuery源碼中通過索引使用this的:
this.context = document;
// 看這里
this[0] = document.body;
this.selector = selector;
this.length = 1;
我就去群里問這是什么用法风瘦,有人一眼就看出來這是jQ源碼
A:你得從頭看,不從頭看是看不懂的公般;
我:為什么可以this[0]万搔?
A:為什么數(shù)組可以?
我:數(shù)組可以但是為什么對象也能這么用官帘?
A:所以讓你從頭看瞬雹,你都不知道什么時候?qū)ο筠D(zhuǎn)化成數(shù)組的(然后截圖jQuery.makeArray)
其實很簡單,js中對象是可以通過key來賦值的刽虹,上面的0其實相當于key:
function Person( name ) {
this.name = name;
this["name"] = 'new name';
}
var p = new Person('glm');
console.log(p.name); // "new name"
- delete 不會對原型產(chǎn)生影響酗捌,而且可以暴露原型屬性
function Person() {
this.name = 'lmg';
}
Person.prototype.name = 'glm';
var p = new Person();
console.log(p.name); // "lmg"
delete p.name;
console.log(p.name); // "glm"
- 如果函數(shù)以在前面加上new前綴的方式來調(diào)用,且返回值不是一個對象涌哲,則返回this(該新對象)
// function Person() {
// this.name = 'lmg';
// return 1;
// }
// console.log(new Person()); // Person {name: "lmg"}
function Person() {
this.name = 'lmg';
return {};
}
console.log(new Person()); // Object {}
第十章 DOM
1胖缤、IE中的所有DOM對象都是以COM對象的形式實現(xiàn)的。
2阀圾、每個節(jié)點都有childNodes屬性哪廓,其中保存著一個NodeList對象,這個對象是類數(shù)組對象初烘,它實際是基于DOM結(jié)構(gòu)動態(tài)執(zhí)行查詢的結(jié)果涡真;
3分俯、以下代碼在IE8及以前版本是無效的,因為這些版本中NodeList實現(xiàn)為一個COM對象哆料。
var arrayofNodes = Array.prototype.slice.call(someNode.childNodes,0)
以下為跨瀏覽器的方法:
function convertToArray(nodes) {
var array = null;
try {
array = Array.prototype.slice.call(nodes, 0); // 非IE
} catch (ex) {
array = new Array();
for (var i=0, len = nodes.length; i < len; i++ ) {
array.push(nodes[i]);
}
}
return array;
}
4缸剪、removeChild()和replaceChild()移除的節(jié)點仍然為文檔所有,只是文檔中已經(jīng)沒有了自己的位置东亦,被移除的節(jié)點可以根據(jù)返回值的到橄登;
5、NodeList及其“近親”NamedNodeMap和HTMLCollection都是動態(tài)的讥此,每當文檔結(jié)構(gòu)發(fā)生變化時,它們都會得到更新谣妻;