一道调皮的PHP面试题

上半年一直参与公司技术面试,拿本身来说,非常反对面试造航母,工作拧螺丝的做法,这样即使招来了人才也留不住,徒劳。Leader要求笔试,于是准备了几道诸如排序之类的基础常见题目。
令我惊奇的是,下面一道题,算得上基础,大几十人没有一个答对的,后来录用的同事告诉我这道题很调皮。
此题如下:

 1,
    'aa'=> 2,3,4
];
foreach ($arr as $key => $val) {
    print($key == 'aa'?5:$val);
}

echo count(null);

echo "
"; print_r($arr);

答案:

55340
Array ( [0] => 1 [aa] => 2 [1] => 3 [2] => 4 )

面试者的答案真是五花八门,为什么会是55340?
1、首先看最后的$arr,有四个元素,题中两个下标为0的元素是迷惑,键名相同者覆盖前者;3和4两个元素值写在‘aa’元素同行,也是迷惑,考察的都是PHP基础。
2、明确PHP中==和===的区别在哪:

$a=0;
$b="PHP";

if($a==$b){
    echo "true";
}
else{
    echo "false";
}

if($a===$b){
    echo "true";
}
else{
    echo "false";
}

上面两个判断分别返回true和false,第一种判断会返回true呢?分析到这里我想很多人已经明白了事情的真相。
解释如下
1.==只是对值得比较(将两边值转化为同类型再比较),而===则是对值和类型的比较。
2.对于==的比较,若有一方为数字,另一方为字符串或空或null,均会先将非数字一方转化为0,再做比较。只有字符串以数字开头才转化为相应的数字。
接下来我们再来做个测试,

$a=1;
$b="test";
if($a==$b){
    echo "true";
}
else{
    echo "false";
}

此时结果为false,如果真的懂,那这次不应该出错,现在再返回去看看我的拿到面试题,是不是就很Easy了?

在javascript中会不会是一样的结果呢?
测试代码如下:

var a=0;
var b="javascript";

if(a==b){
    console.log("true");
}else{
    console.log("false");
}

var a=1;
var b="test";

if(a==b){
    console.log("true");
}else{
    console.log("false");
}

两次结果都返回了false;两种都是弱类型语言为什么会这样?因为语言还是有去别的。
在javascript中数字和非数字的比较,非数字不会被转化为0,而PHP的弱类型就体现在这里,它可以根据运行环境的变化而自动进行数据类型的转换(即透明的隐式转换);
js弱类型的体现:

1、最简单的例子:

 var a =200;
 var b ="1";
 var c= a + b;

你可能期望c是201,但实际上它是"2001",这个错误在强类型语言中决不会出现。然而正是因为JavaScript没有这些约束,所以可以很方便地拼接数字和字符串类型。

2、再比如下面这个例子:

var a = '11';
a = a - '';
alert(typeof a);// -->number

“-”可以是一元运算符(取负),也可以是二元(减法运算)

3、Object对象可以隐式的转换
在循环语句中(if,while)中,一个Object对象可以隐式的转换成BOOLEAN值。

var obj = {name:'jack'}
if(obj){
    //do more
}

比较难以发现的是在alert()函数中。

String.prototype.fn = function(){return this};
var a = 'hello';
alert(typeof a.fn()); //-->object
alert(a.fn()); //-->hello

我们知道this可以理解成当前类的实例对象,既然是对象那么typeof a.fn()自然返回是object了。
关键是最后的alert(a.fn()),a.fn()返回的明明是对象,但却隐式的转换成了字符串“hello”显示。

你可能感兴趣的:(一道调皮的PHP面试题)