1、枚举:

用for in 语句来遍历一个对象中所有的属性名,该枚举过程将会列出所有的属性也包括涵数和方法,如果我们想过滤掉那些不想要的值,最为常用的过滤器为hasOwnProperty方法,以及使用的typeof来排除,

var name;

for(name in another_stooge){

  if(typeof another_stooge[name] !== "function"){

    document.writeln(name + ":" + another_stooge[name]);

}

}

2、减少全局变量的污染:

a、最小化使用全局变量的一个方法是在你的应用中只创建唯一一个全局变量,

var MYAPP = {};

该变量此时变成了你的应用容器,

MYAPP.stooge = {

first-name:"joe",

last-name:"howard"

};

b、可以使用闭包的形式进行信息隐藏的方式来减少全局变量污染。

3、函数之调用方法模式:

当一个函数被保存为对象的一个属性时,我们称它为一个方法,当一个方法被调用时,this被绑定到该对象。如果一个调用表达式包含一个属性存取表达式(即一个点表达式或者[subscript]下标表达式),那么它被当作一个方法来调用。

4、this关键字的理解:

当函数以函数调用模式调用时,this被绑定到全局对象,这是语言设计上的一个错误,倘若语言设计正确,当内部函数被调用时,this应该仍然绑定到外部函数的this变量,这是设计错误的后果是方法不能利用内部函数来帮助它工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权,幸运的是,有一个很容易的解决方案,如果该方法定义一个变量并给它赋值为this,那么内部函数就可以通过那个变量访问到this。按照约定,我给那个变量命名为that。

简单的解释是:精粹上面是说按照编程的习性   this应该绑定父级函数的this作用域的   可是他却错误的绑定到window上了

5、new操作符的理解:

 理解下new这个操作符的作用, 当存在new操作符时, 函数中的this指向的是刚刚被new创建的对象,相当于this=Object.create(). 而不带new直接调用时,是正常的函数执行,函数内部的this语句指向运行时的上下文环境.  
 
 最近看的书里面都不推荐使用函数构造器的方式构造函数, 他们把 new Function那一类和eval等到一起了. 也就是说使用new方式生成函数对象不被推荐.  但是没有文档说如何处理常规对象生成的问题 
 
6、以下是学习精粹的练习代码
 

<ul id="nav">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
</ul>
<script>
var Quo = function(string){
this.status = string;
}
Quo.prototype.get_status = function(){
return this.status;
}
var myQuo = new Quo("confused");
//document.writeln(myQuo.get_status());

var add = function(a,b){
return a+b;
}
var array = [3,4];
var sum = add.apply(null,array);
//alert(sum);
var statusObject = {
status:'OK'
}
var status = Quo.prototype.get_status.apply(statusObject);
//alert(status);

/*var a=10;
var c=20;
var d={
a:50,
c:60
}
function b(){
return this.a+this.c;
}
var e={
a:100,
c:200,
b:b
};
console.log(b());
console.log(b.apply(this));
console.log(b.apply(d));
console.log(b.apply(e));
console.log(e.b());
console.log(e.b.apply(e));
console.log(e.b.apply(null));
console.log(e.b.apply(this));*/

//arguments
var sum = function(){
var i,sum = 0;
for(i=0;i<arguments.length;i++){
sum += arguments[i];
}
return sum;
}
//alert(sum(4,8,15,16,23,42));

//throw
var add = function(a,b){
if(typeof a !== "name" || typeof b !== "name"){
throw{
name:"TypeError",
message:"add needs numbers"
};
}
return a + b;
}
var try_it = function(){
try{
add("seven");
}catch(e){
alert(e.name + ":" + e.message);
}
}
//try_it();

/*var myQuo = quo("aa");和var myQuo = new Quo("aa");的区别
function Constr(){
this.name = "123";
}
function func(){
return{
name:"123",
}
}
var a = new Constr();
alert(a.constructor);
var b = func();
alert(b.constructor);*/

//颜色从黄色到白色的渐变
var fade = function(node){
var level = 1;
var step = function(){
var hex = level.toString(16);
node.style.backgroundColor = "#FFFF" +hex +hex;
if(level<15){
level += 1;
setTimeout(step,100);
}
};
setTimeout(step,100);
}
fade(document.body);

var nav = document.getElementById("nav");
var nodes = nav.getElementsByTagName("li");
//直接读取
/*for(i=0;i<nodes.length;i++){
nodes[i]['index'] = i;
nodes[i].onclick = function(event){
alert(event.target.index);
//alert(this.index);
}
}*/
//闭包的方式
var add_the_handlers = function(nodes){
var i;
for(i=0;i<nodes.length;i++){
nodes[i].onclick = function(a){
return function(event){
alert(a);
}
}(i);
}
}
add_the_handlers(nodes);

