也是之前看的。笔记中包含书中重点和自己的一些补充及思考。
第二章:语法。
数字
JavaScript只有一个数字类型。它在内部表示为64位的浮点数。
指数:100 == 1e2
NaN:不等于任何值包括自身。 isNaN(number)
Infinity
Math方法。
字符串
\是转义字符。
JavaScript在被创建时,Unicode是一个16位的字符集。所以JavaScript中的所有字符都是16位的。
\u 约定用来指定字符编码。"A"==="\u0041";
字符串方法。
语句:
下面的值被当做假:
false null undefined '' 0 NaN。
其他所有值都被当做真。所有对象。
'0' == true; //false if('0'){console.log(1)} //1
运算符号优先级
/可能会产生非整数结果。
&&、||
字面量、函数
第三章、对象
对象字面量。
检索。点号或中括号。
不存在属性的返回undefined。可用||来填充默认值。
undefined上检索会报错。可用&&来避免错误。
引用
两个对象永不相同,除非是同一个对象。
原型。
原型连接在更新时是不起作用的。当我们对某个对象做出改变时,不会触及该对象的原型。(如果修改的属性是引用类型,也是会改变原型中的属性的。思考下面的例子)
function F(){} F.prototype.a=[1,2]; var f = new F; f.a.push(3); F.prototype.a;//[1, 2, 3],原型被修改。 f.a = null F.prototype.a;//[1, 2, 3],原型不变。
添加一个新的属性到原型中,会立即对所有的实例生效。
反射。
hasOwnProperty。
枚举:
删除:
delete可以删除对象 的属性。 不会触及原型链中的任何对象。如果删除对象的属性可能会让原型链中的属性透现出来。
减少全局变量污染。。。每本书都在写这个啊。前一篇文章中也有相关记录。
方法一。为你的应该创建唯一的一个全局变量。 var MYAPP={}。 全局变量容器。
方法二。闭包。
第四章。函数。
函数对象。
对象字面量产生的对象连接到 Object.prototype。函数对象连接到Function.prototype。(该原型对象本身连接到Object.prototype)。思考下面这个面试题目:
var F = function(){}; Object.prototype.a = function(){}; Function.prototype.b = function(){}; var f = new F(); 请问:F.a? F.b?f.a?f.b?
函数字面量。
通过函数字面量创建的对句包含一个连接到外部上下文的连接。这被称为闭包。
调用。
this取决于调用模式。
方法调用模式。 a.b()。 this是自己所属的对象。
函数调用模式。 add(3,4); this全局对象。
new模式(构造器模式)。 这样调用,背地里将会创建一个连接到该函数的prototype的新成员对象。this会被绑定到那个新对象上。__proto__.
apply模式。传入this。和参数数组。 apply call bind。
参数。arguments.
无须指定参数个数的函数。
另arguments与形参会保持一致。
arguments不是真正的数组,有length属性。没有任何数组方法。 (不过貌似可以借用数组函数。要使用数组函数可以思考下面的函数)
function add(){ Array.prototype.push.apply(arguments,[4,5]);//借用数组方法。 console.log(arguments); } add(1,2,3)//[1,2,3,4,5]
函数总是有返回。没有指定返回值就返回undefined。
如果函数前加上new。且return的不是对象,则返回this。 return的直接量,将忽略,返回this。
异常。
扩充类型的功能。
比如给不支持bind的浏览器增加bind函数。
注意添加方法前要检测方法是否已存在。
递归。
优化。
作用域。
暂时没有块级作用域。
闭包。
看这个例子:
function a(nodes){ var i ; for(i=0,nLen = nodes.length;i<nLen;i++){ nodes[i].onclick = function(e){ console.log(i); } } }
回调
模块。可以使用函数和闭包来构造模块。
私有变量。特权函数。
闭包屏蔽全局变量。
级联。
返回this 。链式操作。
柯里化。部分函数。
var add1 = add.curry(1);
slice可以把arguements转化返回到一个数组。
记忆。
函数可以把之前计算过的值存储在函数属性中。避免重复计算。
生产这种函数的函数。
第五章、继承。
伪类。
忘记new 。 不会加到对象上。会加到全局对象上。
约定首字母大写。
对象说明符。配置对象。 参数。
原型。
函数化。
部件。可以从一套部件中把对象组装出来。
第六章、数组。
数组字面量。
长度。
不一定等于数组里属性的个数。
设置length小于实际可删除数组的内容。
删除。
delete Arr[2] //会在数组中留下一个undefind.
arr.splice(2,1)//从第几个开始,删除几位数。 对大型数组效率不高。
容易混淆的地方。
value.constructor === Array 这种情况在在不同的window或frame中会失败。
var is_array(value){ return Object.prototype.toString.apply(value) === '[object Array]'; }
方法。
Array.prototype.reduce = function(f,value){ var i ; for(i=0;i<this.length;i++){ value = f(this[i],value); } return value; } var data=[4,8,15,16,23,42]; var add = function(a,b){ return a+b; } var sum = data.reduce(add,0); console.log(sum);
指定初始值。
就像我写那个扫雷游戏一样。用一个专门的函数循环生成深层的。或直接字面量。
第七章、正则表达式。
toExponential(fractionDigits);//转化为指数字符串。0-20位小数。
toFixed(fractionDigits);//保留小数位数。0-20位。
toPrecision(precision)//转化为10进制字符串,0-20位。
toString(radix);//转化为radix进制的字符串。
Object.
hasOwnProperty(name);//是否函数本身的属性。不包含原型中的。
RegExp.
String
charAt(pos)//返回pos位置的字符。
charCodeAt(pos)//返回字符码位,整数。小于0或大于length返回NaN.
contact(string…)
indexOf(searchString,postion)。//返回第一个匹配项第一个字符位置或-1。 position,可选参数,从哪一位开始搜。
lastIndexOf(searchString,postion)。//它是从后往前查。
localeCompare(that)比较两个字符 串。//负数或0。
match(regexp)//正则。p89
replace(searchValue,replaceValue) //replace可以是正则。字符串。函数。详细参考P90。
search(regexp) //返回第一个匹配的位置。或-1。
slice(start,end)//负数的情况呢。
split(separator,limit);
toLowerCase()//转小写。
toUpperCase()//转大写。
fromCharCode(char…) //根据数字编码返回字符串。
第9章 代码风格。
如果程序可读性强,它正常运行的可能 性以及是否准确按照我们意图去工作的可能性也显著增强。
保持注释是最新的。
注释像一个时间机器,我用它发送重要的信息给未来的我。
唯一全局变量。
统一风格
第10章、优美的特性
函数是顶级对象
基于原型继承的动态对象
对象字面量和数组字面量。
附录A
毒瘤
全局变量。
作用域。 每个函数开头部分声明所有变量。
保留字。不能用来命名变量或参数。用于对象字面量的键值时必须加引号。不能用在点表示法中。(其实很多浏览器中不存在这两个问题。)
Unicode
typeof null。 a = null a&& typeof a ==='object';
parseInt 1.没有提示是否有额外文本。2.parseInt('04')。 请一直加上 parseInt("04",10);
+。 容易出错的加号。
浮点数。 0.2+0.1 == 0.3 //false。 二进制的浮点数不能正确地处理十进制的小数。 整数可以。 所以可以用整数来除。
NaN。
伪数组。 区分数组和对象的方法。 arguments是一个有length属性的对象。
糟粕
==
with
eval
continue
switch穿越
缺少块的语句
包装对象的直接使用。
new。 更好的策略是根本不使用new。
void。