惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
S
Secure Thoughts
月光博客
月光博客
美团技术团队
雷峰网
雷峰网
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Forbes - Security
Forbes - Security
W
WeLiveSecurity
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
G
GRAHAM CLULEY
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
AI
AI
Last Week in AI
Last Week in AI
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
云风的 BLOG
云风的 BLOG
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Recent Announcements
Recent Announcements
Webroot Blog
Webroot Blog
T
Tor Project blog
Cisco Talos Blog
Cisco Talos Blog
N
News and Events Feed by Topic
罗磊的独立博客
The Register - Security
The Register - Security
Blog — PlanetScale
Blog — PlanetScale
T
Threat Research - Cisco Blogs
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
T
The Exploit Database - CXSecurity.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
B
Blog
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Engineering at Meta
Engineering at Meta
Latest news
Latest news
IT之家
IT之家
D
DataBreaches.Net
博客园 - 司徒正美
N
Netflix TechBlog - Medium
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - 川川哥哥

学习javascript-我的经验和建议(乱译) 一道有趣的javascript小题 javascript高性能编程笔记(个人自用) css3基础知识提纲 html5基础知识提纲 javascript和jquery窗口定位方法对应表 利用C#编写一个简单的抓网页应用程序 对C#开发两个基本原则的深入讨论(转) ASP编程中15个非常有用的例子 - 川川哥哥 - 博客园 oracle9i使用OMS备份数据 如何清除掉归档日志文件? 雅虎公司C#笔试题[转] .NET 访问 Oracle 数据库相关 [转] 从ASP.NET1.1到2.0迁徙所遇到的 IIS无法显示ASP 最终幻想Ⅸ 最终幻想X小说 经典音乐country roads歌词 06年及以前韩国星际职业联赛及选手资料
javascript语言精粹----笔记
川川哥哥 · 2012-11-26 · via 博客园 - 川川哥哥

1.6种值会为假(==false),分别是false,null,undefined,' ',0,NaN

2.typeof有6种值,分别是'number','string','boolean','undefined','function','object';其中typeof(null),结果是'object'

3.number类型总是64位浮点数,两个整数相除也可能出现非整数结果

4.如果第一个运算数的值为假,那么运算符&&产生它的第一个运算数的值.否则,它产生第二个运算数的值.如,可利用&&运算符避免检索undefined引起的异常

flight.equipment                                             //undefined

flight.equipment.model                                   //throw"TypeError"

flight.equipment && flight.equipment.model     //undefined

5.如果第一个运算数的值为真,那么运算符||产生它的第一个运算数的值.否则,它产生第二个运算数的值.如,可利用||运算符来填充默认值

          var status = flight.status || "unkonwn"

6.对象通过引用来传递,永远不会被拷贝

7.当我们对某个对象的属性做出改变时,不会触及到该对象的原型.原型链只有在检索值得时候,才会自下至上,直到object.prototype中去寻找,找到就用,然后停止寻找,都没有就返回undefined,这个过程称为委托.hasOwnProperty方法可以检测对象拥有的独特属性.

8.通过for in语句迭代出的对象属性包含其原型链上的属性,且无序;而通过for语句根据对象的length循环出的属性,只包含独有属性,且顺序

9.delete可以删除对象的属性,不会触及对象原型上的属性

10.函数也是对象,对象字面量产生的对象拥有到Object.prototype的隐藏链接,函数对象拥有到Function.prototype(该原型对象本身链接到Object.prototype)的隐藏链接.每个函数对象在创建时也随带一个prototype属性,它的值是一个拥有constructor属性且值即为该函数的对象

11.每个函数在创建时附有两个附加的隐藏属性:函数的上下文(可调用)和实现函数行为的代码;调用一个函数将暂停当前执行,传递控制权和参数给新函数.除了声明时定义的形参,每个函数接收两个附加的参数:this和arguments,arguments.callee代表函数自身,通常用于递归

12.参数this的值取决于调用的模式,javascript中一共有四种调用模式:

方法调用模式:当一个函数被保存为对象的一个属性时,我们称它为一个方法,一个方法被调用时,this绑定到该对象(只要函数被调用的时候用一个.点或者[subscript]下标方式调用,那么它被当做一个方法来调用)

函数调用模式:当一个函数并非一个对象的属性时,那么它被当做一个函数来调用,this被绑定到全局对象;解决内部函数的this被指向全局的设计缺陷时,可以在外部var that=this;如在浏览器中,this = window;在node中,this = globe

    

构造器调用模式:如果在一个函数前面带上new来调用,那么将创建一个隐藏链接到该函数的prototype成员的新对象,同时this将会被绑定到那个新对象上.

apply调用模式:this绑定到第一个参数,即传入对象

13.函数的实参(arguments)和型参(parameters)的个数不匹配时不会报错;如果实参多了,超出的将被忽略.如果实参过少,缺少的会被传入undefined.

14.arguments并不是一个真正的数组,它只是一个类似数组的对象,除了length属性,它缺少其它数组方法.

14.5 一个函数总会返回一个值,没有指定返回值,则返回undefined.如果函数以new方式调用,且返回值不是一个对象,则返回this(该新对象)

