丨 数据类型
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol
引用数据类型:对象(Object)、数组(Array)、函数(Function)
丨引用数据类型
对象、数组、函数为引用数据类型,它们存的是指针,调用它们时会先从栈中获得它们的地址指针,再去堆内存中获取它的数据。
{} === {} //输出false
丨 深拷贝 / 浅拷贝
- 深:
JSON.stringify()
/JSON.parse()
- 深:递归拷贝
- 浅:普通赋值语句
-
Object.assign()
,当对象为单层结构为深拷贝,多层时为浅拷贝
丨 JSON.parse()
JSON.parse()
:把JSON字符串转化为JS对象;传递两个参数,第一个为需要转化的JSON,第二个为对内容操作的函数。
- undefined、任意的函数以及symbol值,出现在非数组对象的属性值中时在序列化过程中会被忽略。
- undefined、任意的函数以及symbol值出现在数组中时会被转换成 null。
- undefined、任意的函数以及symbol值被单独转换时,会返回 undefined。
丨空值合并运算符 (??
)
当运算符左侧为null或者undefined时,则返回右侧内容,否则返回左侧内容。
console.log(null ?? 1) //1
丨 可选链操作符(?.
)
当访问嵌套的深层对象时,不用验证中间属性是否存在,当不存在时返回undefined
console.log(users?.user.name)
丨数组的扩展 (...
)
改运算符将一个数组,变为参数序列。
扩展运算符(...
)内部使用for...of
循环。
丨Reflect
用以代替Object,可以拿到Object内部的方法。
丨闭包
当一个函数的和其周围状态的引用捆绑在了一起,被称为闭包。
丨原型链
JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。
__proto__
:私有属性
prototype
:原型对象
丨对象的新增方法
Object.is()
:和===
相似,不同点在于+0 === -0
答案为true
,Object.is(+0,-0)
为false
丨this指向问题
- 在JavaScript中,要想完全理解this,首先要理解this的绑定规则,this的绑定规则一共有5种:
- 默认绑定
- 隐式绑定
- 显式(硬)绑定
- new绑定
- ES6新增箭头函数绑定
丨 typeof、instanceof、Object.prototype.toString
typeof
: 返回值是一个字符串,该字符串说明运算数的类型。
- 判断
null
为object
- 判断
array
为object
- 判断
data
为function
- 判断
RegExp
为function
instanceof
: 主要的目的是用来检测引用类型,返回值只有true和false,可以用来判断某个构造函数的prototype属性是否存在于另外一个要检测对象的原型链上。
Object.prototype.toString
: 在很多情况下,我们可以使用instanceof运算符或对象的constructor属性来检测对象是否为数组。例如很多JavaScript框架就是使用这两种方法来判断对象是否为数组类型。 但是检测在跨框架(cross-frame)页面中的数组时,会失败。原因就是在不同框架(iframe)中创建的数组不会相互共享其prototype属性。
丨for...in
和 for...of
- for...in 通常用于对象的遍历
- for...of 用于对部署了Symbol.iterator属性的数据结构,具有iterator接口,就可以用for…of循环遍历它的成员。也就是说,for…of循环内部调用的是数据结构的Symbol.iterator方法。
原生具备 Iterator 接口的数据结构如下:
- Array
- Map
- Set
- String
- TypedArray
- 函数的 arguments 对象
- NodeList 对象
丨 forEach
- 不能使用
return
/continue
/break
打断,可以借助try/catch
丨JSON.parse()
和 JSON.stringify()
JSON.stringify()
:把JS对象转化为JSON字符串;传递三个参数,第一个为需要转化的对象,第二个为需要对内容操作的函数或者数组(如果是数组则只会对数组内容进行转化),第三个为指定缩进的空白字符串。
丨 函数的长度
即为没有设置默认值的参数的个数,如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了。
(function fun(a, b){}).length //2
(function fun(a, b = 1, c) {}).length // 1