javascript语言精粹 读书笔记

这是我目前度过最好的js方面的书,小而精,没有一句废话全是精华。想要全面理解javascript,这本书必读。

P6 避免使用 /* */注释 建议使用//

P17 对象字面量是一种方便指定新对象的表示方法。属性名可以是标识符或者字符串。这些名字被当做字面量名而不是变量名来对待,所以对象的属性名在编译时才能知道。属性的值就是表达式。

P20 简单类型: 数字,字符串,布尔值,null值和undefined值 对象类型:数组,函数,正则表达式,对象。 对象是可变的键控集合,对象是属性的容器,每个属性都拥有名字和值。 属性的名字可以是包括空字符串在内的任意字符串,属性值可以是除undefined值之外的任何值。

P21 || 运算符可以用来填充默认值 var a=objecta.somenotexist || "unknowa";

P22 对象通过引用来传递 var a=b=c={}; a,b,c都引用同一个空对象

每个对象都连接到一个原型对象,并且它可以从中继承属性。 所有通过对象字面量创建的对象都连接到Object.prototype这个javascript中标准的对象。 当你创建一个新对象时,你可以选择某个对象作为它的原型。

我们这里给Object增加一个beget方法,这个方法创建一个使用原对象作为其原型的新对象。

if(typeof Object.beget!='function'){
            Object.beget=function(o){
                var F=function(){};
                F.prototype=o;
                return new F();

            };
        }

当我们对某个对象做出改变时,不会触及该对象的原型。相反我们添加一个新的属性到原型中,该属性会立即对所有基于该原型创建的对象可见。

P23 委托 如果我们尝试去获取对象的某个属性,且该对象没有此属性名,那么javascript会尝试着从原型对象中获取属性值,如果那个原型对象也没有改属性,那么再从它的原型中寻找,依次类推,直到过程最后到达终点Object.prototype. 如果想要的属性完全不存在于原型链中,那么结果就是undefined值。这个过程称为委托。

P24 for in语句可以用来遍历一个对象中的所有属性名,属性名出线的顺序是不确定的。如果需要按照一定的顺序显示属性可以用for 数组遍历。 delete 运算符可以删除对象属性。但是不会触及原型链中的任何对象。删除对象属性可能让来自原型链中的属性浮现出来。

P25 减少全局变量污染

方法1 在你的应用中只创建唯一一个全局变量:var MYAPP={};

方法2 闭包

P26 所谓编程就是将一组需求分解成一组函数与数组结构的技能。 对象字面量产生的对象连接到Object.prototype.函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype).每个函数在创建时附有两个附加隐藏属性:函数的上下文和实现函数行为的代码。 每个函数对象在创建时也随带有一个prototype属性。它的值是一个拥有constructor属性且值为该函数的对象。

var functiona=function(){var b;};
        var a=functiona.prototype;

        alert( a.constructor);

P27 函数可以用它的名字来递归地调用自己。

通过函数的字面量创建的函数对象包含一个连接到外部上下文的连接。这被称为闭包。

调用函数时,每个函数接收到两个附加的参数:this和arguments.this的值取决于调用模式。

在JavaScript中一共有四中调用模式:方法调用模式,函数调用模式,构造器调用模式和apply调用模式。

P28 实际参数arguments 形式参数parameters 当一个函数被保存为对象的一个属性时,我们称它为一个方法。 当一个方法被调用时,this被绑定到该对象。

超级迟绑定 very late binding

方法调用模式: 通过this可取得它们所属对象上下文的方法称为公共方法。

P29 JavaScript是一门基于原型继承的语言。 构造器调用模式: 如果在一个函数前面带上new来调用,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将会被绑定到哪个新对象上。 结合new前缀调用的函数被称为构造函数。

P30 JavaScript是一门函数式的面向对象编程语言,所以函数可以拥有方法。 apply方法接受两个参数。第一个是将被绑定给this的值,第二个就是一个参数数组。 apply方法的调用形式可以调用函数也可以调用公共方法。 P31 当函数被调用时,会得到一个免费奉送的参数,arguments数组。 arguments并不是一个真正的数组。它只是一个类似数组(array-like)的对象。

一个函数总是会返回一个值。如果没有指定返回值,则返回undefined。

如果函数以在前面加上new前缀的方式来调用,且返回值不是一个对象,则返回this(该新对象)。

P32

通过给Object.prototype添加方法或者属性使得该方法或者属性对所有对象可用。

通过给Function.prototype增加方法使得该方法对所有函数可用。

Function.prototype.method1=function(name,func){
            this.prototype[name]=func;
            return this;
        };
   Number.method1('interger1',function(){
       return Math[this < 0 ? 'ceil':'floor'](this);
   });
   document.writeln((-10/3).interger1());
   document.writeln((10/3).interger1());

P33

基本类型的原型是公共的结构 P36 作用域

作用域控制着变量与参数的可见性及生命周期,并提供了自动内存管理。 P38 闭包 函数可以访问它被创建时所处的上下文环境,这被称为闭包。

var quo=function(status){
      return {
         get_status:function(){
             return status;
         }
      };
  };
 var myQuo=quo("amazed");
 document.writeln(myQuo.get_status());
//myQuo的函数get_status()被创建后还可以访问参数status ,就称为闭包。

P40 模块

我们可以使用函数和闭包来构造模块。模块是一个提供接口却隐藏状态与实现的函数或对象。

