这是一套很经典的JavaScript题了,做之前一些题我也觉得稀奇古怪,但一道一道做,记下错题,去查解释,做完感觉真的很值得。建议,不看答案一道一道去做。
- ["1", "2", "3"].map(parseInt)
答案:[1, NaN, NaN] 解析:parseInt (val, radix) :两个参数,val值,radix基数(就是多少进制转换) map 能传进回调函数 3参数 (element, index, array) parseInt('1', 0); //0代表10进制 parseInt('2', 1); //没有1进制,不合法 parseInt('3', 2); //2进制根本不会有3 巩固:["1", "1", "11","5"].map(parseInt) //[1, NaN, 3, NaN] parseInt('13',2) // 1 , 计算机在二进制只认识0,1,parseInt转换时就当作不认识的字符忽略了 parseInt('18str') //18 10进制能认识到9 parseInt(1/0,19) // 18 1/0 == Infinity 19 进制计算机能认识最后一个字符是i 详细解析在下面的链接
/**
关于这道题的解释说明:
这到面试题主要考了两个知识点:
一:
parserInt()方法的使用:具体的概念可以参考https://www.w3school.com.cn/jsref/jsref_parseInt.asp
parserInt(string,raix)两个参数:
string:必须。要被解析的字符串。
radix:可选。简单解释就是(代表几进制的数字)。该值介于2-36之间。如果省略该参
数或其值为0,则数字将以10为基础大来解析。如果它以"0x"或"0X"开头,将以16(代表16进制)为参数。
二:
map()的使用:map主要用于遍历:具体参考
https://www.runoob.com/jsref/jsref-map.html
map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map()方法按照原始数组元素顺序依次处理元素。
注意:map() 不会对空数组进行检测。
注意:map()不会改变原始数据。
map(function(currentValue, index,arr))参数是一个函数:
currentValue 参数:必须。当前元素的值 ----一般可以使用(v)进行代替。
index 参数:可选。当前元素的索引值 --- 一般可以使用(i)代替。
arr 参数:可选。当前元素属于的数组对象。
注意:
在上面 ["1", "2", "3"].map(parseInt) 直接使用了这个数组调用了 map方法,map里边是
parseInt,因为parseInt 只有两个参数,所以给 只能识别到 map 的两个参数,相当于是 把map的两个参数赋值给了parseInt,又因为map的两个参数是对应的值(v)和下标(i),所以才有了
parseInt('1', 0); //0代表10进制 parseInt('2', 1); //没有1进制,不合法 parseInt('3', 2); //2进制根本不会有3
在此时,这个parseInt 的第二个参数:0,1,2
既代表了下标,也代表了 是几进制的数字;
0 代表了十进制:所以是10进制的1,是1
1 代表了一进制:所以是1进制的2,是(NaN)(因为W3c规定,如果该值小于2,则识别为NaN)
2 代表了二进制:所以是2进制的3,是(NaN)(因为二进制中没有3)
**/
- [typeof null, null instanceof Object]
答案:["object", false] 解析:null代表空对象指针,所以typeof判断成一个对象。可以说JS设计上的一个BUG instanceof 实际上判断的是对象上构造函数,null是空当然不可能有构造函数 巩固:null == undefined //true null === undefined //flase
- [ [3,2,1].reduce(Math.pow), [].reduce(Math.pow)]
答案:an error 解析:Math.pow (x , y) x 的 y 次幂的值 reduce(fn,total)
fn (total, currentValue, currentIndex, arr)
如果一个函数不传初始值,数组第一个组默认为初始值. [3,2,1].reduce(Math.pow)
Math.pow(3,2) //9
Math.pow(9,1) //9
巩固:[].reduce(Math.pow) //空数组会报TypeError [1].reduce(Math.pow) //只有初始值就不会执行回调函数,直接返回1
[].reduce(Math.pow,1) //只有初始值就不会执行回调函数,直接返回1
[2].reduce(Math.pow,3) //传入初始值,执行回调函数,返回9
4.
var val = 'smtg'; console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing');
这段代码的执行结果?
答案:Something
解析:字符串连接比三元运算有更高的优先级
所以原题等价于 'Value is true' ? 'Somthing' :'Nonthing'
而不是 'Value is' + (true ? 'Something' : 'Nonthing') 巩固:
1 || fn() && fn() //1
1 || 1 ? 2 : 3 ; //2
巩固的解释请看下面这篇文章
5.
var name = 'World!';
(function () {
if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
} })();
这段代码的执行结果?
答案:Goodbye Jack
解析:(1)typeof时 name变量提升。 在函数内部之声明未定义 (2)typeof优先级高于=== 巩固: var str = 'World!'; (function (name) { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })(str); 答案:Hello World 因为name已经变成函数内局部变量7
6.
var END = Math.pow(2, 53); var START = END - 100;
var count = 0;
for (var i = START; i <= END; i++) { count++; } console.log(count);
这段代码的执行结果?
答案:other ,不是101
解析:js中可以表示的最大整数不是2的53次方,而是1.7976931348623157e+308。2的53次方不是js能表示的最大整数而应该是能正确计算且不失精度的最大整数,
巩固: var END = 1234567635;
var START = END - 1024;
var c = count = 0;
for (var i = START; i <= END; i++) {
c = count++;
}
console.log(count); //1025
console.log(c); //1024
7.
var ary = [0,1,2];
ary[10] = 10; ary.filter(function(x) { return x === undefined;});
这段代码的执行结果?
答案:[] 解析:filter() 不会对空数组进行检测。会跳过那些空元素
巩固: var ary =[0,1,2,undefined,undefined,undefined,null]; ary.filter(function(x) { return x === undefined;}); // [undefined, undefined, undefined]
8.
var two = 0.2
var one = 0.1
var eight = 0.8
var six = 0.6 [two - one == one, eight - six == two]
这段代码的执行结果?
答案:[true, false]
解析:IEEE 754标准中的浮点数并不能精确地表达小数
巩固:var two = 0.2;
var one = 0.1;
var eight = 0.8;
var six = 0.6; ( eight - six ).toFixed(4) == two //true
9.
function showCase(value) {
switch(value) {
case 'A':
console.log('Case A');
break;
case 'B':
console.log('Case B');
break;
case undefined:
console.log('undefined');
break;
default:
console.log('Do not know!');
}
}
showCase(new String('A'));
这段代码的执行结果?
答案:Do not know! 解析:switch判断的是全等(===) ,new String(x)是个对象 巩固:var a = new String('A') ; a.__proto__
// String.prototype 实例的原型指向构造函数的原型对象
10.
function showCase2(value) {
switch(value) {
case 'A':
console.log('Case A');
break;
case 'B':
console.log('Case B');
break;
case undefined:
console.log('undefined');
break;
default:
console.log('Do not know!');
}
}
showCase2(String('A'));
这段代码的执行结果?
答案:Case A
解析:String('A')就是返回一个字符串
巩固: var a2 = 'A'; a2.__proto__ // String.prototype a1.__proto__ === a2.__proto__ // true 上一题的a.__proto__ 那字符串不是对象为啥也指向String.prototype? 解析:b是基本类型的值,逻辑上不应该有原型和方法。为了便于操作,有一种特殊的引用类型(基本包装类型)String。其实读取时,后台会自动完成下面的操作: var str = new String("A"); //创建实例 str.__proto__; //调用指定属性和方法 str = null; //销毁实例 所以 a1.__proto__ === a2.__proto__ 但注意基本包装类型特殊就在于它对象(str)的生命周期,只存在于一行代码(a1.__proto__ === a2.__proto__)的执行瞬间。 这也就解释了为啥字符串也能操作属性和方法但不能添加。基本包装类型有三个(String,Number,Boolean) (详情请看《js高程》 5.6基本包类型 P119)
11.
function isOdd(num) { return num % 2 == 1; } function isEven(num) { return num % 2 == 0; } function isSane(num) { return isEven(num) || isOdd(num); } var values = [7, 4, '13', -9, Infinity]; values.map(isSane);
这段代码的执行结果?
答案:[true, true, true, false, false] 解析:%如果不是数值会调用Number()去转化 '13' % 2 // 1 Infinity % 2 //NaN Infinity 是无穷大 -9 % 2 // -1 巩固: 9 % -2 // 1 余数的正负号随第一个操作数
12.
parseInt(3, 8)
parseInt(3, 2)
parseInt(3, 0)
这段代码的执行结果?
答案:3 NaN 3 解析:2进制不可能有3
13.
Array.isArray( Array.prototype )
这段代码的执行结果?
答案:true 解析:Array.prototype是一个数组 数组的原型是数组,对象的原型是对象,函数的原型是函数
14.
var a = [0]; if ([0]) { console.log(a == true); } else { console.log("wut"); }
这段代码的执行结果?
答案:false 解析:[0]的boolean值是true console.log(a == true); // 转换为数字进行比较, a转换先toString,转化成'0',再Number('0') 转化成数值0 Number(true) => 1 ,所有是false
15.[]==[]
答案:false 解析:两个引用类型, ==比较的是引用地址 巩固:[]== ![] (1)! 的优先级高于== ,右边Boolean([])是true,取返等于 false (2)一个引用类型和一个值去比较 把引用类型转化成值类型,左边0 (3)所以 0 == false 答案是true
16.
'5' + 3 '5' - 3
这段代码的执行结果?
答案:53 2 解析:加号有拼接功能,减号就是逻辑运算 巩固:typeof (+"1") // "number" 对非数值+—常被用来做类型转换相当于Number()
17.本期的JavaScript题到了这里就结束啦,是不是很简单!是不是很棒!让我们一起努力走向巅峰!