当前位置: 网站首页>小程序开发>小程序制作

梁山微信公众号开发【梁山网络推广】梁山建站、梁山网站维护、梁山网页制作、梁山微信小程序代运营公司

发表日期: 2021-05-20 10:43:28 浏览次数:87

梁山微信公众号开发【梁山网络推广】梁山建站、梁山网站维护、梁山网页制作、梁山微信小程序代运营公司

网站建设.jpg

梁山县位于鲁西南,处于山东省的泰安、济宁、菏泽和河南省的濮阳四地市交界处。

梁山建县于1949年8月,下辖13个乡镇、1个省级经济开发区、1个风景名胜区,672个行政村,77.6万人,地域面积964平方千米。

梁山县是古典名著《水浒传》故事发祥地,是全国首批命名的武术之乡, [1]  亦是中国专用汽车生产基地, [2]  2016年,地区生产总值(GDP)265.04亿元。


 23. 取数组的最大值(ES5、ES6)

// ES5 的写法
Math.max.apply(null, [14, 3, 77, 30]);

// ES6 的写法
Math.max(...[14, 3, 77, 30]);

// reduce
[14,3,77,30].reduce((accumulator, currentValue)=>{
    return accumulator = accumulator > currentValue ? accumulator : currentValue
});

 24.ES6 新的特性有哪些?

1. 新增了块级作用域 (let,const)

2. 提供了定义类的语法糖 (class)

3. 新增了一种基本数据类型 (Symbol)

4. 新增了变量的解构赋值

5. 函数参数允许设置默认值,引入了 rest 参数,新增了箭头函数

6. 数组新增了一些 API,如 isArray / from / of 方法 ; 数组实例新增了 entries(),keys() 和 values() 等方法

7. 对象和数组新增了扩展运算符

8.ES6 新增了模块化 (import/export)

9.ES6 新增了 Set 和 Map 数据结构

10.ES6 原生提供 Proxy 构造函数,用来生成 Proxy 实例

11.ES6 新增了生成器 (Generator) 和遍历器 (Iterator)

 25.setTimeout 倒计时为什么会出现误差?

setTimeout() 只是将事件插入了“任务队列”,必须等当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。要是当前代码消耗时间很长,也有可能要等很久,所以并没办法保证回调函数一定会在 setTimeout() 指定的时间执行。所以, setTimeout() 的第二个参数表示的是最少时间,并非是确切时间。

HTML5 标准规定了 setTimeout() 的第二个参数的最小值不得小于 4 毫秒,如果低于这个值,则默认是 4 毫秒。在此之前。老版本的浏览器都将最短时间设为 10 毫秒。另外,对于那些 DOM 的变动(尤其是涉及页面重新渲染的部分),通常是间隔 16 毫秒执行。这时使用 requestAnimationFrame() 的效果要好于 setTimeout()。

 26. 为什么 0.1 + 0.2 != 0.3 ?

0.1 + 0.2 != 0.3 是因为在进制转换和进阶运算的过程中出现精度损失。

下面是详细解释:

JavaScript 使用 Number 类型表示数字 (整数和浮点数),使用 64 位表示一个数字。

图片说明:

  • 第 0 位:符号位,0 表示正数,1 表示负数 (s);

  • 第 1 位到第 11 位:储存指数部分(e);

  • 第 12 位到第 63 位:储存小数部分(即有效数字)f;

计算机无法直接对十进制的数字进行运算, 需要先对照 IEEE 754 规范转换成二进制,然后对阶运算。

 1. 进制转换

0.1 和 0.2 转换成二进制后会无限循环

0.1 -> 0.0001100110011001...(无限循环)
0.2 -> 0.0011001100110011...(无限循环)

但是由于 IEEE 754 尾数位数限制,需要将后面多余的位截掉,这样在进制之间的转换中精度已经损失。

 2. 对阶运算

由于指数位数不相同,运算时需要对阶运算 这部分也可能产生精度损失。

