为什么javascript中的逻辑非运算符在布尔值和布尔对象之间返回不同的结果?请考虑以下示例.
!true // false
!false // true
!(new Boolean(true)) // false
!(new Boolean(false)) // false
Run Code Online (Sandbox Code Playgroud)
根据规范,它表示正在评估的值被转换ToBoolean.如果参数是Object,ToBoolean将返回true,如果参数是Boolean,则返回原样.
进一步挖掘,ToBoolean也用于if语句和条件运算符等其他地方,请考虑以下示例:
var a = (new Boolean(false)) ? "unexpected" : "expected";
console.log(a); // unexpected
Run Code Online (Sandbox Code Playgroud)
问题:布尔对象是一个Object还是一个布尔值?我们不应该将布尔对象评估为布尔值吗?
UPDATE
我的问题被标记为重复的问题,这.那个问题没有一个令人满意的答案,因为没有人回答我的问题,布尔对象是一个对象,还是布尔值?我们不应该将布尔对象评估为布尔值吗?
简单地知道布尔对象是一个对象是不够的,为什么它甚至存在,并且处理和/或设计具有布尔对象的对象的正确方法仍然没有答案.
我最近发现在Ruby中动态创建对象和方法是一项非常重要的工作,这可能是因为我在Javascript中的背景经验.
在Javascript中,您可以动态创建对象,其方法如下:
function somewhere_inside_my_code() {
foo = {};
foo.bar = function() { /** do something **/ };
};
Run Code Online (Sandbox Code Playgroud)
如何在Ruby中完成上述语句(如在Javascript中一样简单)?
代码示例:
Class People {
// private property.
private $name;
// other methods not shown for simplicity.
}
Run Code Online (Sandbox Code Playgroud)
直接前进.我假设这$name是一个PRIVATE类成员(或属性,变量,字段,根据需要调用它).有没有办法在PHP中执行这些操作:
$someone = new People();
$someone->name = $value;
$somevar = $someone->name;
Run Code Online (Sandbox Code Playgroud)
没有使用__get($name)和__set($name, $value).
我需要检查分配的$value,因此我只需要一个这样的getter setter:
getName();
setName($value);
Run Code Online (Sandbox Code Playgroud)
而不是必然一个getter的setter魔术方法重载是这样的:
__get($value);
__set($value, $name);
Run Code Online (Sandbox Code Playgroud)
也就是说,我只需要一个吸气剂装置.但那不是我想要的.它只是感觉不像面向对象,因为来自静态类型语言(如C++或C#)的人可能会感觉和我一样.
有没有办法在不使用getter setter魔术方法重载的情况下在C#中获取和设置私有属性?
更新
网络上有传言说魔术方法比明确的getter setter方法快10倍,我还没有测试过,但要记住这是一件好事.(想象它不是那么慢,只慢2倍,见下面的基准测试结果)
如果我使用魔术方法而不是将它们分成不同的函数,我必须在一个巨大的方法中填充所有内容,就像在显式getter setter中一样.(此要求可能已由ircmaxell回答)
我很好奇使用魔术方法和显式getter setter之间的性能开销,因此我为这两种方法创建了自己的基准测试,希望它对任何人都有用.
使用magic方法和method_exist:
(点击这里查看代码)
使用显式getter …
我想使用Ruby版本1.8.7将哈希添加到数组中:
items = Array.new
items.push {:a => "b", :c => "d"}
Run Code Online (Sandbox Code Playgroud)
上面的语句将返回如下错误:
SyntaxError: compile error
(irb):35: syntax error, unexpected tASSOC, expecting '}'
items.push {:a => "b", :c => "d"}
^
(irb):35: syntax error, unexpected ',', expecting '}'
items.push {:a => "b", :b => "c"}
^
Run Code Online (Sandbox Code Playgroud)
好吧,我发现解决方案是将push参数包装在括号内,( )或者我可以使用<<运算符.我也知道push接受一个或多个参数并且<<只接受来自这个答案的单个参数,但令我困扰的是为什么我需要使用括号,而我们都知道Ruby中的括号是可选的?
我有关于在Ruby中匹配运算符的这个愚蠢的问题.为什么Ruby会生成匹配的运算符=~而不是~=?有没有历史,心理或其他考虑因素而不是后者?
我无法找到任何这信息,我需要就这个意义上说,因为我继续键入错误的东西,由于其他运营商如+=,-=,!=,>=并<=放置=在其他经营者的权利,而=~正好相反.
请让我高兴.