Javascript作为前端开辟必需控制的一门言语,由于言语的灵活性,有些知识点看起来简朴,在真正碰到的时刻,却不一定会直接做出来,本日我们就一起来看看几道问题吧
问题1
var val = 'smtg';
console.log(' Value is' + (val === 'smtg') ? 'Something' : 'Nothing');
这道题考核的知识点是运算符的优先级。
起首,小括号的优先级是最高的,所以起首会做推断,val与smtg相称返回true。因而末了这道题等价于推断是实行下面的语句1照样语句2.
//语句1
'Value is' + (true ? 'Something' : 'Nothing');
//语句2
'Value is true' ? 'Something' : 'Nothing';
依据运算符优先级我们晓得,衔接元算符+的优先级要高于前提运算符?的优先级,因而现实实行的是语句2,所以末了返回的效果是
‘Something’.
问题2
我们再来看看下面这道题。
var ary = [0,1,2];
ary[6] = 6;
var result = ary.filter(function(x){
return x === undefined;
});
console.log(result);
这道题考核的时刻数组的初始化和filter要领。
第一眼看上去,认为会输出[undefined,undefined,undefined],然则现实输出倒是undefined,为何会如许?
这是由于在JavaScript里存在希罕数组的观点,数组在初始化时,只会对已肯定索引的选项举行初始化,关于不存在索引的选项不举行初始化,经由过程以下代码能够肯定。
0 in ary;//true
1 in ary;//true
3 in ary;//false
4 in ary;//false
6 in ary;//true
对数组运用in运算符时,是经由过程罗列数组的索引,经由过程3和4返回false能够晓得,ary[3]和ary[4]现实是不存在的,未举行初始化。
我们再来看看 Array.prototype.filter要领和polyfill,注重代码中标注的处所。
Array.prototype.filter = function(fun /*thisArg*/){
if(this === void 0 || this === null){
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
if(typeof fun !== 'function'){
throw new TypeError();
}
var res = [];
var thisArg = arguments.length >=2 ? arguments[1]:void 0;
for(var i = 0;i<len;i++){
if(i in t){ //注重这里,运用的是in运算符
var val = t[i];
if(fun.call(thisArg,val,i,t)){
res.push(val);
}
}
}
return res;
}
在filter要领源码中,我发明运用了in运算符,而arg数组没有对索引为3,4,5的值举行初始化,因而会直接跳过实行,所以末了返回undefined。
题3
function caseshow(val){
switch(val){
switch(value){
case 'A':
console.log('A');
break;
case 'B':
console.log('B');
break;
case 'C':
console.log('C');
break;
default:
console.log('do not know!');
}
}
}
caseshow(new String('A'));
咋一看,很多人会认为输出’case A’,但现实输出’do not know’。why? 这道题考核的知识点是:switch和string,我们须要晓得一下两点:
1,JavaScript中switch实行的是严厉相称(===)。 2,字符串和string的实例不一样。
第二点我们能够测试下。
var s_p = 'foo'; var s_o = new String(s_p)
console.log(typeof s_p) //'string'
console.log(typeof s_o) //'object'
console.log(s_p === s_o) //'false'
因而针对问题中的’A’与String(‘A’)并不严厉相称,最终会返回‘do not know’
题4 针对上面的问题3,我们稍作一点修改,成为下面的问题4,再看看效果输出什么?
function caseshow2(val){
switch(val){
case 'A':
console.log('A');
break; case 'B':
console.log('B');
break; case undefined:
console.log('undefined');
break; default:
console.log('do not know!');
} }
caseshow2(String('A'));
问题4相关于问题3,只是在末了挪用的时刻传入的参数是String(‘A’),它的效果就变成了’Case A’。这是为何呢?
实在很简朴,String(X)返回的是一个字符串而不会天生一个新的String实例,因而与’A’是严厉相称的