《JavaScript语言精粹》笔记

也是之前看的。笔记中包含书中重点和自己的一些补充及思考。


第二章:语法。


数字

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);

也可以给数组添加 属性如 total。不会改变他的 length。


指定初始值。

就像我写那个扫雷游戏一样。用一个专门的函数循环生成深层的。或直接字面量。


第七章、正则表达式。


第8章、方法
Array
contact(item…)
join(separator)
pop(); 返回最后一个元素或undefined
push(item)
shift();
slice(start,end);注意为负的情况。或大于length的情况。
sort(fn);默认是把要排序的函数视为字符串的。   不稳定。
splice(start,deleteCount,item…)
unshift();从前推,返回新的长度。

Function
apply(thisArg,argArray);
bind如何实现?

Number

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。




你可能感兴趣的:(JavaScript,前端,JavaScript语言精粹)