我预计如果我将Vector传递给带有布尔参数的方法,编译器会抱怨。但它甚至没有发出警告。当我传递一个Sprite作为参数时,我得到一个警告,但程序仍然编译。为什么类型检查系统没有抓住这个?
package {
import flash.display.Sprite;
public class Main extends Sprite {
public function Main():void {
test(new Vector.<Number>()); // No warning or error.
test(new Sprite()); // Warning, but no error.
}
public function test(value:Boolean):void {
}
}
}
答案 0 :(得分:4)
这是因为您的函数test()
会将您赋予它的值转换为布尔值(true或false),具体取决于它是 truthy还是falsy 。
示例:
function test(bool:Boolean):void
{
trace(bool);
}
test( new Sprite() ); // true
test( 5 ); // true
test( undefined ); // false
test( "" ); // false
test( null ); // false
这与准备if
语句时使用的过程相同:
if(new Sprite())
{
trace("Yep.");
}
if(null)
{
// Never happens.
trace("Nope.");
}
您可以在此处详细了解强制转换为布尔值的过程:Casting to Boolean。
<强>亮点强>
- 如果实例为null,则从Object类的实例转换为Boolean返回false;否则,它返回true。
- 如果字符串为null或空字符串(“”),则从String值转换为Boolean将返回false。否则,它返回true。
- 如果数值为0,则从任何数值数据类型(uint,int和Number)转换为Boolean将导致false,否则返回true。对于Number数据类型,值NaN也会导致false。