//js 记忆(缓存)
var fibonacci = function(){
var memo = [0,1];
var fib = function(n){
var result = memo[n];
if(typeof result !== 'number'){
result = fib(n-1)+fib(n-2);
memo[n] = result;
}
return result;
}
return fib;
}();
/*
var fibonacci = memoizer([0,1],function(shell,n){
return shell(n-1) + shell(n-2);
});

var factorial = memoizer([1,1],function(shell,n){
return n*shell(n-1);
});*/

//继承
var Mammal = function(name){
this.name = name;
}

Mammal.prototype.get_name = function(){
return this.name;
}
Mammal.prototype.says = function(){
return this.saying || '';
}
var myMammal = new Mammal('Herb the Mammal');
var name = myMammal.get_name();
//alert(name);

var Cat = function(name){
this.name = name;
this.saying = 'meow';
}
Cat.prototype = new Mammal();
Cat.prototype.purr = function(n){
var i,s ='';
for(i=0;i<n;i++){
if(s){
s+='-';
}
s+='r';
}
return s;
};
Cat.prototype.get_name = function(){
return this.says() + ' ' + this.name + ' ' + this.says();
};
var myCat = new Cat('Henrietta');
var says = myCat.says(); //meow
var purr = myCat.purr(5); //r-r-r-r-r
var name = myCat.get_name();//meow Henrietta meow
//alert(says + ' '+purr+ ' ' +name);

//object.prototype是没有长度的
var numbers_object = {
'0':'zero','1':'one'
}
//alert(numbers_object); [object,object]

//传参相加
function add1(){
var sum=0,i;
for(i=0;i<arguments.length;i++){
sum +=arguments[i];
}
return sum;
}
var sum1 = add1(1,2,3,4);
//alert(sum1);

//一维数组
Array.dim = function(dimension,initial){
var a=[],i;
for(i=0;i<dimension;i++){
a[i] = initial;
}
return a;
}
var myArray = Array.dim(10,0);
//alert(myArray);

//多维数组 用0填充的4*4的矩阵
Array.matrix = function(m,n,initial){
var a,i,j,mat=[];
for(i=0;i<m;i++){
a=[];
for(j=0;j<n;j++){
a[j] = 0;
}
mat[i] = a;
}
return mat;
}
var myMatrix = Array.matrix(4,4,0);
//console.log(myMatrix);

//构造一个恒等矩阵的方法
Array.identity = function(n){
var i,mat = Array.matrix(n,n,0);
for(i=0;i<n;i++){
mat[i][i] = 1;
}
return mat;
}
myMatrix = Array.identity(4);
//document.write(myMatrix[3][3]);//1

//正则表达式
var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var url ="http://www.ora.com:80/goodparts?q#fragment";
var result = parse_url.exec(url);
//alert(result);

//正则验证数字
window.onblur = function(){
var num = document.getElementById("num").value;
//var ze = /^[0-9]*$/; //验证数字
//var ze = /^[A-Za-z]+$/; //验证大小写字母
//var ze = /^[A-Za-z0-9]+$/; //验证大小写字母和数字组合
//var ze = /^1[3|4|5|8][0-9]\d{4,8}$/; //验证手机号
//var ze = /^(\d{3,4}-)\d{7,8}$/; //验证电话号码
//var ze = /^([A-Za-z0-9_-])+@([A-Za-z0-9])+(.[a-z])+$/; //验证邮箱
var ze = /(^\d{15}$)|(^\d{17}([0-9]|x)$)/; //验证身份证号
if(num == ""){
alert("不能为空");
}else if(ze.test(num)){
alert("是的");
}else{
alert("不是的");
}
}

//一个语句不能以一个函数表达式开头,因为官方的语法假定以单词function开头的语句是一个function语句,解决办法就是把函数表达式括在一个圆括号之中,
(function(){
//函数体
})();

//arguments 不是数组,是伪数组,没有方法,是带有length成员元素的对象,

//"=="会强制类型转换,"==="这个不会强制类型转换,一般建议用后者

</script>
<input type="text" value="" name="" id="num">

