,需要是一个对象,该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符 「实现」 function createObject(proto...['object', 'function'].includes(typeof proto)) { throw new TypeError("proto必须为对象或者函数"); } function...== 'function') { throw new TypeError('第一个参数不是构造函数'); } // 新建一个空对象,对象的原型为构造函数的 prototype 对象...== 'function') { throw new TypeError('fn 不是一个函数'); } // 确定回调函数的 this 指向 let context = thisArg...== 'function') { throw new TypeError('fn 不是一个函数'); } // 确定回调函数的 this 指向 let context = thisArg
__proto__ === p.constructor.prototype) // false复制代码可以看到修改原型的时候p的构造函数不是指向Person了,因为直接给Person的原型对象直接用对象赋值时...== "function") { throw new TypeError(callback + 'is not a function'); } // 创建一个新的 Object...== "function") { throw new TypeError(callback + 'is not a function'); } const O = Object...== "function") { throw new TypeError(callback + 'is not a function'); } const O = Object...但这还不是问题的关键,模板字符串的关键优势有两个:在模板字符串中,空格、缩进、换行都会被保留模板字符串完全支持“运算”式的表达式,可以在${}里完成一些计算基于第一点,可以在模板字符串里无障碍地直接写
== "function") { throw new TypeError(callback + ' is not a function'); } const O = Object(this);...== 'function') { throw new TypeError('Type Error'); } const fn = Symbol('fn'); context[fn] = this...== 'function') { // 非标准 但与Chrome谷歌保持一致 throw TypeError('Promise resolver ' + executor + ' is...function curry(fn, args) { // 获取函数需要的参数长度 let length = fn.length; args = args || []; return function...拼接得到现有的所有参数 for (let i = 0; i < arguments.length; i++) { subArgs.push(arguments[i]); } // 判断参数的长度是否已经满足函数所需参数的长度
冒泡排序--时间复杂度 n^2题目描述:实现一个冒泡排序实现代码如下:function bubbleSort(arr) { // 缓存数组长度 const len = arr.length; //...需要注意的是,立即resolve()的 Promise 对象,是在本轮“事件循环”(event loop)的结束时执行,而不是在下一轮“事件循环”的开始时。...③Promise 与回调对比解决了回调地狱的问题,将异步操作以同步操作的流程表达出来。...== "function") { throw new TypeError(callback + 'is not a function'); } // 创建一个新的 Object...(事件总线)描述:实现一个发布订阅模式,拥有 on, emit, once, off 方法class EventEmitter { constructor() { // 包含所有监听器函数的容器对象
Rx不是允诺,它本质上还是由订阅发布模式印出来的,核心思想就是数据响应式。...observable被订阅后并不是返回新的observable,而是返回一个subsciber,这样可以取消订阅,但是也导致了链式断裂,所以不能像Promise一样组成无线then链。...then: function(resolve) { throw new TypeError("Throwing"); resolve("Resolving"); } }; var p2...TypeError: Throwing }); // Thenable在callback之后抛出异常 // Promise resolves var thenable = { then: function...另外,如果 await 操作符后的表达式的值不是一个 Promise,则返回该值本身。 或者可以这样简单理解 await只能在async function中使用。
需要注意的是,立即resolve()的 Promise 对象,是在本轮“事件循环”(event loop)的结束时执行,而不是在下一轮“事件循环”的开始时。...其实也不是,回到闭包的本质,我们只需要让父级作用域的引用存在即可,因此还可以这么改代码,如下所示var fun3;function fun1() { var a = 2 fun3 = function...如何解决循环输出问题?...⽽不是定位?...(module.exports 属性),该对象只有在脚本运行完才会生成ES6 Module :模块输出的是一个值的引用,编译时输出接口,ES6模块不是对象,它对外接口只是一种静态定义,在代码静态解析阶段就会生成
== null && (typeof x === 'object' || typeof x === 'function')) { // x不是普通值,对象或者方法...== null && (typeof x === 'object' || typeof x === 'function')) { // x不是普通值,对象或者方法...promise,也不是thenable对象,啥也不是就直接resolve吧 resolve(x) }...== null && (typeof x === 'object' || typeof x === 'function')) { // x不是普通值,对象或者方法...promise,也不是thenable对象,啥也不是就直接resolve吧 resolve(x) }
_addListener(target, type, listener, prepend) { var m; var events; var existing; // 若监听器不是函数对象...== 'function') { const errors = lazyErrors(); throw new errors.TypeError('ERR_INVALID_ARG_TYPE...events, position, i, originalListener; // 若监听器不是函数对象,则抛出异常 if (typeof listener !...== 'function') { const errors = lazyErrors(); throw new errors.TypeError('ERR_INVALID_ARG_TYPE...== 'function') { const errors = lazyErrors(); throw new errors.TypeError('ERR_INVALID_ARG_TYPE
1.4 Promise Promise 是异步编程的一种解决方案,是为解决回调函数地狱这个问题而提出的,它不是新的语法功能,而是一种新的写法,允许将回调函数的嵌套改为链式调用。...缺点:Promise 的最大问题是代码冗余,原来的任务被 Promise 包装了一下,不管什么操作,一眼看去都是一堆then,原来的语义变得很不清楚。...resolvePromise(promise, x, resolve, reject) { // PromiseA+ 2.3.1 如果promise和x引用同一对象,会以TypeError错误...used = true; reject(e); } } else { // PromiseA+ 2.3.4 如果x不是一个对象或函数...then方法的对象,或根本就不是对象,Promise.resolve方法返回一个新的 Promise 对象,状态为resolved。
// 将第一个参数转换为对象(不是对象转换为对象) const targetObj = Object(target); // 将源对象(source)自身的所有可枚举属性复制到目标对象...== null) { // 将源角色转换成对象 // 需要将源角色自身的可枚举属性(包含Symbol值的属性)进行复制 // Reflect.ownKeys...(obj) 返回一个数组,包含对象自身的所有属性,不管属性名是Symbol还是字符串,也不管是否可枚举 const keysArray = Reflect.ownKeys(Object...resolvePromise(promise, x, resolve, reject) { // PromiseA+ 2.3.1 如果promise和x引用同一对象,会以TypeError错误...then方法的对象,或根本就不是对象,Promise.resolve方法返回一个新的 Promise 对象,状态为resolved。
如果classinfo类型对象,不是一个类型对象或者由多个类型对象组成的元组,则会报错(TypeError)。...如果classinfo类型对象,不是一个类型对象或者由多个类型对象组成的元组,则会报错(TypeError)。 6.iter(object[,sentinel]) 函数功能返回一个可迭代对象。...可以传入一个可迭代对象,如字符串,字节数组、元组、列表、range对象,结果将返回可迭代对象中元素组成的列表。...10.map(function,iterable,...) 函数接受一个函数类型参数、一个或者多个可迭代对象参数,返回一个可迭代器,此迭代器中每个元素,均是函数参数实例调用可迭代对象后的结果。...当传入多个可迭代对象时,函数的参数必须提供足够多的参数,保证每个可迭代对象同一索引的值均能正确传入函数。 当传入多个可迭代对象时,且它们元素长度不一致时,生成的迭代器只到最短长度。
,可以采用发布订阅的方式解决 // 一个简易的方法订阅对象 let dep = { arr: [], emit () { this.arr.forEach((fn) => {...= {} const fs = require('fs') // 一个简易的方法订阅对象 let dep = { arr: [], emit () { this.arr.forEach...以上方法看似解决了上面提到的第三个问题多个异步操作,在同一时间内,同步异步的结果,但是随着需求的变动,需要再读取一个address文件,就需作如下变动: ... // 订阅 dep.on(() => {...] is not a function 以上代码地址 可得知对象是不能被迭代的,根据报错信息,我们再改进代码 let o = { 0: 1, 1: 2, 2: 3, length: 3, [Symbol.iterator...牛逼的TJ大神的CO库就对此做了很完善的处理,感兴趣的可前往仓库看看源码,只有200多行。
发布订阅模式题目描述:实现一个发布订阅模式拥有 on emit once off 方法实现代码如下:class EventEmitter { constructor() { this.events...== callBack; }); } // 只执行一次订阅事件 once(type, callBack) { function fn() { callBack();...== 'function') { throw new TypeError('Object prototype may only be an Object or null.')...eval 会存在安全问题,如果数据中可能不是 json 数据,而是可执行的 JavaScript 代码,那很可能会造成 XSS 攻击。...[] : {}; // for...in 只会遍历对象自身的和继承的可枚举的属性(不含 Symbol 属性) for(let key in obj) { // obj.hasOwnProperty
console.log(add(1)(2)(3)); // 62)柯里化解决方案参数长度固定var add = function (m) { var temp = function (n) {...参数长度不固定function add (...args) { //求和 return args.reduce((a, b) => a + b)}function currying (fn)...== 'function') { throw new TypeError(callbackfn + ' is not a function'); } const O = Object(this...深拷贝: 深拷贝相对浅拷贝而言,如果遇到属性值为引用类型的时候,它新建一个引用类型并将对应的值复制给它,因此对象获得的一个新的引用类型而不是一个原有类型的引用。...这个方法可以简单粗暴的实现深拷贝,但是还存在问题,拷贝的对象中如果有函数,undefined,symbol,当使用过JSON.stringify()进行处理之后,都会消失。
colors.length; i < len; i++) { console.log(colors[i]);} 看着很简单,但是再回顾这段代码,实际上我们仅仅是需要数组中元素的值,但是却需要提前获取数组长度...对象并不是 iterable(可遍历的)。...那什么才是可遍历的呢? 其实一种数据结构只要部署了 Iterator 接口,我们就称这种数据结构是“可遍历的”(iterable)。...== "function") throw new TypeError(result + " is not iterable"); if (typeof cb !...== "function") throw new TypeError("cb must be callable"); iterable = obj[Symbol.iterator]();
2、 TypeError: ‘undefined’ is not an object 这是在 Safari 中读取属性或调用未定义对象上的方法时发生的错误。...3、 TypeError: null is not an object 这是在 Safari 中读取属性或调用空对象上的方法时发生的错误。...; 执行上面的代码会导致以下错误: “Uncaught TypeError:this.clearBoard is not a function”。...8、 TypeError: Cannot read property ‘length’ 这是因为读取未定义变量的长度属性而发生的错误。 您可以在 Chrome 开发者控制台中进行测试。 ?...如果在使用 event 时遇到此错误,请确保使用传入的事件对象作为参数。像 IE 这样的旧浏览器提供了一个全局变量事件,但并不是所有浏览器都支持。
== 'function') { throw new TypeError(callback + ' is not a function'); } const res = []; // 同理...in O) { callback.call(thisArg, O[k], k, O); } k++; }}Object.assignObject.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象...注意:如果目标对象和源对象有同名属性,或者多个源对象有同名属性,则后面的属性会覆盖前面的属性。如果该函数只有一个参数,当参数为对象时,直接返回该对象;当参数不是对象时,会先将参数转为对象然后返回。...console.log(add(1)(2)(3)); // 62)柯里化解决方案参数长度固定var add = function (m) { var temp = function (n) {...参数长度不固定function add (...args) { //求和 return args.reduce((a, b) => a + b)}function currying (fn)
colors.length; i < len; i++) { console.log(colors[i]); } 看着很简单,但是再回顾这段代码,实际上我们仅仅是需要数组中元素的值,但是却需要提前获取数组长度...对象并不是 iterable(可遍历的)。...那什么才是可遍历的呢? 其实一种数据结构只要部署了 Iterator 接口,我们就称这种数据结构是“可遍历的”(iterable)。...== "function") throw new TypeError(result + " is not iterable"); if (typeof cb !...== "function") throw new TypeError("cb must be callable"); iterable = obj[Symbol.iterator]();
= 'function') throw new TypeError() if(len == 0 && arguments.length == 1) throw new TypeError()...= 'function') throw new TypeError() if(len == 0 && arguments.length == 1) throw new TypeError() 首先检测是否为...因为 reduce 不会处理稀疏数组,所以转换要转换成对象来处理。 数组长度用 len 来保存,这里使用了无符号位右移操作符 >>> ,确保 len 为非负整数。...接下来,检测回调函数 fun 是否为 function ,如果不是,抛出类型错误。 在数组为空,并且又没有提供初始值(即只有一个参数 fun)时,抛出类型错误。...如果 k 在对象 t 中存在时,则赋值给 accumulator 后 k 再自增,否则用 k 自增后再和 len 比较,如果超出 len 的长度,则报错,因为不存在下一个可以赋给 accumulator
TypeError: ‘undefined’ is not an object 这是在 Safari 中读取属性或调用未定义对象上的方法时发生的错误。...TypeError: null is not an object 这是在 Safari 中读取属性或调用空对象上的方法时发生的错误。...TypeError: Cannot read property ‘length’ 这是 Chrome 中发生的错误,因为读取未定义变量的长度属性。 您可以在 Chrome 开发者控制台中进行测试。...如果测试对象不存在,错误将会抛出 “Uncaught TypeErrorUncaught TypeError: Cannot set property”。 10....如果在使用事件处理系统时遇到此错误,请确保使用传入的事件对象作为参数。像 IE 这样的旧浏览器提供了一个全局变量事件,但并不是所有浏览器都支持。像 jQuery 这样的库试图规范化这种行为。
领取专属 10元无门槛券
手把手带您无忧上云