JS基础题每日五道

106 阅读2分钟

1、讲一讲JavaScript的装箱和拆箱?

装箱分为 隐式装箱显示装箱 装箱:基本数据类型转换为对应的引用类型的操作,其基本类型包括,String、Number、Symblo

  1. 隐式装箱: 基本类型在调用方法时,后台引擎会自动创建出对应的引用类型的包装箱,也叫做基本 类型包装箱

    过程则是:

    let str = new String('type');           //创建实例
    let str1 = str.indexOf();      //调用方法
    str = null                     //销毁
    
  2. 显示装箱 直接new出一个实例对象,直接添加属性或方法

  3. 拆箱 拆箱与之相反,将引用类型转换为基本数据类型,调用方法为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、如何判断数据类型?

  1. 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;
  1. 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
  1. 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、== 与 === 的区别?

== 在判断左右两边时,存在隐式交换,不判断类型,只判断值是否一致;

=== 判断左右两边时先判断类型,在判断值是否一致