1、介绍一下js的数据类型有哪些,值是如何存储的

JavaScript一共有8种数据类型,其中有7种基本数据类型:Undefined、Null、Boolean、Number、String、Symbol(es6新增,表示独一无二的值)和BigInt(es10新增);

1种引用数据类型——Object(Object本质上是由一组无序的名值对组成的)。里面包含 function、Array、Date等。JavaScript不支持任何创建自定义类型的机制,而所有值最终都将是上述 8 种数据类型之一。

原始数据类型:直接存储在栈(stack)中,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储。

引用数据类型:同时存储在栈(stack)和堆(heap)中,占据空间大、大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体

2、JS中数据类型的判断( typeof,instanceof,constructor,Object.prototype.toString.call()

(1)typeof对于原始类型来说,除了null都可以显示正确的类型。

    typeof对于对象来说,只有function能正确显示,其他都显示object。

所以,typeof并不能准确判断变量的类型,可以使用instanceof。

(2)instanceof能够正确判断类型,因为内部机制是通过判断对象的原型链中是不是能找到类型的prototype。

  instanceof可以精准的判断引用类型(object array function),而基本数据类型不可以被instanceof精准判断。

(3)constructor利用全等可以判断全部数据类型。

 console.log((2).constructor === Number); // true
console.log((true).constructor === Boolean); // true
console.log(('str').constructor === String); // true

  但是有一个坑,如果更改了一个对象的原型,它的constructor就会变得不可靠。

function Fn(){};
Fn.prototype=new Array();
var f=new Fn();
console.log(f.constructor===Fn); // false
console.log(f.constructor===Array); // true

(4)Object.prototype.toString.call()使用 Object 对象的原型方法 toString ,使用 call 进行狸猫换太子,借用Object的 toString  方法。

 var a = Object.prototype.toString;
console.log(a.call(2));
console.log(a.call(true));

3、null 和 undefined 的区别?

首先 Undefined 和 Null 都是基本数据类型,这两个基本数据类型分别都只有一个值,就是 undefined 和 null。

undefined 代表的含义是未定义, null 代表的含义是空对象(其实不是真的对象,请看下面的注意!)。一般变量声明了但还没有定义的时候会返回 undefined,null 主要用于赋值给一些可能会返回对象的变量,作为初始化。

当我们对两种类型使用 typeof 进行判断的时候,Null 类型化会返回 “object”,这是一个历史遗留的问题。当我们使用双等 号对两种类型的值进行比较时会返回 true,使用三个等号时会返回 false。

4、 对this、call、apply和bind的理解

  1. 在浏览器里,在全局范围内this 指向window对象;

  2. 在函数中,this永远指向最后调用他的那个对象;

  3. 构造函数中,this指向new出来的那个新的对象;

  4. call、apply、bind中的this被强绑定在指定的那个对象上;

  5. 箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this.要知道前四种方式,都是调用时确定,也就是动态的,而箭头函数的this指向是静态的,声明的时候就确定了下来;

  6. apply、call、bind都是js给函数内置的一些API,调用他们可以为函数指定this的执行,同时也可以传参。

最新文章

  1. [Android Pro] Scroller使用分析
  2. js中解决函数中使用外部函数局部变量的问题(闭包问题)
  3. SVN上传文件提示磁盘空间不足的问题
  4. JVM性能监控与故障处理命令行工具
  5. linux命令:tail
  6. tp框架做留言板
  7. SQLSERVER执行计划详解
  8. RabbitMQ介绍5 - 集群
  9. javaScript 获取主机地址,项目名等
  10. python删除指定位置 2个元素
  11. android签名相关
  12. bug--Unable to add window –token is not valid; is your activity running?
  13. rdb map出错rbd sysfs write failed
  14. c#FTP操作类,包含上传,下载,删除,获取FTP文件列表文件夹等Hhelp类
  15. 【JQUERY】插件的写法
  16. [Err] 1093 - You can't specify target table 's' for update in FROM clause
  17. 转:ArcGIS API for JavaScript之图层
  18. ml机器学习笔记
  19. has to be escaped using backslash to be included in string value\n
  20. lintcode-414-两个整数相除

热门文章

  1. Java实现LeetCode 111. Minimum Depth of Binary Tree
  2. 玩转计划任务命令:schtasks
  3. list基本运用
  4. 区分http请求状态码来理解缓存(协商缓存和强制缓存)
  5. <WP8开发学习笔记>获取手机的常用型号(如Lumia920,而非RM-822)
  6. iOS简历书写注意事项
  7. Android学习笔记样式资源文件
  8. php 整数转罗马数字
  9. HTML5如何垂直居中一个浮动元素
  10. python多线程+生产者和消费者模型+queue使用