在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?

请每个回答只回答一个特征。


当前回答

Perl充满了奇怪但整洁的特性。

If可以用在语句之前或之后,就像这样:

print "Hello World" if $a > 1;    
if ($a > 1) { print "Hello World"; }

foreach也是如此:

print "Hello $_!\n" foreach qw(world Dolly nurse);

其他回答

在Python中,至少对我来说,这是非常wft的!我第一次看的时候:

>>> "ja " * 5
'ja ja ja ja ja '

你可以将字符串相乘!WTF ? ?

PS:我认为这是因为x * n意味着:n乘以x,所以,5次“ja”是“ja”“ja”“ja”“ja”“ja”“ja”,因为你可以像这样连接字符串:

>>> "ja ""ja ""ja ""ja ""ja "
'ja ja ja ja ja '

两个代码有相同的结果(可能是相同的)

我最讨厌的特性是任何包含条件逻辑的配置文件语法。这类事情在Java世界(Ant、Maven等)中非常普遍。你知道你是谁!)

你最终只能用c**p语言编程,调试和编辑器支持有限。

如果在配置中需要逻辑,那么用真正的语言编码配置的“Pythonic”方法会好得多。

在JavaScript中,void不是关键字,不是类型声明,也不是变量名,也不是函数,也不是对象。Void是一个前缀操作符,类似于-、——、++和!你可以给任何表达式加上前缀,这个表达式的值将是undefined。

它经常被用在bookmarklet和内联事件处理程序中,比如下面这个比较常见的例子:

<a href="javascript:void(0)">do nothing</a>

在这个例子中使用它的方式使它看起来像一个函数调用,而实际上它只是一种获得原始未定义值的过于聪明的方法。大多数人并没有真正理解JavaScript中void的真正本质,这可能会导致许多讨厌的bug和奇怪的意想不到的事情发生。

不幸的是,我认为void操作符是在JavaScript中获得未定义值的唯一真正保证的方法,因为未定义,正如在另一个回答中指出的,是一个可以重新赋值的变量名,而{}。a可以被Object.prototype.a = 'foo'打乱

更新:我想到了另一种生成undefined的方法:

(function(){}())

嗯,有点啰嗦,返回“undefined”是它的目的就更不清楚了。

在JavaScript中,方法的结果取决于所放置的样式花括号。这是K&R风格,其中括号放在方法签名之后和return语句之后:

var foo = function() {
  return {
    key: 'value'
  };
}

foo() // returns an object here

现在,如果我将这段代码格式化为Allman风格,其中括号总是放在新行上,结果是不同的:

var foo = function()
{
  return
  {
    key: 'value'
  };
}

foo() // returns undefined here

如何来吗?在JavaScript中,如果您不自己做,语言会自动在每行末尾放置分号。所以在最后一个代码片段中真正发生的是这样的:

var foo = function()
{
  return; // here's actually a semicolon, automatically set by JavaScript!
  {
    key: 'value'
  };
}

因此,如果调用foo(),方法中的第一个语句将是一个返回语句,该语句将返回undefined,并且不会执行后面的其他语句。

在Python中:

>>> x=5
>>> 1<x<10
True
>>> 1<x<3
False

不是一个WTF,但是一个有用的特性。