转换和相等性
以下情况都是true,因为会进行隐士类型转换
null == undefined; // 这两值被认为相等
0 == '0'; //字符串转换成数字
0 == false; //false转换成数字
'0' == false; //字符串和false都转换成数字
'' == 0; //空字符串转换为数字
'' == false; // 空字符串和false转换为0,
数组/对象和数字相加
[] + 0; // "0",数组调用join方法后转换为""
{} + 0; // 0,不知道为什么为0,从结果来看对象转换为null,然后null转换为0;
字符串的加减乘除
"7" + "3"; //"73",字符串相加
"7" - "3"; //4,先转换为数字再运算
"7" * "3"; //21
"8" / "2"; //4
判断数据类型的方法
- typeof 运算符
期望操作数: 1个, 任何数据类型,
运算结果数据类型: 字符串
运算结果值: "stirng" "number" "undefined" "boolean" "symbol" "bigint" "object"
使用场景: 判断基本数据类型
缺点:只能判断基本数据类型,复杂类型都是"object"
typeof null;//"object" 特别注意
typeof Number(3) // "number",即使使用包装对象,依旧是number,而不是object
- instanceof 运算符
期望操作数: 2个, 左操作数是实例对象(基础数据类型也可以,没有意义) 右操作数是构造函数
运算结果数据类型: boolean
运算结果值: true /false
使用场景: 检测构造函数的 prototype 属性是否出现在某个实例对象的原型链
缺点:只能判断复杂数据类型,基本数据类型都是false(不能说是缺点,本来就是为判断复杂数据类型而生)
3 instanceof Number; //false,基本数据类型都是false
- data.constructor.name
计算结果数据类型: 字符串
使用场景: 获取数据的构造函数名称,基本数据类型也使用
缺点:只能判断数据的直接构造函数名称,无法获取父级构造函数名称.不像instanceof会查找实例的原型链
[].constructor.name// "Array"
(3).constructor.name// "Number"
- Object.prototype.toString.call(data)
计算结果数据类型: 字符串like this: "[object Object]"
使用场景: 判断基本数据类型和javascript内置数据类型(Date/RegExp/Function/Array)
缺点: 自定义的构造函数实例化的对象,都是"[object Object]"
Object.prototype.toString.call(3)// "[object Number]",基本数据类型
Object.prototype.toString.call(()=>{}) //"[object Function]",内置数据类型
Object.prototype.toString.call(new Date())// "[object Date]",内置数据类型
Object.prototype.toString.call(new Person()) //"[object Object]", 自己定义的构造函数都是"[object Object]"
- 内置全局方法
isNaN :判断是否为非数字
Array.isArray :判断数组
Object.is()
判断两个值是否相同
网友评论