不矛盾的法则规定,两个相互矛盾的陈述不能同时成立.这意味着表达式
(a && !a)
(a == !a)
(a === !a)
Run Code Online (Sandbox Code Playgroud)
应该总是评估一个虚假的价值,并且
(a || !a)
Run Code Online (Sandbox Code Playgroud)
应始终评估为真实价值.
幸运的是,Javascript是一种有趣的语言,可以让你做 各种各样的 生病.我打赌一个小小的财富,有可能说服Javascript打破非矛盾的法则,或者至少令人信服地让它看起来像是违反了不矛盾的法则.现在我试图让上面的所有四个代码示例都给出意想不到的结果.
有什么好办法可以解决这个问题?
有些语言使用一元加运算符进行隐式转换,例如将字符串强制转换为数字(例如Javascript)或将小数字类型转换为int(例如大多数基于C的语言),或者在重载运算符时使用.
由于一元加号主要用于这样的hackish目的,而且由于F#不执行自动扩展转换,我很惊讶F#包括一元加号.
令我惊讶的是,Haskell没有一元加运算符.由于F#设计受到Haskell的影响,我很好奇为什么当Haskell显然不支持F#需要一元加时.
你能举例说明F#中一元加的可靠用法吗?如果你不能,为什么它包含在语言中呢?
这是我最近在采访中被问到的一个问题:在"GC.Collect()"调用期间会收集哪些"随机"对象?
String a = new Random().Next(0, 1) ==1 ? "Whatever 1" : "Whatever 2";
String b = new WeakReference(new Random()).Target.Next(0, 1) == 1 ?
"Whatever 1" : "Whatever 2";
GC.Collect();
Run Code Online (Sandbox Code Playgroud)
我回答说这是一个特定于实现的问题,它高度依赖于GC实现和相应的弱引用语义.据我所知,C#规范没有提供GC.Collect应该做什么以及如何处理弱引用的准确描述.
但是,我的采访者想听别的.
在F#mantra中,似乎有一种内心的避免null,Nullable<T>以及它的同类.作为交换,我们应该使用选项类型.说实话,我并没有真正看到差异.
我对F#选项类型的理解是它允许您指定一个可以包含其任何正常值的类型,或者None.例如,除了之外,还Option<int>允许所有int可以拥有的值None.
我对C#可空类型的理解是它允许你指定一个可以包含任何正常值的类型,或者null.例如,Nullable<int>又名int?允许所有的值的int可具有,除了null.
有什么不同?用Nullable和Option,做一些词汇替换,null并且None,你基本上有相同的东西.有什么大惊小怪的null?
我今天在Javascript中玩数组并注意到这个小宝石:
alert([1, 2, 3] == [1, 2, 3]); //alerts false
Run Code Online (Sandbox Code Playgroud)
令我感到奇怪的是阵列不等于它自己.
但后来我注意到了这一点,甚至更奇怪了:
alert([1, 2, 3] == "1,2,3"); //alerts true
Run Code Online (Sandbox Code Playgroud)
?!?!?!?!?
世界上为什么[1, 2, 3]不是==自己而是==弦乐?
我认识到,==是不一样的===.即便如此,邪恶可能会导致Javascript先生做出如此奇怪的事情?
在Javascript中,如果if表达式后面没有大括号,则将以下语句放入if块中.那是,
if(foo)
bar();
baz();
Run Code Online (Sandbox Code Playgroud)
相当于
if(foo) {
bar();
}
baz();
Run Code Online (Sandbox Code Playgroud)
道格拉斯·克罗克福德建议不要使用第一个,因为如果程序员试图在if没有括号的情况下向一个块添加语句,那么它会让人感到困惑并且可能导致难以追踪的错误.出于这个原因,JsLint抱怨你是否使用第一个表格.
我一直都在使用它,如果你把语句与语句放在同一行,我认为这是一个非问题if,如下所示:
if(foo) bar();
baz();
Run Code Online (Sandbox Code Playgroud)
这在视觉上比完整的支架形式更简洁,我从来没有与它混淆.就这样我可以通过JsLint并且没有那么多的视觉噪音我有时会使用一种依赖于操作员短路的较少惯用的形式,如下所示:
foo && bar();
baz();
Run Code Online (Sandbox Code Playgroud)
你可能都在等我快点问一个问题,所以这就是: 如果你正确地格式化,在一行条件语句中不使用大括号通常被认为是不好的做法吗?为什么?JsLint有没有合理的理由抱怨它?
如果我有这样的功能:
function say(message: string) {
alert(message);
return say;
}
Run Code Online (Sandbox Code Playgroud)
它有一个有趣的属性,我可以链接调用它:
say("Hello,")("how")("are")("you?");
Run Code Online (Sandbox Code Playgroud)
如果我将数字传递给第一个调用,编译器将生成警告,但它允许我将数字放入后续调用中.
say("Hello")(1)(2)(3)(4)
Run Code Online (Sandbox Code Playgroud)
say当我将无效类型传递给链式调用时,我需要向函数添加什么类型的注释以使编译器生成警告?
在jquery中有什么东西可以在触发任何事件时触发函数吗?
我想要这样的事情:
$("*").anyEvent(function(){
$("#error").html("");
});
Run Code Online (Sandbox Code Playgroud) 我需要找到从函数传递给函数的参数.
让我们假设我有一个叫做的函数foo:
function foo() {
var a = 3;
var b = "hello";
var c = [0,4];
bar(a - b / c);
bar(c * a + b);
}
function bar(arg) { alert(arg) }
Run Code Online (Sandbox Code Playgroud)
当然,现在,它bar总会提醒NaN.
在函数内部bar,我想以最初传递的形式获取参数.此外,我希望能够访问的值a,b以及c从bar功能.换句话说,我想要这样的东西:
bar(a - b / c);
function bar() {
//some magic code here
alert(originalArg); //will alert "a - b / c"
alert(vars.a + " " + vars.b + " " …Run Code Online (Sandbox Code Playgroud)