P41

模块模式的一般形式是:一个定义了私有变量和函数的函数;利用闭包创建可以访问私有变量和函数的特权函数;最后返回这个特权函数,或者把他们保存到一个可以访问的地方。

Function.prototype.method1=function(name,func){
        if(!this.prototype[name])
        {
            this.prototype[name]=func;
            return this;
        }

    };
    String.method1('deentityify',function(){
        var entity={
            quot:'"',
            lt:'<',
            gt:'>'
        };
        return function(){
            return this.replace(/&([^&;]+);/g,function(a,b){
                var r=entity[b];
                return typeof r==='string'?r:a;
            });

        };
    }());
    document.writeln('&lt;&quot;&gt;'.deentityify());

模块模式通常结合单例模式(Singleton Pattern)使用。JavaScript的单例就是用对象字面量表示法创建的对象,对象的属性值可以是数值或函数,并且属性值在该对象的生命周期中不会发生变化。

P43 级联

没有返回值的方法会返回undefined, 如果我们让方法返回this而不是undefined,就可以启用级联。

在一个级联中,我们可以在单独一条的语句中依次调用同一个对象的很多方法。

套用 套用允许我们将函数与传递给它的参数相结合去产生出一个新的函数。

P44 记忆 函数可以用对象记住先前操作的结果,从而能避免无谓的运算。这种优化被称为记忆(memoization).

var memoizer=function(memo,fundamental){
     var shell=function(n){
         var result=memo[n];
         if(typeof result !=='number'){
             result=fundamental(shell,n);
             memo[n]=result;
         }
         return result;
     };
     return shell;
 };
var fibonacci=memoizer([0,1],function(shell,n){
    return shell(n-1)+shell(n-2);
});
 for(var i=0;i<=10;i+=1){
     document.writeln("//"+i+":"+fibonacci(i));
 }
//以上代码我还没有理解清楚,需要日后再琢磨

第五章 继承

继承这章挺难理解的,还需要仔细再琢磨琢磨

P46 在基于类的语言中,对象是类的实例,并且类可以从另一个类继承。JavasCript是一门基于原型的语言,这意味着对象直接从其他对象继承。

P50

基于原型的继承相比基于类的继承在概念上更为简单:一个新对象可以继承一个旧对象的属性。

第六章 数组

P59 JavaScript允许数组包含任意混合类型的值。 length属性的值是这个数组的最大整数属性名加上1。它不等于数组里的属性的个数。 第七章 正则表达式 P65 正则表达式是一门简单语言的语法规范。可处理正则表达式的方式有regexp.exec,regexp.test,string.match,string.replace,string.search,string.split

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏京程一灯

BootstrapVue 入门[每日前端夜话0x62]

Vue.js 是一个流行的 JavaScript 库,用于在短时间内开发原型。这包括用户界面、前端应用、静态网页和本机移动应用。它以易用的语法和简单的数据绑定功...

29340
来自专栏程序员的知识天地

超详细的Python实现微博模拟登陆,小白都能懂

最近由于需要一直在研究微博的爬虫,第一步便是模拟登陆,从开始摸索到走通模拟登陆这条路其实还是挺艰难的,需要一定的经验,为了让朋友们以后少走点弯路,这里我把我的分...

10120
来自专栏角落的白板报

Asp.Net Core 中的环境变量-14

**开发环境:**我们的软件开发人员通常将此环境用于我们的日常开发工作。我们希望在开发环境中加载非缩小的 JavaScript 和 CSS 文件,以便于调试。类...

21530
来自专栏葫芦

cssjshtml ckedior支持markdown一坑

安装完报错: Uncaught DOMException: Failed to execute 'add' on 'DOMTokenList': The tok...

18130
来自专栏养码场

编程语言简史:有人不喜欢花括号,于是他发明了 Python

编程语言有上千种,但是流行的不过10来种,那些我们经常使用的编程语言都是谁在什么时候创造出来的呢?Casper Beyer为我们进行了整理。(本文节选)

14720
来自专栏波波烤鸭

EasyUI之表单验证

  当我们开发一个管理类项目的时候,EasyUI是我常用的一个jquery框架,而表单验证显然是我们必须要实现的功能,而使用基于EasyUI的验证功能就比较简便...

27810
来自专栏phodal

为了不被前端淘汰,我每天都学习3小时

“对于程序员来说,如果哪一天开始他停止了学习,那么他的职业生涯便开始宣告消亡。”这不是什么危言耸听的怪语,而是一位大牛几年前告诉我的,他的信条。

19140
来自专栏GitHubDaily

这本 JavaScript 教程的作者,拥有 20 多年 Web 开发经验!

这主要得益于近几年 Native React、Weex 等跨平台移动端开发框架,以及 Electron、NW.js 等跨平台桌面端开发框架的兴起,间接推动了 J...

15740
来自专栏Flutter入门到实战

Flutter基础篇(8)-- Flutter for Web详细介绍

Flutter for Web官方的Github库地址:https://github.com/flutter/flutter_web ,此存储库包含面向Web ...

93010
来自专栏波波烤鸭

EasyUI之生成动态异步菜单栏

  在项目开发中,对于整体的页面布局中对于菜单导航栏我们一般设计为根据不同的用户权限展示不同的菜单选项,同时菜单显示也会做异步加载处理。本文就来介绍下基于Eas...

41140

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励