typeof数据类型检测
typeof [value]
- 返回结果都是一个“字符串”,字符串中包含对应的数据类型.
- "number"/"string"/"boolean"/"undefined"/"symbol"/"bigint"/"object"/"function".
- 局限性(缺陷):
- typeof null => "object"
- typeof 对象/数组/正则/日期... => "object" 基于typeof不能细分对象类型.
- 检测原理:
-
所有的数据类型值在计算机中,都是按照“二进制(0/1)”的值来进行存储的.
-
对象数据类型的二进制值都是以 000 开头的(不论是普通对象还是数组正则对象都是如此).
-
null在计算中存储的二进制值:000.
-
typeof检测数据类型就是根据它的二进制值检测的,只要检测到是以000开始的,都认为是对象, 所以检测null时,也会认为是对象,则会返回 "object" .
-
console.log(typeof typeof [10, 20]); // =>"string"
// typeof [10, 20] -> "object"
// typeof "object" -> "string"
function fn(x) {
//x=undefined/null 都成立 改写=> x===undefined
if (x == undefined) //检测x的值是不是undefined,当x=undefined或null都成立,可以改写=> x===undefined
{
x = 0;
}
// 这种方案更好一些,因为“==”再比较的时候会进行数据类型的转换
if (typeof x == "undefined") //检测x的类型是不是undefined
{
x = 0;
}
}
fn();
"==" 与"==="
-
==:相等,相对于“绝对相等”来说,浏览器如果发现两边类型不一样,默认会进行“隐式转换”,转换为相同的类型再进行比较
- NaN==NaN 不相等
- null==undefined 相等 null===undefined 不相等 null/undefined和其他任何值都不会相等
- 若是字符串==对象,则把对象转换为字符串再进行比较.
- 剩下的两边数据类型不一样的情况,都是按照“转换为数字然后再比较”的规则处理再进行比较.
-
===:绝对相等(推荐),要求两边的数据类型和值都要相等,只要有一个不相等,结果都是false(不存在数据类型的隐式转换)
console.log(10 == "10"); //true 会把"10"转化为数字10再进行比较.
console.log(10 === "10"); //false
console.log("10"==[10]); //true 会把[10]转化为字符串"10"再进行比较.
console.log("1"==true); //true 会把true转化为数字1,把"1"也转化为数字1再进行比较.
console.log(0==[]); //true 先把[]转化为字符串"",再转化为数字0进行比较.
需求:验证obj是否为一个对象
var obj = {};
//这样写不行,因为 typeof null的值也是"object",而null不是对象,所以不能通过这个方法来判断obj是否为一个对象.
if (typeof obj === "object")
{
console.log('obj is an object~~');
}
//这样写才可以,
// !==:属于绝对不相等,==对应!=(不等于), ===对应!==(绝对不相等).
if (obj !== null && typeof obj === "object")
{
console.log('obj is an object~~');
}
需求:任意数求和
var args = arguments;
//思路:依次循环(遍历/迭代)集合中的每一项,把取出来的每一项进行累加
var total = 0;
for (var i = 0; i < args.length; i++)
{
// i=0 第一轮循环 args[0]集合中的第一项 i++
// i=1 第二轮循环 args[1]集合中的第二项 i++
// i=2 循环结束(第一次只传递了两个值).
// 循环的变量i从零开始,args这个集合中的每一项也是从索引零开始 ,
=> 每一轮循环的时候,i存储的值正好是我们需要获取集合中当前项的索引
=> 每一轮循环 args[i] 获取的就是当前这一轮循环,从集合中取出来的当前项,i等价于当前项的索引
var item = Number(args[i]);// item是每一轮循环拿到的值即当前值.
if (!isNaN(item)) //当item是有效数字时才进行累加.
//if(isNaN(item) === false) //isNaN(item) === false 有效数字
{
total += item;
}
}
return total;
}
var res = sum(10, 20);
console.log(res);
res = sum(10, 20, '30');
console.log(res);
res = sum(10, 20, '30', 'AA');
console.log(res);
//改为箭头函数
var sum = (...args) =>
{
var total = 0;
for (var i = 0; i < args.length; i++)
{
var item = Number(args[i]);
if (!isNaN(item))
{
total += item;
}
}
return total;
};
var res = sum(10, 20);
console.log(res);
res = sum(10, 20, '30');
console.log(res);
res = sum(10, 20, '30', 'AA');
console.log(res);
任意数求和
第一种方法:
function sum() {
var args = arguments;
//思路:依次循环(遍历/迭代)集合中的每一项,把取出来的每一项进行累加
var total = 0;
for (var i = 0; i < args.length; i++)
{
// i=0 第一轮循环 args[0]集合中的第一项 i++
// i=1 第二轮循环 args[1]集合中的第二项 i++
// i=2 循环结束(第一次只传递了两个值).
// 循环的变量i从零开始,args这个集合中的每一项也是从索引零开始 ,
=> 每一轮循环的时候,i存储的值正好是我们需要获取集合中当前项的索引
=> 每一轮循环 args[i] 获取的就是当前这一轮循环,从集合中取出来的当前项,i等价于当前项的索引
var item = Number(args[i]);// item是每一轮循环拿到的值即当前值.
if (!isNaN(item)) //当item是有效数字时才进行累加.
//if(isNaN(item) === false) //isNaN(item) === false 有效数字
{
total += item;
}
}
return total;
}
var res = sum(10, 20);
console.log(res);
res = sum(10, 20, '30');
console.log(res);
res = sum(10, 20, '30', 'AA');
console.log(res);
结果为:
第二种:改为箭头函数
var sum = (...args) =>
{
var total = 0;
for (var i = 0; i < args.length; i++)
{
var item = Number(args[i]);
if (!isNaN(item))
{
total += item;
}
}
return total;
};
var res = sum(10, 20);
console.log(res);
res = sum(10, 20, '30');
console.log(res);
res = sum(10, 20, '30', 'AA');
console.log(res);
结果为:
第三种:利用数组的方法实现求和
var sum = (...args) =>
{
// 利用数组的方法实现求和
var total = 0;
args.forEach(item =>
{
item = Number(item);
if (!isNaN(item))
{
total += item;
}
});
return total;
};
var res = sum(10, 20);
console.log(res);
res = sum(10, 20, '30');
console.log(res);
res = sum(10, 20, '30', 'AA');
console.log(res);
结果为:
第四种:基于reduce来求和
var sum = (...args) =>
{
return args.reduce((total, item) =>
{
item = Number(item);
isNaN(item) ? item = 0 : null; //当item满足isNaN(item)条件(即不是有效数字)时item = 0,
不满足条件时,item =null相当于啥都不做.
return total + item;
}, 0);
};
var res = sum(10, 20);
console.log(res);
res = sum(10, 20, '30');
console.log(res);
res = sum(10, 20, '30', 'AA');
console.log(res);
结果为