导航
typeof null === "object"typeof undefined === "undefined"Number(null) => 0Number(undefined) => NaNnull == undefined // truenull === undefined // falsevar a; // undefined
b; // b is not defined
{} 的 valueOf 结果为 {} ,toString 的结果为 "[object Object]"
[] 的 valueOf 结果为 [] ,toString 的结果为 ""
未声明的变量使用 typeof 返回字符串 "undefined"
typeof 一个 let 定义的变量会因为暂时性死区报错 ReferenceError(前提:let/const未声明之前赋值或使用)
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError: tmp is not defined
let tmp;
}
console.log(typeof tmp); // ReferenceError: tmp is not defined
let tmp;
let tmp;
console.log(typeof tmp); // undefind 不会报错
typeof 能判断的类型有:string、number、boolean、undefined、symbol、function、bigint、object
null 的输出结果为 'object' 其它类型都能正确判断'function' 其它都输出 'object'typeof(null) = object 是 JS 在诞生设计之初留下的历史遗留 BUG 问题Object.prototype.toString.call()
number、string、boolean、object、function、undefined、symbol、bigintfunction myTypeof(val) {
var type = typeof(val);
var toStr = Object.prototype.toString;
var map = {
'[object Object]': 'object-object',
'[object Array]': 'object-array',
'[object String]': 'object-string',
'[object Number]': 'object-number',
'[object Boolean]': 'object-boolean'
}
if (val === null) {
return 'null';
} else if (type === 'object') {
var ret = toStr.call(val);
return map[ret];
} else {
return type;
}
}
console.log(myTypeof(function () {}));
console.log(myTypeof(1));
console.log(myTypeof([]));
console.log(myTypeof(true));
console.log(myTypeof(null));
console.log(myTypeof(new String('233')));
console.log(myTypeof(BigInt(123)));
console.log(myTypeof(Symbol(456)));
false
因为:数组是引用类型(对象)
当两个对象比较时:
对,但有个前提:只有当两边类型不同,才会转. 而:[1] 和 [1] 两边都是对象。类型相同。**不会发生类型转换!**于是直接比引用 → false。
Object 的问题
key 只能是字符串 / symbol
obj[{}] // → "[object Object]"
原型链污染风险
obj.toString
Map 的优势
装箱:把基本数据类型转化为对应的引用数据类型的操作
看以下代码,s1 只是一个基本数据类型,他是怎么能调用 indexOf 的呢?
const s1 = 'Sunshine_Lin'
const index = s1.indexOf('_')
console.log(index) // 8
原来是 JavaScript 内部进行了装箱操作
var temp = new String('Sunshine_Lin')
const index = temp.indexOf('_')
temp = null
console.log(index) // 8
拆箱:将引用数据类型转化为对应的基本数据类型的操作
通过 valueOf 或者 toString 方法实现拆箱操作
var objNum = new Number(123);
var objStr = new String("123");
console.log( typeof objNum ); // object
console.log( typeof objStr ); // object
console.log( typeof objNum.valueOf() ); // number
console.log( typeof objStr.valueOf() ); // string
console.log( typeof objNum.toString() ); // string
console.log( typeof objStr.toString() ); // string
const str1 = "abc";
const str2 = new String("abc");
str1 是基本数据类型
str2 是引用数据类型
| --- | --- |