1. ['1','2','3'].map(parseInt)
答案:[1,NaN,NaN]
考点:map方法,parseInt方法。
map
是数组原型方法,接收一个回调函数用于依次接收数组成员并返回替换值。map返回替换后的数组。
['1','2','3'].map(x=>x*x);//[1,4,9]
📌parseInt
方法两个参数,第一个参数是我们需要转换成number的字符串变量。第二个参数可以省略不写,因为数字字符串可以多种进制,所以我们指定第二个参数用来决定解析字符串时的进制规则,如果不写则会自动根据参数一进行选择合适进制,为0同样也会忽略进行自动判断。
- 如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。
- 如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。
- 如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。
如果字符串的第一个字符不能被转换为数字,那么 parseInt() 会返回 NaN,而第二个参数不是可用的进制,那么 parseInt() 也会返回 NaN,如果字符串不满足参数二进制写法规则,那么 parseInt() 同样会返回 NaN。
- 结果分析,因为递归函数会被map方法赋值item、index、array三个参数,所以parseInt第一个参数依次为"1","2","3",所以parseInt第二个参数依次为0,1,2。这里我们知道了1进制不存在,2进制不能出现"3"的写法,只有"1"的才能被真确识别。
parseInt方法在es6时从number方法移植到全局方法(window)。
2. 判断Symbol类型
答案:Object.porotype.toString.call()
可以解决绝大部分的类型判断问题。
function varType(n) {
var typeStr = Object.prototype.toString.call(n);
//var typeOfName = (typeof n);
var typeName = '';
switch (typeStr){
case '[object String]':
typeName = 'string';
break;
case '[object Number]':
typeName = 'number';
break;
case '[object Boolean]':
typeName = 'boolean';
break;
case '[object Undefined]':
typeName = 'undefined';
break;
case '[object Object]':
typeName = 'object';
break;
case '[object Array]':
typeName = 'array';
break;
case '[object Null]':
typeName = 'null';
break;
case '[object RegExp]':
typeName = 'RegExp';
break;
case '[object Symbol]':
typeName = 'symbol';
break;
case '[object JSON]':
typeName = 'json';
break;
case '[object Math]':
typeName = 'math';
break;
default:
typeName = 'object';
}
return typeName;
};
测试案例:
console.log(varType("1"));
console.log(varType(1));
console.log(varType({}));
console.log(varType([]));
console.log(varType(function () {}));
console.log(varType(null));
console.log(varType(undefined));
console.log(varType(true));
console.log(varType(NaN));
console.log(varType(Symbol()));
console.log(varType(JSON));
console.log(varType(Date));
console.log(varType(Math));
console.log(varType(RegExp()));