资讯专栏INFORMATION COLUMN

javascript语言精粹

mist14 / 568人阅读

摘要:函数调用一个函数会暂停当前函数的执行,控制权转交给新的函数。语句可以使函数提前返回,中断函数的运行。如果没有指定返回值,则返回。任何语句都会返回值,在浏览器面板执行语句后的值就是返回值。在情况下不能正常工作。

对象

对象属性的名字可以是空字符串,属性值可以是undefined(原文为属性值可以是除undefined以外的任何值,但是测试可以为undefined)。

尝试从undefined的属性中取值会导致TypeError,可以通过&&运算符避免。(obj.name && obj.name.oldName)

函数

调用一个函数会暂停当前函数的执行,控制权转交给新的函数。每个函数都接受两个附加的参数:thisargumentsthis有四种调用情况不再赘述。

当一个函数运行时,它从第一个语句开始执行,并在遇到关闭函数体的}时结束。return语句可以使函数提前返回,中断函数的运行。

throw语句也能中断函数的执行,并且抛出一个错误对象。

函数总会返回一个值。如果没有指定返回值,则返回undefined。(任何语句都会返回值,在浏览器console面板执行语句后的值就是返回值)。

柯里化延迟调用,把函数看做一个值,在函数之前传递。

递归优化: 记忆。利用闭包建立一个储存区,避免重复运算。如

  var fibonacci = function (n){
    return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
  }

  // 自己的代码
  var fibonacci = (function (){
    var memo = {};
    return function (n){
      if (n < 2) {
        return n;
      }
      if (!memo[n]) {
        memo[n] = fibonacci(n-1)+fibonacci(n-2);
      }
      return memo[n];
    }
    })()
    
   // 书上原版
   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;
   }();

然后自己测试了一下性能,在大量运算的时候确实很厉害。一开始传了个100进去,然后浏览器就卡死了。。。
此外书中还提供了一个包装函数如下:

  var memoizer = function(memo, formula) {
    var recur = function(n) {
      var result = memo[n];
      if (typeof result !== "number") {
        result = formula (recur, n);
      }
      return result;
    }
    return recur;
  }

  例如调用一个阶乘函数: var factorial = memoizer([1, 1], function(recur, n) {
    return n * recur (n - 1);
    })

区别数组和对象的好方法。Object.prototype.toString.apply(someObj) 返回一个"[object Array]"或者"[object Object]".用constructor不确定性太多。instanceof在iframe情况下不能正常工作。Array.isArray()也是极好的,只是IE8下不兼容。

方法

array.slice方法对array中的一段做浅复制,[obj,obj]中的对象改变会反应在两个数组上。

array.shift方法要比array.pop慢上30%左右。

毒瘤

自动插入分号,如:

return
  {
    some: 1
  }
 // 直接执行了 return;

typeof null返回"object"

其它的一些缺点因为已经习惯了就没放上来了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81975.html

相关文章

  • Javascript的内置函数(ES5)-读Javascript语言精粹

    摘要:的内置函数整理了一些语言精粹的方法一章的整理出的的内置方法之后还会整理标准入门的新添加的方法整理这些作用一方面是更好的理解记忆另一方面是对于类数组可以使用原型链的调用即可中的一些函数输出的为的结果因此的作用是连接数组当然可以是数字也会加入到 Javascript的内置函数(ES5) 整理了一些Javascript语言精粹的方法一章的整理出的ES5的内置方法; 之后还会整理ES6标准入门...

    gekylin 评论0 收藏0
  • JavaScript语言精粹》 代码摘录

    摘要:最近在读这本评价颇高的语言精粹,其作者是的创造者,在业界颇有名气。 最近在读这本评价颇高的《JavaScript语言精粹》,其作者Douglas Crockford 是JSON的创造者,在业界颇有名气。以下是阅读过程中认为比较有用的摘录的代码,希望能对各位有所启发 自定义的method方法 Function.prototype.method = function(name,func...

    haitiancoder 评论0 收藏0
  • javascript语言精粹》学习笔记 - 数组方法实现

    摘要:在中数组是经常被使用到的,我们除了要学习数组的方法,还需要了解诶一下某一些方法是如何来实现的。然而我看了语言精粹中方法的一章,想记录下书上的代码,以便加深印象。方法移除数组中的第一个元素并且放回该元素。 在js中数组是经常被使用到的,我们除了要学习数组的方法,还需要了解诶一下某一些方法是如何来实现的。然而我看了《javascript语言精粹》中方法的一章,想记录下书上的代码,以便加深印...

    felix0913 评论0 收藏0
  • JavaScript 语言精粹》读书笔记 - 函数

    摘要:语言精粹读书笔记第四章函数函数字面量函数字面量包含个部分第一部分,保留字第二部分,函数名,它可以被忽略。这个超级延迟绑定使得函数对高度复用。构造器调用模式一个函数,如果创建的目的就是希望结合的前缀来调用,那它就被称为构造器构造。 《JavaScript 语言精粹》 读书笔记 第四章 函数 Functions 函数字面量 函数字面量包含4个部分: 第一部分, 保留字 function...

    wdzgege 评论0 收藏0
  • 摘自<JavaScript语言精粹>经典案例----------持续更新

    摘要:定义一个函数它设置一个节点为黄色然后把它渐变成白色不想当厨子的画家不是一个好老师郭德纲根据书上的例子有感而发自己用递归也写了一个类似的使用记忆功能技巧编写斐波那契数列得到的总数原例一普通递归的斐波那契数列共调用了函数多次升级 1.定义一个函数,它设置一个DOM节点为黄色,然后把它渐变成白色 var fade = function (node) { var level = 1; ...

    张迁 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<