JavaScript那些你还不知道的事
1. [2,2,3].reduce(Math.pow,1) //1
var total = Math.pow(1,2) //1 reduce 的第二个参数,2 数组的第一个元素
total = Math.pow(total ,2) //2 数组的第二个元素
total = Math.pow(total ,3) //3 数组的第三个元素
return total
2. ["1","2","3"].map(parseInt); //D.其他
A.['1','2','3'] B.[1,2,3] C.[0,1,2] D.其他
解析:map中回调函数的语法如下所示:function callbackfn(value, index, array1)
,可使用最多三个参数来声明回调函 数。第一参数value,数组元素的值;第二个参数index,数组元素的数组索引;array1,包含该元素的数组对象。 因此,题目 等同于[parseInt(1,0),parseInt(2,1),parseInt(3,2)]
最终返回[1, NaN, NaN].
function testFuc(a,x){
return parseInt(a,x);
}
console.info(["1","2","3"].map(testFuc));
parseInt(string, radix);接受两个参数string和radix(要解析的数字的基数,2~36)。
3.[typeof null, null instanceof Object]的运行结果是? //[typeof null, null instanceof Object]
解析:typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果:number,boolean,string,function(函 数),object(NULL,数组,对象),undefined。instanceof 表示某个变量是否是某个对象的实例,null是个特殊的Object类型的值 ,表示空引用的意思 。但null返回object这个其实是最初JavaScript的实现的一个错误, 然后被ECMAScript沿用了,成为了现在 的标准,不过我们把null可以理解为尚未存在的对象的占位符,这样就不矛盾了 ,虽然这是一种“辩解”。对于我们开发人员 还是要警惕这种“语言特性”。最终返回:["object", false]。
4.[[3,2,1].reduce(Math.pow),[].reduce(Math.pow)]的运行结果是? //A
A.报错 B.[9,0] C.[9,NaN] D.[9,undefined]
pow() 方法可返回 x 的 y 次幂的值。[3,2,1].reduce(Math.pow);等同于
function testFuc(x,y){
console.info(x +" : "+y);
return Math.pow(x,y);
}
console.info([3,2,1].reduce(testFuc));
//2 : 2
//9 : 1
//9
5.关于变量提升
var name = 'World';
(function(){
if(typeof name === 'undefined'){
var name = "Jack";
console.info('Goodbye '+ name);
}else{
console.info('Hello ' + name);
}
})();
//A.Goodbye Jack B.Hello Jack C.Goodbye undefined D.Hello undefined
//A
6.filter会接触到没有被赋值的元素,即在arr中,长度为10但实际数值元素列表为[0, 1, 2, 10],因此,最终返回一个空的数组[]
var arr = [0,1,2];
arr[10] = 10;
arr.filter(function(x){return x === undefined});
// A.[undefined x 7] B.[0,1,2,10] C.[] D.[undefined]
//C
7.值得注意的是,0.2-0.1却是==0.1的
var two = 0.2;
var one = 0.1;
var eight = 0.8;
var six = 0.6;
[two -one == one,eight- six == two];
//A.[true,true] B.[false,false] C.[true,false] D.其他
//C
两个浮点数相加或者相减,将会导致一定的正常的数据转换造成的精度丢失问题eight-six = 0.20000000000000007。 JavaScript中的小数采用的是双精度(64位)表示的,由三部分组成: 符 + 阶码 + 尾数,在十进制中的 1/10,在十进制中可以简单写为 0.1 ,但在二进制中,他得写成:0.0001100110011001100110011001100110011001100110011001…..(后面全是 1001 循环)。因为浮点数只有52位有效数字,从第53位开始,就舍入了。这样就造成了“浮点数精度损失”问题。
更严谨的做法是(eight-six ).totoFiexd(1)或者用用Math.round方法回归整数运算。判断两个浮点数是否相等,还是建议用逼近的比较,比如if((a-b) < 1E-10)。
8.使用new String()使用构造函数调用讲一个全新的对象作为this变量的值,并且隐式返回这个新对象作为调用的结果,因此showCase()接收的参数为String {0: "A"}为不是我们所认为的“A”。但是,其实显然,此时的new String('A') == 'A';虽然new出来的是个String对象。
function showCase(value){
switch(value){
case 'A':
console.info('Case A');
break;
case 'B':
console.info('Case B');
break;
case undefined :
console.info('undefined');
break;
default:
console.info('Do not know!');
}
}
showCase(new String('A'));
//A.Case A B.Case B C.Do not know D.undefined
//C
9.Array.prototype为[]
Array.isArray(Array.prototype)
//A.true B.false C.报错 D.其他
//A
10.[] == [] 、[] > []、[] == []、[] >= []的运行结果是
false false false true
11.[3.toString(),3..toString(),3...toString()]的运行结果是:
A.["3",error,error] B.["3","3.0",error] C.[error,"3",error] D.其他
//C
Number中的toString(a)
能够将数值转化成为a进制的值。但a缺省时,默认转化为十进制,一般使用方法为:执行3.toString()
,因为3只是为数值型变量,为非Number实例,因此对于3不能直接调用Number方法。而执行3..toString()
,会强制将3转化为数字实例,因此能够被解释,输出'3',同样可以使用(3).toString()
。
12.IE和FF脚本兼容性的问题
window.event 表示当前的事件对象,IE有这个对象,FF没有
获取事件源 IE用srcElement获取事件源,而FF用target获取事件源
添加、移除事件
IE:element.attachEvent("onclick",function)
element.detachEvent("onclick",function)
FF: element.addEventListener("click",function,true)
element.removeEventListener("click",function,true)
13.改进函数
function initButtons(){
var body = document.body,button,i;
for(i =0;i<5;i++){
button = document.createElement("button");
button.innerHTML = "Button" + i;
button.addEventListener("click",function(e){
alert(i);
},false);
body.appendChild(button);
}
}
initButtons();
题目所给出的代码,除了有addEventListener不兼容IE浏览器的问题之外,最突出的一个问题是:虽然在页面上会显示值为button+i的按钮,但是点击任意一个按钮,最终都会显示5。 要想点击相关按钮,弹出相应的1,2,3,4,5的值,需要理解闭包原理实现和使用立即回调函数。修改后的代码如下:
function initButtons(){
var body = document.body,button,i;
for(i =0;i<5;i++){
(function(i){
button = document.createElement("button");
button.innerHTML = "Button" + i;
button.addEventListener("click",function(e){
alert(i);
},false);
body.appendChild(button);
})(i);
}
}
initButtons();
14.写一段代码,判断一个字符串中出现次数最多的字符,并统计出现的次数。
/*写一段代码。判断一个字符串中出现次数最多的字符串,并统计出现的次数*/
//常规方法
function toGetTheMostCharsByArray(s){
var r={};
for(var i=0;i< s.length;i++){
if(!r[s[i]]){
r[s[i]] = 1;
}else{
r[s[i]]++;
}
}
var max = {
"value": s[0],
"num": r[s[0]]
};
for(var n in r){
if(r[n]>max.num){
max.num = r[n];
max.value = n;
}
}
return max;
}
//使用正则方法
function toGetTheMostCharsByRegex(s){
var a = s.split('');
a.sort();
s = a.join('');
var regex = /(\w)\1+/g ; // \1+代表重复的
var max = {
"value" :s[0],
"num" : 0
};
s.replace(regex,function(a,b){//a是重复的string:eg:'aaa',b是重复的字母char:eg:'a';
if(max.num < a.length){
max.num = a.length;
max.value= b;
}
});
return max;
}
var test = "efdfssssfrhth";
console.info("使用常规方法,出现最多的字符串为:"+toGetTheMostCharsByArray(test).value+" ,出现次数:"+toGetTheMostCharsByArray(test).num);
console.info("使用字符串匹配,出现最多的字符串为:"+toGetTheMostCharsByRegex(test).value+" ,出现次数:"+toGetTheMostCharsByRegex(test).num);
15.请问一下两段代码有什么不同?
setTimeout(function(){
/*代码块*/
setTimeout(arguments.callee,10);
},10);
//2.
setInterval(function(){
/*代码块*/
},10);
解析:javascript的引擎是单线程的。javascript的引擎是基于事件驱动的。setTimeout和setInterval都是往事件队列中增加一个待处理时间而已,setTimeout只触发一次,而setInterval是循环触发。setTimeout循环触发。但是,执行完这段代码块才挂起时间,所以两次执行时间会大于10ms。而setInterval是自动在10ms的时候挂上这个事件,所以两次事件的相隔会小于等于10ms。当线程阻塞在一个事件的时候,不管是使用setInterval还是setTimeout都需要等待当前事件处理完才能执行。
16.a && b : 若a为真,返回b,若a为假,返回a。
同理,|| 前面为假取后,前面为真取前。
alert(1&&2);//2
17.f能取到a,b吗?原理是什么
f(F的实例对象)能访问a
F(函数对象)能访问a,b
var F = function(){};
Object.prototype.a = function(){};
Function.prototype.b = function(){};
var f = new F();
f.a === Object.prototype.a //=> true
f.b === Function.prototype.b //=> false
18.注意运算符的优先级,+的优先级高于?
var val = 'smtg';
console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing');
//Something
上一篇: C#应用案例之贪吃蛇
推荐阅读
-
在网上玩抖音怎么赚钱,这几种赚钱的方法你可能还不知道
-
你不知道的JavaScript --- 作用域相关
-
JavaScript中Array方法你该知道的正确打开方法
-
神经网络API、Kotlin支持,那些你必须知道的Android 8.1预览版和Android Studio 3.0新特性
-
Word毕业论文排版技巧就是那些你不知道或时常忽略的
-
GTX1080显卡有哪些特性 关于Nvidia GTX 1080你需要知道的7件事
-
关于Mysql自增id的这些你可能还不知道
-
高档大米的选购技巧你还不知道吗
-
生煎包热量真的高吗?说说那些关于你不知道的生煎包的秘密
-
关于JavaScript限制字数的输入框的那些事