JS数据类型
- 基本类型
- 常见类型: String Boolean Number BigInt(ES2020) symBol(ES6新增)
- 特殊类型:undefined null
- 引入类型
- Object 对象子类型(Data Array Function)
判断数据类型有哪些方法
- typeof 判断基本数据类型
Number,String,Boolean,Function,undefined,想判断这几种类型,那就可以使用typeof Array,Object,null,Date,RegExp,Error这几个类型都被typeof判断为object - instanceof 原理 判断这个构造函数的原型是否在给定对象的原型链上
null和undefined都返回了false,这是因为它们的类型就是自己本身,并不是Object创建出来它们 - constructor 原理 constructor是prototype对象上的属性,指向构造函数
- Object.prototype.toString.call
原理是 `toString()` 返回 `[object type]`,其中 `type` 是对象的类型
常用的ES6方法
- 变量声明
- let 不具备变量提升 块级作用域
- const 不具备变量提升 定义的基本类型不能改变 引用类型可以改变
在代码块内,使用let,const命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ) - 箭头函数【=>】
- 展开运算符 【...】
原型和原型链
-
首先问一个问题
为什么js会有原型机制?;Javascript在设计之初没有 "类"(class) 的概念而是参考C和java的使用New命令时调用的"类"的构造函数,但是构造函数在生成实例时无法共享属性和方法,所以为构造函数引用了
prototype属性,实例对象一旦创建,将自动引用prototype对象的属性和方法 -
引入原型解决了那些问题(好处)?
- 对象都能共享原型上的方法,节省内存
- 通过找对原型链,方便地实现了继承
-
什么是原型
- 原型包括显示原型(prototype) 和隐式原型 (proto)
- 所有
函数都有一个prototype(显示原型)属性,属性值是一个普通的对象 指向函数的原型对象 - 所有的引用类型都有一直__proto__属性指向构造函数的prototype 隐式原型的作用是用来构成原型链,实现基于原型的继承
-
什么是原型链
当
访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链 -
prototype 和 proto 区别是什么?
- prototype是构造函数的属性
__proto__是每个实例都有的属性,可以访问 [[prototype]] 属性- 实例的
__proto__与其构造函数的prototype指向的是同一个对象
THIS 闭包和 作用域
-
函数调用的几种方式
- 普通函数
- 作为方法调用
- 构造函数调用
- call、apply、bind
call 与apply相似,只是传参的形式不同 bind除了返回是函数以外,它的参数和 call 一样 -
理解this
函数执行时,this总是指向调用该函数的的对象,说白了就是this所在的函数属于谁
-
什么是闭包
是指有权限访问到其他函数作用域的变量的函数
-
使用场景
函数作为返回值
function Proson () { var a = 100 return function () { console.log(a) } } var f1 = Proson(); var a = 200 f1();// 输出的是100 而不是200函数作为参数传递
function foo(){ var a=100; return function(){ console.log(a); } } var f1=foo();//f1为函数 function f2(fn){ var a=200; fn(); } f2(f1);//100
持续更新中.....