我看到一些代码似乎使用了一个我无法识别的运算符,以两个感叹号的形式出现,如下所示:!!.有人可以告诉我这个运营商的作用吗?
我看到这个的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
Run Code Online (Sandbox Code Playgroud) 有问题的代码,语法突出显示在这里:通过Friendpaste
rot13.js:
<script>
String.prototype.rot13 = rot13 = function(s)
{
return (s = (s) ? s : this).split('').map(function(_)
{
if (!_.match(/[A-Za-z]/)) return _;
c = Math.floor(_.charCodeAt(0) / 97);
k = (_.toLowerCase().charCodeAt(0) - 96) % 26 + 13;
return String.fromCharCode(k + ((c == 0) ? 64 : 96));
}).join('');
};
</script>
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,使用一个单独的行来将一个方法附加到String对象的原型,我有一个我之前设置的map()方法(我确信这个代码完美无缺;它只是简单迭代数组中的每个元素并应用参数中指定的函数)遍历字符串中的每个字符并执行我认为正确的计算,将字符串转换为它的rot13'd对应项.我很遗憾地错了.任何人都可以找到我错的地方吗?
所以...在JavaScript中乱搞一个对我来说很新的想法,让Object的方法返回它们是方法的Object; 这导致了可链接性.我的问题是:这怎么有用?我把它扔在一起测试基本工作:
<script>
MathChain = function()
{
this.pass = function()
{
this.multiply = eval(arguments.join('*'));
this.add = eval(arguments.join('+'));
return this;
}
}
m = new MathChain().pass(5, 10, 20).multiply; // 1000
a = new MathChain().pass(5, 10, 20).add; // 35
</script>
Run Code Online (Sandbox Code Playgroud)
这显然不是一个恶意高效的实例,人们会使用这个概念,所以你能指出我做的事情吗(除了jQuery,请)?
在相当一段时间的情况下,我认为for循环只能以下列格式存在:
for (INITIALIZER; STOP CONDITION; INC(DEC)REMENTER)
{
CODE
}
Run Code Online (Sandbox Code Playgroud)
然而,绝对不是这样; 看看Fisher-Yates Shuffle的这个JavaScript实现:
shuffle = function(o)
{
for (var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
};
Run Code Online (Sandbox Code Playgroud)
这个小片段彻底打动了我的脑海; 在一个简单的for循环声明中,这个世界是如何进行的?我的意思是......它甚至没有打开支架!所有的魔力正在做那里的内部for声明.如果有人可以提供一个相对彻底的解释来说明世界上这个伏都教正在做它做什么,那将是绝对美妙的.非常感谢提前.
我有一个包含大量项目的div.我通过单击按钮动态选择这些项目,在我的情况下溢出是自动的.我想要的是当选择一个不可见的项目来滚动div以便可见时.我怎样才能做到这一点?
我已经为网络编程已经很长一段时间了,但是最近才发现了一些关于函数使用的新复杂性以及你可以用它们做的奇怪的事情(或者我认为它们都是如此).但是,它们在这一点上似乎只是语法上很漂亮的东西.我希望有人可以告诉我这些新发现的方面如何证明是有用的.
例如,我第一次运行它时,我认为它不会起作用:
<script>
function x(q)
{
q(x);
}
x(function(a)
{
alert(a);
}
);
</script>
Run Code Online (Sandbox Code Playgroud)
但它确实做到了!不知何故,创建一个命名函数,它接收一个不同的匿名函数作为它的唯一参数,然后运行传递给它的函数,并将其作为参数传递给它就可以了.这让我大吃一惊,我几乎可以肯定它有很大的实用性,但我还是不能完全放下它.
啊,还有另外一件事我很高兴发现:使用全局范围的变量来存储函数,可以在执行后使用JavaScript的eval()函数来修改该变量,从而动态地改变函数的内部工作.一个例子:
<script>
var f = function()
{
alert('old text');
}
eval('f = ' + f.toString().replace('old text', 'new text'));
f();
</script>
Run Code Online (Sandbox Code Playgroud)
果然,该代码警告"新文本"字符串; 当我看到这一点时,我的思绪再一次被吹嘘,但也立即对创造出令人难以置信的东西的潜力感兴趣.
所以...我对Stack Overflow的问题:如何以任何积极的方式使用这些看似抽象的编码原则?
我认为自己在PHP方面非常流利,并且对几乎所有重要的方面和用途以及它的失误都非常熟悉.考虑到这一点,我认为采用Perl的主要问题是语法.除了这个(一个小小的障碍,真的,因为我更倾向于因为Perl的可读性更高),你认为在接受这种语言之前我应该让自己意识到的一些关键差异是什么?
我已经开始创建一个相对较小的命令行RPG以展示我新发现的Python肌肉,但我已经遇到了一个难题.我正在使用getch()的这个实现:
def getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
tty.setraw(sys.stdin.fileno())
key = sys.stdin.read(3)
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
Run Code Online (Sandbox Code Playgroud)
我已经key设置读取3个字符来捕获箭头键.例如,读取为ESC[A; 使用这种方法,我可以key[2]用来确定是否按下了箭头键和哪一个.一切都很好,除了我还想捕获各种其他键; q对于任务日志,wasd对于移动(按各种顺序的箭头将是攻击的方法),以及许多其他.问题很明显; 如果getch()仅返回单个字符,箭头功能将完全丢失.
如果没有简单的解决方案,我正在考虑完全重新考虑箭头系统,但我几乎肯定必须有.不可否认,我对其中发生的事情知之甚少tty,但我在某处读到,如果你只读了1个字符,那么箭头按下的多余字符将保留在缓冲区中.我怎么去访问所说的缓冲区?或者,是否有一些聪明的方法stdin来指望可变长度的输入?
提前感谢您提供任何和所有帮助.
例如,只是为了踢,我正在考虑拥有一个PHP脚本,我的所有JavaScript文件都会通过; 现在,这与正常表达的可爱的小虫子相结合,带来了整个世界的可能性(无论好坏).目前,我只是在构造中使JavaScript成为Pythonic,如下所示:
一个简单的函数,它接受一个参数并显示数字,如果它是2和/或3的倍数:
<script>
function show_mults_23(k):
for (x = 0; x < k; x++):
if (x % 2 == 0):
document.body.innerHTML += x;
document.body.innerHTML += ' is a multiple of 2.<br/ >';
if (x % 3 == 0):
document.body.innerHTML += x;
document.body.innerHTML += ' is a multiple of 3.<br />';
</script>
Run Code Online (Sandbox Code Playgroud)
这是真的,是吧?; p
但是,说真的,我很好奇这个概念是否曾在开发环境中实现过.显然速度大幅下降,但除此之外,这样的想法有没有任何理由?
为了美学目的,我正在推出我自己的prompt()版本; 就视觉效果而言,它的表现相当不错,但我遇到了一个小问题:该函数的原生版本导致代码执行完全停止,直到处理完提示.
这是非常可爱的,这就是为什么下面的工作方式:
<script>
var c = prompt('Name?', '');
alert(c); // displays whatever the user entered
</script>
Run Code Online (Sandbox Code Playgroud)
然而,用我的方法,事情并不顺利.我正在使用对话框,输入框和"确定"按钮来收集用户的数据; 据我所知,数据收集工作完美; 也就是说,我确信在用户按下"确定"按钮后,我可以访问他们刚刚放入提示的数据.
但是,我不能找到一种方法让我的版本像本机版一样工作.那么,我的问题是:在你告诉它恢复之前,是否可以告诉JavaScript停止执行?
提前感谢您提供的任何和所有帮助.
几天前,我问了一个关于在外部脚本执行过程中动态修改函数代码的问题,我被告知完全忘记了这个概念.我不确定我明白为什么会这样.让我举个例子:
<script>
var display = function(msg)
{
alert(msg);
}
// Now, at the moment, the display() function
// is receiving a single parameter and alerting
// it to the user. I'm now going to use eval()
// to modify the display() function.
eval('display = ' + display.toString().replace('alert(', 'document.write('));
// Now, the display() function writes its parameter
// to the document as opposed to alerting it.
</script>
Run Code Online (Sandbox Code Playgroud)
我意识到这是一个相当简单的例子,但肯定会有一些用法可以从动态修改函数中获得,这本身就是非常有用的.
如果我在XHR的onreadystatechange函数中,我可以很容易地做到document.title = xhr.responseText,但如果我让函数返回responseText,我就不能设置一个等于我的XHR外层包装的变量来使它等于响应; 这有什么办法吗?
我的包装:
ajax = function(url, cb)
{
xhr = (window.XMLHttpRequest)
? new XMLHttpRequest()
: new ActiveXObject('Microsoft.XMLHTTP');
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4 && xhr.status == 200)
{
cb(xhr.responseText);
};
}
xhr.open('get', url, true);
xhr.send();
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我做了类似的事情:
ajax('bacon.txt', function(_)
{
document.title = _;
}
Run Code Online (Sandbox Code Playgroud)
它绝对完美; document.title实际上成为了对bacon.txt的调用的responseText.但是,如果我尝试以这种方式实现它:
document.title = ajax('bacon.txt', function(_)
{
return _;
}
Run Code Online (Sandbox Code Playgroud)
没有这样的运气.任何人都可以澄清为什么会这样吗?};