按照上面两步运算(包括两步的精度损失),最后的结果是

0.0100110011001100110011001100110011001100110011001100

结果转换成十进制之后就是 0.30000000000000004。

 27.promise 有几种状态, Promise 有什么优缺点 ?

promise 有三种状态: fulfilled, rejected, pending。

 Promise 的优点

1 . 一旦状态改变,就不会再变,任何时候都可以得到这个结果;

2 . 可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。

 Promise 的缺点

1. 无法取消 Promise;

2. 当处于 pending 状态时,无法得知目前进展到哪一个阶段。

 28.Promise 构造函数是同步还是异步执行,then 呢 ?promise 如何实现 then 处理 ?

Promise 的构造函数是同步执行的。then 是异步执行的。

promise 的 then 实现,详见: Promise 源码实现:

https://juejin.im/post/5c88e427f265da2d8d6a1c84

 29.Promise 和 setTimeout 的区别 ?

Promise 是微任务,setTimeout 是宏任务,同一个事件循环中,promise.then 总是先于 setTimeout 执行。同一个事件循环中,promise.then 先于 setTimeout 执行。

 30. 如何实现 Promise.all ?

要实现 Promise.all, 首先我们需要知道 Promise.all 的功能:

1. 如果传入的参数是一个空的可迭代对象,那么此 promise 对象回调完成 (resolve), 只有此情况,是同步执行的,其它都是异步返回的;

2. 如果传入的参数不包含任何 promise,则返回一个异步完成.promises 中所有的 promise 都“完成”时或参数中不包含 promise 时回调完成;

3. 如果参数中有一个 promise 失败,那么 Promise.all 返回的 promise 对象失败;

4. 在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组。

Promise.all = function (promises) {
    return new Promise((resolve, reject) => {
        let index = 0;
        let result = [];
        if (promises.length === 0) {
            resolve(result);
        } else {
            setTimeout(() => {
                function processValue(i, data) {
                    result[i] = data;
                    if (++index === promises.length) {
                        resolve(result);
                    }
                }
                for (let i = 0; i < promises.length; i++) {
                    //promises[i] 可能是普通值
                    Promise.resolve(promises[i]).then((data) => {
                        processValue(i, data);
                    }, (err) => {
                        reject(err);
                        return;
                    });
                }
            })
        }
    });
}

如果想了解更多 Promise 的源码实现,可以参考我的另一篇文章:Promise 的源码实现(完美符合 Promise/A+ 规范):

https://juejin.im/post/5c88e427f265da2d8d6a1c84#heading-24

 31. 如何实现 Promise.finally ?

不管成功还是失败,都会走到 finally 中, 并且 finally 之后,还可以继续 then。并且会将值原封不动的传递给后面的 then。

Promise.prototype.finally = function (callback) {
    return this.then((value) => {
        return Promise.resolve(callback()).then(() => {
            return value;
        });
    }, (err) => {
        return Promise.resolve(callback()).then(() => {
            throw err;
        });
    });
}

 32. 什么是函数柯里化?实现 sum(1)(2)(3) 返回结果是 1,2,3 之和

函数柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

function sum(a) {
    return function(b) {
        return function(c) {
            return a+b+c;
        }
    }
}
console.log(sum(1)(2)(3)); // 6

引申:实现一个 curry 函数,将普通函数进行柯里化:

function curry(fn, args = []) {
    return function(){
        let rest = [...args, ...arguments];
        if (rest.length < fn.length) {
            return curry.call(this,fn,rest);
        }else{
            return fn.apply(this,rest);
        }
    }
}
//test
function sum(a,b,c) {
    return a+b+c;
}
let sumFn = curry(sum);
console.log(sumFn(1)(2)(3)); //6
console.log(sumFn(1)(2, 3)); //6


梁山微信公众号开发梁山网络推广梁山建站、梁山网站维护、梁山网页制作、梁山微信小程序代运营公司

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: http://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878