typeof vs instanceof
typeof 用来判断原始类型
instanceof 用来判断对象的类型
typeof
对于原始类型来说,除了 null
都可以显示正确的类型
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
//typeof 对于对象来说,除了函数都会显示 object,所以说 typeof 并不能准确判断变量到底是什么类型
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'
instanceof
用来判断一个对象的正确类型,内部机制是通过原型链来判断的
const Person = function() {}
const p1 = new Person()
p1 instanceof Person // true
var str = 'hello world'
str instanceof String // false
var str1 = new String('hello world')
str1 instanceof String // true
类型转换
JS 中类型转换只有三种情况,分别是:
- 转换为布尔值
- 转换为字符串
- 转换为数字
转Boolean
在条件判断时,除了 undefined, null, false, NaN, '', 0, -0,其他所有值都转为 true,包括所有对象。
转字符串
当某个操作或者运算需要字符串而该对象又不是字符串的时候,JS会自动调用 toString 函数转换为字符串类型
- 如果 toString 方法存在并且返回原始类型,返回 toString 的结果。
- 如果 toString 方法不存在或者返回的不是原始类型,调用 valueOf 方法,如果 valueOf 方法存在,并且返回原始类型数据,返回 valueOf 的结果。
- 其他情况,抛出错误。
var obj = {name: 'Coco'};
var str = '123' + obj;
console.log(str); // 123[object Object]
var arr = [1, 2];
var str = '123' + arr;
console.log(str); // 1231,2
转数字
与 String 类型转换相似,但是 Number 类型刚好反过来,先查询自身的 valueOf 方法,再查询自己 toString 方法:
- 如果 valueOf 存在,且返回原始类型数据,返回 valueOf 的结果。
- 如果 toString 存在,且返回原始类型数据,返回 toString 的结果。
- 其他情况,抛出错误
var obj = {
valueOf: function() {
console.log('调用 valueOf');
return 5;
}
}
console.log(obj + 1);
// 调用 valueOf
// 6
var obj = {
valueOf: function() {
console.log('调用 valueOf');
return {};
},
toString: function() {
console.log('调用 toString');
return 10;
}
}
console.log(obj + 1);
// 调用 valueOf
// 调用 toString
// 11
var obj = {
valueOf: function() {
console.log('调用 valueOf');
return {};
},
toString: function() {
console.log('调用 toString');
return {};
}
}
console.log(obj + 1);
// 调用 valueOf
// 调用 toString
// Uncaught TypeError: Cannot convert object to primitive value
网友评论