js 多维数组(数独)扁平化
[1, 2, 3, [4, 5, 6, [7, 8], 9], 10] => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] reduce + concat123456function flattenDeep(arr) { return arr.reduce((acc, curr) => Array.isArray(curr) ? acc.concat(flattenDeep(curr)) : acc.concat(curr), [])}let a = [1, 2, 3, [4, 5, 6, [7, 8], 9], 10]console.log(flattenDeep(a)) toString123456function flattenDeep(arr) { return arr.toString().split(",").map(item => Number(item))}let a = [1, 2, 3, [4, 5, 6, [7, 8], 9],...
JS 原型链继承问题拓展
原型链继承存在的问题: 包含引用类型的原型属性会被所有实例共享,这会导致对一个实例的修改会影响到另一个实例。在通过原型来实现继承时,原型实际上会变成另一个类型的实例。原先的实例属性就变成了现在的原型属性 在创建了类型的实例时,不能向超类型的构造函数中传递参数 12345678910111213141516171819function SuperType () { this.citys = ['北京', '上海', '深圳'];}function SubType () { this.name = 'sub';}SubType.prototype = new SuperType();var instance1 = new SubType();instance1.citys.push('阿斯加德'); console.log(instance1.citys) // ["北京", "上海",...
精选20道面试题
1. new 的实现原理 新建一个空对象 let newObj = {} 修改对象的原型: 把新对象的 __proto__ 指向构造函数的 prototype 属性 改变 this 指向,并执行 返回对象里边的内容原来构造函数里边的内容 12345678function _new () { let obj = {}; // 取第一个参数,第一参娄就是构造函数 let [Constructor, ...args] = [...arguments]; obj.__proto__ = Constructor.prototype; let result = Constructor.apply(obj, args); return result === 'object' ? result : obj;} 2. 如何正确判断一 this 指向分析好上下文:谁调用指向谁 分四种情况:new, 显示,隐式,默认 参考这里: this指向 3. 深拷贝和浅拷贝的区别是什么?...
js Promise / Generator / await async
Promise 是用来解决函数回调嵌套的, async、await 是用来解决逻辑上的函数依赖的。 Promise是一个有状态的对象,用来规范回调函数,内容是一个function(function Promise() { [native code] }),内部接收一个function,参数为resolve,reject,用于处理耗时操作的等待。 12345678910111213let promise = new Promise(function(resolve,reject){ if (condition){ resolve(...); } else { reject(...); }});promise.then((result) => {}).catch((err) =>{}) 三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败) 处理成功,调用resolve方法,状态会从...
浏览器 地址栏回车 性能优化
Enter1. 输入地址比如: didiorg.com/ 2. DNS(Domain Name System,)解析:浏览器查找域名的 IP 地址本地 hosts 文件 => 本地 DNS 服务器 => DNS 根服务器本地 DNS 服务器 => com 域服务器本地 DNS 服务器 => 域名解析服务器 这个过程很有意思,本地 DNS 服务器访问根服务器,当根胳没有的时候,并不是根服务器去访问 com 域服务器,这个时候,DNS 根服务器只会告诉 本地 DNS 服务器他没有, 叫他再去访问 com 域服务器。 更有意思的是, 当本地 DNS 服务器访问 com 域服务器的时候,com 域服务器也不会直接给 本地 DNS 服务器 一个 IP 地址, 而是告诉本地 DNS 服务器想要查找的那个域名的域名解析服务器的地址 然后, 本地 DNS 服务器通过刚才拿到的址, 再去访问域名解析服务器,从那里拿到 IP 地址。 3. 浏览器向服务器发 http 请求拿到 ip 后,浏览器会向服务器80端口发起...
JS this
有关于this ,我们说得最多的一句话就是谁调用,指向谁;也就是 this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象 其实, 在我们 JS 里边,要想真的理解 this ,只知道上边这一句话是完全不行的,我们可以从以下几个方面学习跟理解 this : 从 this 绑定层面去理解:默认绑定,隐式绑定,显式绑定,new 绑定 从函数的运行环境层面去理解: this, 内存, 函数,环境变量 能过实际代码的上下文去理解 默认绑定先看一个例子: 12345678var name = "global"function foo () { var name = "foo" console.log(this.name);}foo(); // global 很显然, foo 函数执行的时候,所在的环境是 window, 所以 this.name 就是 window 的 name...
JS typeof instanceof 你应该知道这么多
typeof主要是用来判断一个变量的类型 几个特殊的情况记一下: 123456typeof null // objecttypeof {} // objecttypeof [] // objecttypeof Object // functiontypeof Function // functiontypeof undefined // undefined 看到上边 typeof Object 的结果是 function 这里其实因为 Object 是一个构造函数, 而不是一个真正的对象, 只有实例化之后才会给出 object的结果 可以看一下下边代码: 1234console.log(typeof Object); // functionlet ahui = new Object();console.log(typeof ahui); // object 再看到上边: typeof null typeof {} typeof [] 结果都是 object, 很显然, 我们是不能通过 typeof...
JS 函数实参转换为数组
实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组。 0: […arguments]这个方法其实是用来代替下边方法一的 一:通过 Array.prototype属性调用 slice 方法1const args = Array.prototype.slice.call(arguments) Array 本身是没有 slice 方法,它的方法在 Array.prototype中,而我们在调用 slice 方法的时候,如果在 Array 本身没有找到 slice 方法的话,会通过它的原型链往上查找。 二. 通过调用[]的slice方法1const args = [].sclice.call(arguments, 0) 注意这里是[], 不是 Array,为什么呢? 先看下边 12345typeof []; // objecttypeof Array; // Funcion[].__proto__ === Array.prototype;...
JS new 一个对象的过程
首先让我回忆一下创建对象的三种方法 单休模式 1234567891011const Person = { name: "angelee", sayname: function() { return this.name; }}let ahui = Object.create(Person);ahui.name = "ahui"console.log(ahui.sayname()) // ahui 构造函数 123456789const Person = function (name) { this.name = name;}Person.prototype.sayname = function () { return this.name;}let ahui = new Person("ahui");console.log(ahui.sayname()); // ahui ES6...