【问题标题】:How do I add syntactic sugar in my Javascript library?如何在我的 Javascript 库中添加语法糖?
【发布时间】:2010-10-19 09:05:57
【问题描述】:

现在库可以翻译这个操作

Select * from List where name = k% order by desc  

List.filter(function(x) { return x.first_char() == 'k' }).sort().reverse()); 

删除 () 的最佳技巧是什么,以便开发人员可以编写如下语句:

List.filter(fn(x) { return x.first_char == 'k' }).sort.reverse;

天真的方法:

maxfn = function() {this[0]..};  Array.prototype.max = maxfn();

但是使用这种方法我无法访问“this”。

我想为

添加一个语法糖
new Array("1","2","3")

类似于:)(需要的建议)

_("1","2" ,"3")

就像我们在方案 where list -> '

我试图克隆参数但失败了。

谢谢。

【问题讨论】:

    标签: javascript syntactic-sugar


    【解决方案1】:

    对于列表,您可以使用JSON 表示法:

    ["1", "2", "3"]
    

    【讨论】:

    • 会不会影响效率?
    • 其实我觉得理论上这样效率比较好
    • 不就是一个数组字面量吗?
    【解决方案2】:

    如果您控制列表,则可以使用 RoBorg 建议的 JSON 表示法...但是,没有跨浏览器的方式将属性视为方法。注意:spidermonkey (firefox) 支持使用 getter(获取属性的方法)。

    【讨论】:

      【解决方案3】:

      删除 () 的最佳方法是什么

      Property getters/setters 在 JavaScript 中。不幸的是,它是一个相对较新的 JavaScript 功能,无法在 IE6/7(以及各种其他较旧的浏览器)上运行,因此它还没有真正准备好进入黄金时段(尽管链接文章的介绍)。

      您可以通过创建一个 JavaScript 对象来执行此特定示例,该对象包含一个字符串并隐藏所有字符串的方法,然后在初始化时为字符串的第一个字符添加一个静态的“first_char”属性集。但这真的不值得。

      新数组("1","2","3")

      类似于:)(需要建议)

      _("1","2" ,"3")

      这很简单:

      function _(/* items */) {
          var a= new Array();
          for (var i= 0; i<arguments.length; i++)
              a[i]= arguments[i];
          return a;
      }
      

      不过,现在这样做是没有意义的,因为数组字面量语法:

      ['1', '2', '3']
      

      自 JavaScript 1.1-1.2 时代以来就已经可用,并且在当今的每个浏览器中都可用。 (它比 JSON 早很多很多年。)

      【讨论】:

      • 我的第一个方法是复制所有参数,然后我想到克隆参数。但是,是的,你们是对的,[] 更干净。
      【解决方案4】:

      我将尝试一一回答: 1)为什么要从函数调用中删除括号? 2)如果“天真”方法失败,可能是因为您正在调用 maxFn 并将结果分配给 Array.prototype.max。应该是这样的:

      maxfn = function() {this[0]..};  Array.prototype.max = maxfn;
      

      3) RoBorg 是正确的,只需使用字面量表示法来动态构造数组。


      编辑:
      这是在数组对象上实现 max 函数的一种方法。可选的 evaluator 参数是一个函数,它接受两个参数,即当前最大值和数组中的当前值。它应该返回“更大”的对象。对非基元有用。
      Array.prototype.max = function(evaluator) {
          var max, i = 1; len = this.length;
          if (len > 0) max = this[0];
          for (; i < len; i++) {
              if (evaluator) {
                  max = evaluator(max, this[i]);
              }
              else if(max < this[i]) {
                  max = this[i];
              }
          }
          return max;
      };
      
      var a = [1, 3, 4, 5, 6];
      alert(a.max());
      var b = ["Arnold", "Billy", "Caesar"];
      alert(b.max());
      var c = ["Arnold", new Date(), 99, true];
      alert(c.max());
      var d = [1, 3, 4, 5, 6];
      alert(d.max(function (max, val) { return max < val ? val : max }));
      

      【讨论】:

      • 第一个没用。如果我执行警报(array1.max),它会返回一个未定义的。我认为这是因为 maxfn 不知道“this”是什么。我可以使用 .apply 解决这个问题吗?
      • 请注意 maxfn 是一个函数。语句 array1.max 返回一个函数指针。但是,由于您未定义,因此 array1 可能没有名为 max 的属性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 2012-05-22
      • 2010-09-15
      • 1970-01-01
      • 2016-09-09
      • 2012-04-01
      • 2020-01-24
      相关资源
      最近更新 更多