上半年一直参与公司技术面试,拿本身来说,非常反对面试造航母,工作拧螺丝的做法,这样即使招来了人才也留不住,徒劳。Leader要求笔试,于是准备了几道诸如排序之类的基础常见题目。
令我惊奇的是,下面一道题,算得上基础,大几十人没有一个答对的,后来录用的同事告诉我这道题很调皮。
此题如下:
<?php
$arr = [
'0',
'0' => 1,
'aa'=> 2,3,4
];
foreach ($arr as $key => $val) {
print($key == 'aa'?5:$val);
}
echo count(null);
echo "<br />";
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”显示。