什么是Javascript缺失?

时间:2009-07-12 14:52:52

标签: javascript programming-languages

Javascript是一种令人难以置信的语言,像jQuery这样的库使得它几乎太容易使用了。

Javascript的原始设计者应该包含哪些语言,或者我们应该向他们施加什么压力才能添加到未来的版本中?

我想看到的事情: -

  • 该语言的某种编译版本,因此我们程序员可以更早地捕获更多错误,并为浏览器提供更快的解决方案。
  • 可选的严格类型(例如,能够将var声明为float并保持这种方式)。

我不是Javascript的专家,所以也许这些已经存在,但还有什么呢?您是否希望看到其他编程语言的杀手级功能?

7 个答案:

答案 0 :(得分:5)

阅读道格拉斯克罗克福德Javascript: The Good Parts作者的JSLint。这真的令人印象深刻,也涵盖了不好的部分。

答案 1 :(得分:5)

我一直渴望和努力的一件事是支持哈希。具体来说,让我跟踪有关对象的元数据,而无需在该对象上添加expando属性

Java提供 Object.getHashCode() ,默认情况下,它使用底层内存地址; Python提供 id(obj) 来获取内存地址, hash(obj) 可自定义; Javascript也没有提供任何内容。

例如,我正在编写一个Javascript库,它试图不引人注意地优雅地增强你给我的一些对象(例如你的< li>元素,甚至是与DOM无关的东西)。假设我需要处理每个对象一次。因此,在我处理完每个对象之后,我需要一种方法来“标记它”。

理想情况下,我可以创建自己的哈希表或设置(以任何方式,实现为字典)来跟踪:

var processed = {};

function process(obj) {
    var key = obj.getHashCode();

    if (processed[key]) {
        return;    // already seen
    }

    // process the object...

    processed[key] = true;
}

但由于那不是一个选项,我不得不求助于在每个对象上添加一个属性:

var SEEN_PROP = "__seen__";

function process(obj) {
    if (obj[SEEN_PROP]) {    // or simply obj.__seen__
        return;    // already seen
    }

    // process the object...

    obj[SEEN_PROP] = true;   // or obj.__seen__ = true
}

这些对象不是我的,所以这使我的脚本突兀。该技术实际上是一个黑客,以解决我无法获得任何任意对象的可靠哈希键的事实。

另一种解决方法是为所有内容创建包装器对象,但通常需要一种从原始对象到包装器对象的方法,这需要原始对象上的expando属性。另外,如果原始对象是DOM元素,那么会创建一个循环引用,导致IE中的内存泄漏,因此这不是一种安全的跨浏览器技术。

对于Javascript库的开发人员来说,这是一个反复出现的问题。

答案 2 :(得分:1)

使用数组/对象作为没有字符串强制的键的能力可能会很好。

答案 3 :(得分:1)

  

Javascript的原始设计者应该包含哪些语言,或者我们应该向他们施加什么压力才能添加到未来的版本中?

他们应该聚在一起并决定在一起实施什么,而不是通过稍微不同的语言实现(命名无名称)相互竞争,以防止随之而来的巨大头痛过去15年中每个开发人员。

答案 4 :(得分:1)

Javascript缺少一个名称,使其与语言区分开来。

答案 5 :(得分:1)

有一些小事可以做得更好。

选择+进行字符串连接是一个错误。 &本来会更好。

for( x in list )遍历索引会很令人沮丧,因为它使得使用文字数组变得困难。较新的版本有解决方案。

适当的范围界定会很好。 v1.7正在添加它,但看起来很笨重。

在对象中执行'private'和'protected'变量的方法有点模糊,难以记住,因为它利用了闭包以及它们如何影响范围。隐藏其机制的一些语法糖将是非常棒的。

老实说,我经常遇到的许多问题实际上都是DOM怪癖,而不是JavaScript本身。当然,另一个大问题是最新版本的JavaScript有一些有趣且有用的东西,比如生成器。不幸的是,大多数浏览器都停留在1.5。显然只有FireFox正在向前发展。

答案 6 :(得分:0)

文件IO丢失了....虽然有些人会说它并不真的需要它......