1、讲一讲JavaScript的装箱和拆箱?
装箱分为 隐式装箱和显示装箱 装箱:基本数据类型转换为对应的引用类型的操作,其基本类型包括,String、Number、Symblo
-
隐式装箱: 基本类型在调用方法时,后台引擎会自动创建出对应的引用类型的包装箱,也叫做基本 类型包装箱
过程则是:
let str = new String('type'); //创建实例 let str1 = str.indexOf(); //调用方法 str = null //销毁 -
显示装箱 直接new出一个实例对象,直接添加属性或方法
-
拆箱 拆箱与之相反,将引用类型转换为基本数据类型,调用方法为valueOf();toString();
2、null和undefined的异同点有哪些?
相同点:
-
null和undefined都是空值
-
null和undefined在"==",运算符下判断是相等的
-
null和undefined在类型为Boolean时,均是假值和false
-
都没有属性值和方法
-
用.或[]存储时会报出类型错误 不同点:
-
null的typeof()类型为对象;typeof(undefined)类型为undefined;
-
Number(null) ,转换结果为0; Number(undefined)转换结果为undefined;
-
null是一个对象未初始化,undefined是对象已经初始化了但还未定义;
-
使用运算符'==='时,运算结果为false,两者在全等判断下是不相等的;
-
null是程序级的空值,而undefined是系统级的空值
3、如何判断数据类型?
- typeof();可直接判断出基本数据类型,在判断对象和数组时,返回值均为Object
let str = '1';
console.log(typeof(str)); //string;
let arr = [1,2,3,4];
console.log(typeof(arr)); //object;
let obj = {name:'zx'};
console.log(typeof(obj)); //object;
- instanceof();可以判断出所有类型
var simpleStr = "This is a simple string";
var myString = new String();
var newStr = new String("String created with constructor");
var myDate = new Date();
var myObj = {};
simpleStr instanceof String; // returns false, 检查原型链会找到 undefined
myString instanceof String; // returns true
newStr instanceof String; // returns true
myString instanceof Object; // returns true
myObj instanceof Object; // returns true, despite an undefined prototype
({}) instanceof Object; // returns true, 同上
myString instanceof Date; // returns false
myDate instanceof Date; // returns true
myDate instanceof Object; // returns true
myDate instanceof String; // returns false
-
Object.prototype.toString.call();可以准确的判断出我们具体需要的所有类型;
栗如在我们只想要判断Object时,Array和Null也属于Object,使用 Object.prototype.toString.call()方法就可以有效的避免这个问题
console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
function Person(){};
console.log(Object.prototype.toString.call(new Person));//[object Object]
4、为什么typeof null 是object?
在Js初始版本的时候,为了优化性能,考虑用低位存储变量类型信息,而二进制前三位为0代表的就是对象Object,null则表示的全0,所以在判断时,null被误判成了对象;虽然是个bug但是也被一直流传了下来。
5、== 与 === 的区别?
== 在判断左右两边时,存在隐式交换,不判断类型,只判断值是否一致;
=== 判断左右两边时先判断类型,在判断值是否一致