JSON的两种结构 对象结构 JSON对象保存在大括号中。可以存在多个关键字/值对。 其中关键字是字符串,而值可以是字符串、数值、true、false、null、对象或数组。...图片 遍历属性的值 在 for-in循环对象的属性时,使用中括号来访问属性的值。...语法 var obj = JSON.parse(str[, reviver]); str为必须,一个有效的JSON字符串。 reviver 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。...replacer为可选,用于转换结果的函数或数组。 如果replacer为函数,则JSON.stringify将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。...如果此函数返回 undefined,则排除成员 如果replacer是一个数组,会遍历数组的值,以数组的值作为value的属性。如果value原本包含该属性,那么显示该属性,如果不包含则不显示。
当 Webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有模块打包成一个或多个 bundle。...(5)完成模块编译并输出 递归完后,得到每个文件结果,包含每个模块以及他们之间的依赖关系,根据 entry 配置生成代码块 chunk 。 (6)输出完成 输出所有的 chunk 到文件系统。...函数调用的参数,递归去遍历所有子节点的文件,并将结果都保存在依赖图谱 queue 中。...image.png 这个依赖图谱,包含了所有文件模块的依赖,以及模块的代码内容。下一步只要实现 bundle() 函数,将结果输出即可。 4....在 bundle() 函数中,接收一个依赖图谱 graph 作为参数,最后输出编译后的结果。
:1111 window对象1111 obj对象window对象解析:o(),o是在全局执行的,而f1是箭头函数,它是没有绑定this的,它的this指向其父级的this,其父级say方法的this指向的是全局作用域...因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘。将DOM的多个读操作(或者写操作)放在一起,而不是读写操作穿插着写。这得益于浏览器的渲染队列机制。...如果函数返回一个对象,那么new 这个函数调用返回这个函数的返回对象,否则返回 new 创建的新对象组件之间的传值有几种方式1、父传子2、子传父3、eventbus4、ref/$refs5、$parent...[i] = obj[i]; } return cloneObj;}深克隆:考虑基础类型引用类型RegExp、Date、函数 不是 JSON 安全的会丢失 constructor,所有的构造函数都指向...由于 split 分割后形成的数组的每一项值为字符串,所以需要用一个map方法遍历数组将其每一项转换为数值型。
(debounce)防抖函数原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。...注意:如果目标对象和源对象有同名属性,或者多个源对象有同名属性,则后面的属性会覆盖前面的属性。如果该函数只有一个参数,当参数为对象时,直接返回该对象;当参数不是对象时,会先将参数转为对象然后返回。...[Prototype](也就是proto)链接它使this指向新创建的对象通过new创建的每个对象将最终被[Prototype]链接到这个函数的prototype对象上如果函数没有返回对象类型Object...(json); // 把文件的结果放在exports属性上 }}// tryModuleLoad函数接收的是模块对象,通过path.extname来获取模块的后缀名,然后使用Module....每个普通函数都是Function的实例,而箭头函数不是任何类的实例,每次调用都是不一样的引用。那我们只需要处理普通函数的情况,箭头函数直接返回它本身就好了。那么如何来区分两者呢?答案是: 利用原型。
在输入 JavaScript 程序代码后,将文件保存为*.html文件,而不是.js*文件。在 Web 浏览器中打开它们以查看结果。任何现代 Web 浏览器都可以用于此目的。 一、什么是递归?...如果您需要在程序中的三个不同位置运行相同的指令,而不是将源代码复制粘贴三次,您可以在函数中编写一次代码并调用函数三次。有益的结果是更短和更易读的程序。...为c()调用创建一个新的帧对象并将其放置在调用堆栈上,其中包含c()的局部spam变量 ❻。随着这些函数的返回,帧对象从调用堆栈中弹出。程序执行知道要返回到哪里,因为返回信息存储在帧对象中。...图 2-1 跟踪了调用栈的状态,帧对象被推送(当递归函数调用时发生)和帧对象被弹出(当递归函数调用返回时)。注意乘法发生在递归调用之后,而不是之前。...sum()函数的返回值也是一个单一的数字值,而不是一个数字数组;这就是为什么我们可以在递归情况中将head和sum(tail)相加❹。
JSON 要求有两头的 { } 来使其合法。最安全的写法是有两边的括号,而不是一边。 甚至一个错位的逗号或分号就可以导致 JSON 文件出错。...使用 reviver 函数 如果指定了 reviver 函数,则解析出的 JavaScript 值(解析值)会经过一次转换后才将被最终返回(返回值)。...更具体点讲就是:解析值本身以及它所包含的所有属性,会按照一定的顺序(从最最里层的属性开始,一级级往外,最终到达顶层,也就是解析值本身)分别的去调用 reviver 函数,在调用过程中,当前属性所属的对象会作为...replacer 可选 如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中...使用 JSON.stringify 结合 localStorage 的例子 一些时候,你想存储用户创建的一个对象,并且,即使在浏览器被关闭后仍能恢复该对象。
我们希望在改变新的数组(对象)的时候,不改变原数组(对象) 深拷贝的要求程度 我们在使用深拷贝的时候,一定要弄清楚我们对深拷贝的要求程度:是仅“深”拷贝第一层级的对象属性或数组元素,还是递归拷贝所有层级的对象属性和数组元素...() 方法用于将一个 JSON 字符串转换为对象–(反序列化) JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串–(序列化) 序列化的缺点:...不支持基本数据类型的undefined,序列化后将其省略 不支持函数 Nan,Infinity序列化的结果是null 能用大招杀的就不要用q杀嘛!!...for… in特点 遍历对象返回的对象的key值,遍历数组返回的数组的下标(key)。...for… of特点 for of遍历的只是数组内的元素,而不包括数组的原型属性method和索引name for … in 会遍历原型上的属性值 遍历返回数据是乱序 for of 不同与
首先了解一些javascript的基本知识。 【1】javascript变量包含两种不同数据类型的值:基本类型和引用类型。...与其他语言不同,JavaScript 不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。 在操作对象时, 实际上是在操作对象的引用而不是实际的对象。...,如果对象内还有对象,则只能复制嵌套对象的地址,无法进行深层次的拷贝,当改变obj2嵌套对象c的值后,obj1嵌套对象c的值也跟着变了 这个时候我们可以使用深拷贝来完成,所谓深拷贝,就是能够实现真正意义上的数组和对象的拷贝...数组的浅拷贝 如果是数组,我们可以利用数组的一些方法比如:slice、concat 返回一个新数组的特性来实现拷贝。...(newArr); // {a: "one"} // 函数没有复制成功复制代码 对象的浅拷贝 Object.assign()方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。
如果纯用 Vue,体积还会更小巧图片垃圾回收对于在JavaScript中的字符串,对象,数组是没有固定大小的,只有当对他们进行动态分配存储时,解释器就会分配内存来存储这些数据,当JavaScript的解释器消耗完系统中所有可用的内存时...域名分片顾名思义,我们可以在一个域名下分出多个二级域名出来,而它们最终指向的还是同一个服务器,这样子的话就可以并发处理的任务队列更多,也更好的解决了队头阻塞的问题。...源代码经过webpack处理之后的最终产物。loader:模块转换器。本质就是一个函数,在该函数中对接收到的内容进行转换,返回转换后的结果。...每一个入口点都是一个块组(chunk group),在不考虑分包的情况下,一个 chunk group 中只有一个 chunk,该 chunk 包含递归分析后的所有模块。...完成模块编译:经过第 4 步使用 loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容以及它们之间的依赖关系。
--nul-output/ -0: 像-r,但 jq 将在每次输出后打印 NUL 而不是换行符。当输出的值可以包含换行符时,这可能很有用。...[index]语法,但完全省略索引,它将返回数组的所有元素。.[]使用输入运行[1,2,3]将产生三个单独的结果,而不是单个数组。 您也可以在对象上使用它,它将返回对象的所有值。 .[]?...数组构造:[] 在 JSON 中,[]用于构造数组,如在 [1,2,3]. 数组的元素可以是任何 jq 表达式,包括管道。所有表达式产生的所有结果都收集到一个大数组中。...如果输入已排序并包含 x,则 bsearch(x) 将返回其在数组中的索引;否则,如果数组已排序,它将返回 (-1 - ix),其中 ix 是一个插入点,因此在将 x 插入到 ix 后,该数组仍将被排序...流式操作 使用--stream选项 jq 可以以流方式解析输入文本,允许 jq 程序立即开始处理大型 JSON 文本,而不是在解析完成后。
a 是否被包含在字符串 b 中,并返回第一次出现的位置(找不到返回 -1)。...也就是我在调用很多次后,他们的结果会存在add函数中的sum变量上,当我alert的时候 add会自动调用 toString方法 打印出 sum, 也就是最终的结果 验证是否是邮箱 function isEmail...完成后,调用其 resolve 变更状态,在这个 resolve 里会依次调用 callbacks 里的回调,这样就执行了 then 里的方法了 启后:上一步中,当 then 里的方法执行完成后,返回一个结果...); 局限性: 他无法实现对函数 、RegExp等特殊对象的克隆 会抛弃对象的constructor,所有的构造函数会指向Object 对象有循环引用,会报错 面试版: /** * deep clone...(json); // 把文件的结果放在exports属性上 } } // tryModuleLoad函数接收的是模块对象,通过path.extname来获取模块的后缀名,然后使用Module.
上述流程看完后可能一脸懵逼,不过没事,请保持头脑清醒,先有个整个流程的印象,接下来我们开始阅读代码: 3.2 入口方法 首先定义一个入口方法 compiler ,接收原始代码字符串作为参数,返回最终 JavaScript...ast return ast; } 3.4 转换阶段 在转换阶段中,定义了转换器 transformer 函数,使用词法分析器返回的 LISP 的 AST 对象作为参数,将 AST 对象转换成一个新的...「编译模块」 递归中根据「文件类型」和 「loader 配置」,调用所有配置的 loader 对文件进行转换,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理。...「完成模块编译并输出」 递归完事后,得到每个文件结果,包含每个模块以及他们之间的依赖关系,根据 entry 配置生成代码块 chunk 。 「输出完成」 输出所有的 chunk 到文件系统。...注意:在构建生命周期中有一系列插件在做合适的时机做合适事情,比如 UglifyPlugin 会在 loader 转换递归完对结果使用 UglifyJs 压缩「覆盖之前的结果」。
引用数据类型(按照是否可以继续遍历再分为两种): 可继续遍历的类型:包括对象字面量、数组、类数组对象、Set、Map。需要丢失的属性,在遍历时跳过即可。...用一个函数集中进行处理 此外,在遍历数组或对象的时候,还需要检测是否存在循环引用的情况,若存在需要抛出相应的错误 数据类型判断 用 getType 获取具体的数据类型。...比如说 {a:"bbb"} ,我们期望的序列化结果应该是 '{a:"bbb"}',而不是 '{a:bbb}';同理,对于 Date 对象,直接返回它的 toJSON() 会得到 '{date: 1995...JSON.stringify 的实现中,遍历 key 的过程已经在主代码完成了,所以这里的 checkCircular 只需要包含检测过程。...属性丢失其实就是在遍历对象的时候略过这些属性 在检测循环引用的时候,存在嵌套关系的对象应该共享同一条父级链,所以递归的时候需要把存放父级链的数组传进去;同时,不存在嵌套关系的两个对象不应该共享同一条父级链
obj 的构造函数,用于创建一个和原对象同类型的实例 这里遍历对象或者数组有三种方式,第一种是使用 Reflect.ownKeys() 获取自身所有属性(无论是否可以枚举),第二种是使用 for……in...根据初始传入的 target 是一个对象字面量还是数组,决定最终返回的 cloneTarget 是对象还是数组。...而深拷贝的过程中因为用到了递归,无限嵌套的对象就会导致无限的递归,不断地压栈最终会导致堆栈溢出。 如何解决循环引用带来的爆栈问题呢?其实也很简单,只需要给递归创建一个出口即可。...它们都属于可以继续遍历的、可能存在嵌套的引用类型,因此在处理的时候就需要递归 不能继续遍历的引用数据类型:包括函数、错误对象、日期对象、正则对象、基本类型的包装对象(String、Boolean、Symbol...之前深拷贝对象字面量或者数组的时候,首先会将最终返回的结果 cloneTarget 初始化为 [] 或者 {}。
1.如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式,而不是对象的形式2.如果obj里有RegExp(正则表达式的缩写)、Error对象,则序列化的结果将只得到空对象...常见的类数组对象有 arguments 和 DOM 方法的返回结果,函数参数也可以被看作是类数组对象,因为它含有 length属性值,代表可接收的参数个数。...迭代查询与递归查询实际上,DNS解析是一个包含迭代查询和递归查询的过程。递归查询指的是查询请求发出后,域名服务器代为向下一级域名服务器发出请求,最后向用户返回查询的最终结果。...一般我们向本地 DNS 服务器发送请求的方式就是递归查询,因为我们只需要发出一次请求,然后本地 DNS 服务器返回给我 们最终的请求结果。...[i] = obj[i]; } return cloneObj;}深克隆:考虑基础类型引用类型RegExp、Date、函数 不是 JSON 安全的会丢失 constructor,所有的构造函数都指向
0x03 原型链污染 在JavaScript发展历史上,很少有真正的私有属性,类的所有属性都允许被公开的访问和修改,包括proto,构造函数和原型。...调用split()函数对key值"__proto__.polluted" 按"."进行分割, newkeys返回key的分割后的数组["__proto__", "polluted"]。 ?...函数定义在src/core.js文件的第125行。...这一段循环代码的执行逻辑大致如下:按属性数组中元素的顺序,依次获取对象原有的属性值,并进行赋值;如果该属性不是数组的最后一个元素,那赋值为对象本身,或空数组,或{}。...如果是数组的最后一个元素,就将该属性赋值为我们期望的value。 在POC中,第一次循环对proto属性尝试赋值,执行结果如下: ?
(JSON.stringify(oldObj)); 局限性: 他无法实现对函数 、RegExp等特殊对象的克隆 会抛弃对象的constructor,所有的构造函数会指向Object 对象有循环引用,会报错...拷贝特殊对象 可继续遍历 对于特殊的对象,我们使用以下方式来鉴别: Object.prototype.toString.call(obj); 梳理一下对于可遍历对象会有什么结果: ["object Map...每个普通函数都是 Function的实例,而箭头函数不是任何类的实例,每次调用都是不一样的引用。那我们只需要 处理普通函数的情况,箭头函数直接返回它本身就好了。 那么如何来区分两者呢?...某个文件时,就将这个文件拿出来执行,如果这个文件里面存在module.exports,当运行到这行代码时将 module.exports 的值加入这个对象,键为对应的文件名,最终这个对象就长这样: {...(json); // 把文件的结果放在exports属性上 } } // tryModuleLoad函数接收的是模块对象,通过path.extname来获取模块的后缀名,然后使用Module.
find 会遍历所有的元素,执行你给定的带有条件返回值的函数符合该条件的元素会作为 find 方法的返回值如果遍历结束还没有符合该条件的元素,则返回 undefinedvar users = [ {id...(json); // 把文件的结果放在exports属性上 }}// tryModuleLoad函数接收的是模块对象,通过path.extname来获取模块的后缀名,然后使用Module....原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。函数节流 :使得一定时间内只触发一次函数。...原理是通过判断是否到达一定时间来触发函数。Object.assignObject.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。...,等于返回的temp函数不被执行而是打印,了解JS的朋友都知道对象的toString是修改对象转换字符串的方法,因此代码中temp函数的toString函数return m值,而m值是最后一步执行函数时的值
ES5 实现数组的 some 方法 ? 执行 some 方法的数组如果是一个空数组,最终始终会返回 false,而另一个数组的 every 方法中的数组如果是一个空数组,会始终返回 true 7....柯里化是函数式编程的一个重要技巧,将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术 函数式编程另一个重要的函数 compose,能够将函数进行组合,而组合的函数只接受一个参数,所以如果有接受多个函数的需求并且需要用到...函数的 bind 方法核心是利用 call,同时考虑了一些其他情况,例如 bind 返回的函数被 new 调用作为构造函数时,绑定的值会失效并且改为 new 指定的对象 定义了绑定后函数的 length...关键字处,最终就会形成每当一个 promise 被解析成功就会解析下个 promise,当全部解析成功后打印所有解析的结果,衍变为现在用的最多的 async/await 语法 17....原理是递归遍历 right 参数的原型链,每次和 left 参数作比较,遍历到原型链终点时则返回 false,找到则返回 true 23. 私有变量的实现 ?
因为 JSON 语法是基于 JavaScript 的,很容易将 JSON 和 JavaScript 中的对象弄混,但是应该注意 JSON 和 JavaScript 中的对象不是一回事,JSON 中对象格式更加严格...(数组、对象等)并且返回各项的值,和 ES3 中的 for...in 的区别: for...of 遍历获取的是对象的键值,而 for...in 遍历获取的是对象的键名; for...of 只遍历当前对象不会遍历原型链...,for...in 会遍历对象的整个原型链,性能非常差,不推荐使用; 对于数组的遍历,for...in 会返回数组中所有可以枚举的属性(包括原型链上可枚举的属性),for...of 只返回数组的下标对应的属性值...在 JavaScript 中使用构造函数来新建一个对象的,每一个构造函数内部都有一个 prototype 属性,属性值是一个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。...原型链上的所有原型都是对象,所有的对象最终都是由 Object 构造的,而 Object.prototype 的再上一层是 Object.prototype.__proto__。
领取专属 10元无门槛券
手把手带您无忧上云