学习javascript语言精粹的笔记的更多相关文章

  1. JavaScript 语言精粹读书笔记

    最近在看 赵泽欣 / 鄢学鹍 翻译的 蝴蝶书, 把一些读后感言记录在这里. 主要是把作者的建议跟 ES5/ES5.1/ES6 新添加的功能进行了对比 涉及到的一些定义 IIFE: Immediatel ...

  2. <JavaScript语言精粹>-读书笔记(一)

    用object.hasOwnProperty(variable)来确定这个属性名是否为该对象成员,还是来自于原型链. for(my in obj){ if(obj.hasOwnProperty(my) ...

  3. JavaScript语言精粹-读书笔记

    前言:很久之前读过一遍该书,近日得闲,重拾该书,详细研究一方,欢迎讨论指正. 目录: 1.精华 2.语法 3.对象 4.函数 5.继承 6.数组 7.正则表达式 8.方法 9.代码风格 10.优美的特 ...

  4. JavaScript语言精粹读书笔记 - JavaScript函数

    JavaScript是披着C族语言外衣的LISP,除了词法上与C族语言相似以外,其他几乎没有相似之处. JavaScript 函数: 函数包含一组语句,他们是JavaScript的基础模块单元,用于代 ...

  5. 【Javascript语言精粹】笔记摘要

    现在大部分编译语言中都流行要求强类型.其原理在于强类型允许编译器在编译时检测错误.我们能越早检测和修复错误,付出的代价越小.Javascript是一门弱类型的语言,所以Javascript编译器不能检 ...

  6. <JavaScript语言精粹>--<读书笔记三>之replace()与正则

    今天有人问我repalce(),他那个题目很有意思.我也不会做,于是我就去查,结果发现就是最基础的知识的延伸. 所以啊最基础的知识才是很重要的,千万不能忽略,抓起JS就写代码完全不知到所以然,只知道写 ...

  7. 《JavaScript语言精粹》笔记

    0.JavaScript的简单数据类型包括数字.字符创.布尔值(true/false).null和undefined值,其它值都是对象. 1.JavaScript只有一个数字类型,它在内部被表示为64 ...

  8. JavaScript语言精粹读书笔记- JavaScript对象

    JavaScript 对象 除了数字.字符串.布尔值.null.undefined(都不可变)这5种简单类型,其他都是对象. JavaScript中的对象是可变的键控集合(keyed collecti ...

  9. 《JavaScript语言精粹》学习笔记

    一.in的用法 for...in 枚举一个对象的所有可枚举属性 检测DOM/BOM属性 if ("onclick" in elem) { // 元素支持onclick } if ( ...

随机推荐

  1. HDU 5012 Dice DFS

    简单DFS //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h ...

  2. 引用 mkimage使用详解

    引用 鱼 的 mkimage使用详解  uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来 ...

  3. 为什么要选择cdn加速

    CDN的通俗理解就是网站加速,CPU均衡负载,可以解决跨运营商,跨地区,服务器负载能力过低,带宽过少等带来的网站打开速度慢等问题. 比如: 1.一个企业的网站服务器在北京,运营商是电信,在广东的联通用 ...

  4. java 异常 之 实战篇(trows 和 try catch Dead Code)

    一:throws 和 trycatch 差别 (1)比如.publicFileWriter(String fileName) throws IOException{} 我在mian中创建一个FileW ...

  5. LTP介绍

    1.LTP介绍    LTP--linut test project ,ltp套件是由Linux Test Project所开发的一套系统測试套件.它基于系统资源的利用率统计开发了一个測试的组合,为系 ...

  6. Winform ErrorProvider控件使用

    要实现的功能:判断第一个文本框中输入的是不是字符 “a”. 最终效果: *当输入的不是a,控件旁会显示错误图标.当输入的是a,则错误图标会消失. 首先添加ErrorProvider控件. 代码: pr ...

  7. 1688: [Usaco2005 Open]Disease Manangement 疾病管理( 枚举 )

    我一开始写了个状压dp..然后没有滚动就MLE了... 其实这道题直接暴力就行了... 2^15枚举每个状态, 然后检查每头牛是否能被选中, 这样是O( 2^15*1000 ), 也是和dp一样的时间 ...

  8. java--进步学习IO

    import java.io.*; public class Demo1 { public static void main(String []args) throws Exception{ File ...

  9. (step8.2.6)hdu 1848(Fibonacci again and again——组合博弈)

    题目大意:输入3个整数m,n,p,分别表示3堆石头中的石头个数 解题思路: 1)斐波那契数列的第16个数fib[16] == 1597 2)(sg[m]^sg[n]^sg[p])   .一定要加括号, ...

  10. RAID级别与规范

    1.RAID 0 RAID 0是最早出现的RAID模式,即Data Stripping数据分条技术.RAID 0是组建磁盘阵列中最简单的一种形式,只需要2块以上的硬盘即可,成本低,可以提高整个磁盘的性 ...