【问题标题】:Language with similar object use to Javascript/JSON对象使用与 Javascript/JSON 类似的语言
【发布时间】:2009-01-12 03:25:39
【问题描述】:

我最近一直在做一个项目,专注于一个几乎完全由客户驱动的网站。显然 Javascript 被大量使用,而且我一直在使用 jQuery,结果证明使用它绝对是一种乐趣。

让我感到惊讶的一件事是我非常喜欢 JSON 对象语法,并且它在 javascript 中使用(由 jQuery 突出显示,它在任何地方都使用它)。对于那些不熟悉它的人,请考虑以下简短示例:

function add(params) {
    params.result(params.a, params.b);
}

add({
    a: 1,
    b: 2,
    result: function(value) {
        alert(value);
    }
});

当然,这个例子非常做作,但它说明了基本用法。 JSON 动态描述一个对象,在这种情况下作为参数传递给函数,甚至在其中定义一个函数用作回调。我个人认为这种方法非常易于使用、理解和生成 API(尽管我知道有些人会不同意我的观点。)

所以我的问题是,这种语法是 javascript 独有的吗?我知道许多语言都有 JSON 解析器(并且已经使用了几个),但它们不允许这种内联声明。诚然,您可以使用此语法执行的大部分操作都可以通过各种语言中的命名参数和 lambda 表达式或函数指针(我想起 Python)来复制,但我仍然觉得这不那么优雅。

只是好奇,感谢您的任何回复!

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    典型的例子是 Lisp:在 Lisp 中,语言甚至不是根据文本定义的,而是根据数据结构定义的。代码和数据实际上没有区别:代码只是一个列表,其第一个元素被解释为操作,其余元素被解释为操作数。

    编写程序就是编写列表。

    【讨论】:

      【解决方案2】:

      Lua 使用与 javascript 对象几乎相同的“表”。

      【讨论】:

        【解决方案3】:

        JSON 的语法与 Perl 对复杂结构的定义非常相似。你的例子是:

        #!/usr/bin/perl
        
        use strict;
        use warnings;
        use signatures;
        sub add($hash) {
            $hash->{result}($hash->{a}, $hash->{b});
        }
        
        add({
            a=> 1,
            b=> 2,
            result=> sub ($val) {
                print "$val\n";
            }
        });
        

        【讨论】:

          【解决方案4】:

          C# 3.0 有一些相似之处,您既可以使用默认构造函数实例化对象,也可以在同一语句中分配属性。它实际上只是一点语法糖,但它确实比声明多个构造函数来处理参数设置的各种组合要容易得多。它看起来像:

           var myObject = new MyClass { Property1 = "value", NumericProperty = 1 };
          

          C# 3.0 中也有匿名类型,它们的语法类似;这些经常与 LINQ 一起使用

           var query = dataContext.Entity
                                  .Where( e => e.Kind = 1 )
                                  .Select( e => new { e.Name, e.Kind } );
          

          这会产生一个新匿名类型的 IEnumerable,它具有属性“Name”和“Kind”,而这些属性又具有与相应实体属性相同的类型。

          【讨论】:

            【解决方案5】:

            Rubists 会这样做:

            定义添加(参数){ params.result(params.a, params.b) } add({:a=> 1, :b=> 2}) 做 |值| 警报(值) 结尾

            可选块的传递在 ruby​​ 中是一种奇怪的习语。或者更忠实于你的例子。

            定义添加(参数){ params.result(params.a, params.b) } 添加({ :a=> 1, :b=> 2, :result=> proc 做 |value| 警报(值) 结尾 })

            但内联函数的概念源于 lambda 演算和 LISP。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-08-03
              • 2012-01-07
              • 1970-01-01
              • 1970-01-01
              • 2021-12-06
              • 2012-02-27
              相关资源
              最近更新 更多