(1)首先创建了一个空对象;
(2)设置原型,将构造函数的prototype属性赋给对象实例的_ proto _;
(3)将构造函数的this指向创建出来的这个实例;
(4)判断即将返回的对象的类型,如果是值类型,则直接返回创建的对象,如果是引用数据类型则返回这个引用类型的对象。
map本质上是一些键值对的集合,object的键必须是string或者symbol,map的键可以是任意类型;另外object的键是无序的,map的键按照插入的顺序返回键值,map可以直接迭代。
JS的内置对象是指在程序执行前,存在于全局作用域下的一些可以被直接使用的属性、值、函数和用来创建对象实例的构造函数。
值属性:null、undefined、NaN、Infinity等
函数属性:一些全局函数,如eval()、parseInt()、parseFloat()等
基本对象:Object、Function、Error等
一些数字、日期对象:Number、Math、Date等
字符串对象:String
可索引的集合对象:按索引值排序的数据集合,如数组对象、类数组对象等
使用键的集合对象:用键值对的形式存储数据,Map、Set等
结构化数据对象:JSON
Json是一种基于文本的轻量化数据格式,可以用于前后端数据交换。
JSON.stringify函数,传入一个符合JSON数据格式的js数据将其转化为一个JSON字符串
JSON.parse函数,将JSON字符串解析为js数据,来进行访问
JS延迟加载是指等页面加载结束之后再加载js文件,是一种优化方式,好处是可以提高页面加载速度。之所以要优化是因为HTML元素是按其在页面中出现的次序调用的,如果DOM结构还没有加载完成,就使用js代码操作DOM结构,这种情况是不被允许的。
延迟加载的方式:
(1)defer属性:在script标签中添加defer属性,这个属性会让脚本延迟到整个页面都解析完毕之后再执行。
<script defer src="js/script1.js">script>
(2) async 属性:给script标签添加async 属性,这个属性会使脚本异步加载,不会阻塞页面的解析过程,但是当脚本加载完成后立即执行 js 脚本,这个时候如果文档没有解析完成的话同样会阻塞。多个 async 属性的脚本的执行顺序是不可预测的,一般不会按照代码的顺序依次执行。
(3)动态创建 DOM 标签:可以对文档的加载事件进行监听,当文档加载完成后再动态的创建 script 标签来引入 js 脚本。
(4)使用setTimeout:使用设置定时器来延迟加载js脚本
(5)将js脚本文件放在文档底部,前
同步加载:又称阻塞模式,是我们平时使用最多的方式,也就是直接将
类数组对象是JS中一种特殊的对象,书写形式类似对象,可以通过索引访问元素,拥有length属性,但是没有数组身上的属性和方法。类数组的使用目的在于使得一个对象既有数组的特性也具有对象的特性。类数组对象可以通过 call 或 apply方法来间接调用数组的方法。函数体中的 arguments对象就是一个类数组对象。
(1)通过 call 调用数组的 slice 方法来实现转换
Array.prototype.slice.call(arrLike,0)
(2)通过call函数调用数组的splice方法来实现转换
Array.prototype.splice.call(arrLike,0)
(3)通过 apply 调用数组的 concat 方法来实现转换
Array.protptype.concat.apply([],arrLike)
(4)通过 Array.from 方法来实现转换
Array.from(arrLike)
(1)转换为字符串:toString()、toLocalString()、join()
(2)操作数组尾部:push()、pop()
(3)操作数组头部:shift()、unshift()
(4)排序:reverse() 、sort()
(5)数组连接:concat()
(6)数组截取:slice(),不影响原数组
(7)数组插入:splice(),影响原数组
(8)查找特定项索引:indexOf()
(9)遍历数组:map()、forEach()、some()、every()、filter()
(10)数组并归:reduce()、reduceRight()
unicode是ASCII码的超集,是一个字符集,也叫万国码、统一码
UTF-8、UTF-16、UTF-32等则是一种编码方式