15.javascript缺少块级作用域,所以,最好的做法是在函数体的顶部声明函数中可能用到的变量

16.利用闭包来返回外部函数变量的方式,可以避免一个函数被加上new来使用

     闭包:var quo = function (status){

          return {

               get_status : function () {

                      return status ;

                    }

               };

              };

        var myQuo = quo ("amazed");

   构造函数:

        var Quo = function (status){

                this.status =status;

        };

        var myQuo = new Quo("amazed");

17. 一个闭包的坑

    var add_the_handles = function (nodes ) {

     var i;

    for(i = 0;i < nodes.length ; i+= 1) {

          nodes[i].onclick = function (e){

            alert(i);

          }

     }

};

add_the_handles 函数目的是给每个时间处理器一个唯一值(i).它未能达到目的是因为事件处理器函数绑定了变量i,而不是函数在构造时的变量i的值.

改正为以下写法可达到目的:

    var add_the_handles = function (nodes ) {

     var i;

    for(i = 0;i < nodes.length ; i+= 1) {

          nodes[i].onclick = function (tempI){

            return function(e){

            alert(tempI);

          };

        }(i);

     }

};

18.回调

    模拟异步请求,避免客户端被阻塞

   request = prepare_the_request();

  send_request_asynchronously(request,function(response){

        display(response);

};

19.模块(module)通过函数和闭包来创建,只暴露可用的public方法,其它似有方法全部隐藏,如果你不需要传参数或者没有一些特殊苛刻的要求的话,我们可以在最后一个}后面加上一个括号,来达到自执行的目的,这样该实例在内存中只会存在一份copy.可通过模块模式来实现单例模式

var theModule = (function(){

       var i = 10;

       return {

          result :function(x) {

                 return x*i;

          }

      };

}());

调用:theModule.result(5);

20.通用递归记忆函数,加入一个记忆参数,可以减少递归函数的调用次数,显著提高效率

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

});

console.log(fibonacci(10));

21.当一个函数对象被创建时,Function构造器产生的函数对象会运行类似代码: this.prototype = {constructor : this};所有的构造器函数都约定命名成为字母大写的形式,但更好的备选方案是不适用new

22.构造器函数要接受一大串参数的写法:

   不建议写法: var myObject = maker(f,l,m,c,s);

      建议写法: var myObject = maker({

                first : f,

                last: l,

                state:s,

                city:c

           });

好处是多个参数可以任意排序,如果有默认值,可以忽略到一些参数,且代码更易读

23.在一个纯粹的原型模式中,我们会摒弃类,转而专注于对象,一个新对象可以继承一个就对象的属性

24.在伪类模式与模块模式中,尽量选择后者,函数化构造器伪代码模板

  var constructor = function (spec ,my) {

     var that,其他的私有实例变量;

     my = my || {};

    把共享的变量和函数添加到my中

    that = 一个新对象

   添加给that的特权方法

    return that;

}

25.javascript的数组是一种拥有一些类数组特性的对象.它把数组的下标转变成字符串,用其作为属性,比普通属性多了一个可以用整数作为属性名的特性.且继承自Array.prototype,多了一个length属性;javascript同一个数组的元素可以是混合类型,且没有上界.

26.  var numbers = ['zero','one','two'];

    numbers[numbers.length] = 'three';  等价于

   numbers.push('three');

27.是否数组检测

 var is_array = function (value) {

    return value &&

   typeof value === 'object' &&

   typeof value.length === 'number' &&

  typeof value.splice === 'function' &&

 !(value.propertyIsEnumerable('length'));

};

28.javascript中的糟粕

全局变量        :越少越好

作用域           :无块级作用域,在每个函数开头部分声明所有变量

自动插入分号  :因此大括号风格需使用埃及括号

Unicode        :javascript字符是16位的,只能覆盖65535个字符

parseInt        :增加第二个参数,明确进制,parseInt("08",10)

浮点数           :二进制浮点数不能正确的处理十进制小数,0.1+0.2不等于0.3,不过整数部分是精确的

NaN              : typeof NaN === 'number'  //true;  NaN === NaN //false;

对象              :因为原型链的存在,javascript对象永远不会有真的空对象

29.javascript中的鸡肋

运算符 ==和!= :会试图强制转化判断值的类型,规则复杂

with语句          :可能出现歧义,并影响处理器速度

eval                :降低安全性,增加阅读复杂性

continue          :重构移出continue后,性能得到改善

++ --              :使代码变得更隐晦

位运算符           :javascript没有整数类型,位操作符将它们的运算数先转换成整数,接着执行运算,然后再转化回去,非常慢

function           :不在if语句中使用function,尽量用var func = function... 的形式声明

new                 :更好的应对策略是根本不去使用new

void                 :将返回undefined,没有什么用,而且让人困惑

总结: 这本书只有100多页,定价高达49,开始第一感觉是比较贵;看完后领略到了物有所值,浓缩的都是精华,几乎全部是干货,连附录都是干货.在看过一门javascript的入门书后,再看此书,非常有利于知识的沉淀.