最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 热更-js重点第四日,了解总比不知道强......

    正文概述 掘金(掘黄金的打工人)   2020-12-10   463
    • 什么是函数式编程? JavaScript的哪些特性使其成为函数式语言的候选语言?
    • 什么是高阶函数?
    • 为什么函数被称为一等公民?
    • 手动实现Array.prototype.map方法
    • 手动实现Array.prototype.filter方法
    • 手动实现Array.prototype.reduce方法
    • arguments 的对象是什么?
    • 如何创建一个没有 prototype(原型) 的对象?
    • 为什么在调用这个函数时,代码中的b会变成一个全局变量?
    • ECMAScript是什么?

    31. 什么是函数式编程? JavaScript 的哪些特性使其成为函数式语言的候选语言?

    函数式编程(通常缩写为FP)是通过编写纯函数,避免共享状态、可变数据、副作用 来构建软件的过程。数式编程是声明式 的而不是命令式 的,应用程序的状态是通过纯函数流动的。与面向对象编程形成对比,面向对象中应用程序的状态通常与对象中的方法共享和共处。

    函数式编程是一种编程范式 ,这意味着它是一种基于一些基本的定义原则(如上所列)思考软件构建的方式。当然,编程范示的其他示例也包括面向对象编程和过程编程。

    函数式的代码往往比命令式或面向对象的代码更简洁,更可预测,更容易测试 - 但如果不熟悉它以及与之相关的常见模式,函数式的代码也可能看起来更密集杂乱,并且 相关文献对新人来说是不好理解的。

    JavaScript支持闭包和高阶函数是函数式编程语言的特点。

    32. 什么是高阶函数?

    高阶函数只是将函数作为参数或返回值的函数。

    function higherOrderFunction(param,callback){
        return callback(param);
    }
    

    33. 为什么函数被称为一等公民?

    在JavaScript中,函数不仅拥有一切传统函数的使用方式(声明和调用),而且可以做到像简单值一样赋值(var func = function(){})、传参(function func(x,callback){callback();})、返回(function(){return function(){}}),这样的函数也称之为第一级函数(First-class Function)。不仅如此,
    JavaScript中的函数还充当了类的构造函数的作用,同时又是一个Function类的实例(instance)。这样的多重身份让JavaScript的函数变得非常重要。

    34. 手动实现 Array.prototype.map 方法

    map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

    function map(arr, mapCallback) {
      // 首先,检查传递的参数是否正确。
      if (!Array.isArray(arr) || !arr.length || typeof mapCallback !== 'function') { 
        return [];
      } else {
        let result = [];
        // 每次调用此函数时,我们都会创建一个 result 数组
        // 因为我们不想改变原始数组。
        for (let i = 0, len = arr.length; i < len; i++) {
          result.push(mapCallback(arr[i], i, arr)); 
          // 将 mapCallback 返回的结果 push 到 result 数组中
        }
        return result;
      }
    }
    

    35. 手动实现Array.prototype.filter方法

    filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

    function filter(arr, filterCallback) {
      // 首先,检查传递的参数是否正确。
      if (!Array.isArray(arr) || !arr.length || typeof filterCallback !== 'function') 
      {
        return [];
      } else {
        let result = [];
         // 每次调用此函数时,我们都会创建一个 result 数组
         // 因为我们不想改变原始数组。
        for (let i = 0, len = arr.length; i < len; i++) {
          // 检查 filterCallback 的返回值是否是真值
          if (filterCallback(arr[i], i, arr)) { 
          // 如果条件为真,则将数组元素 push 到 result 中
            result.push(arr[i]);
          }
        }
        return result; // return the result array
      }
    }
    

    36. 手动实现Array.prototype.reduce方法

    reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

    function reduce(arr, reduceCallback, initialValue) {
      // 首先,检查传递的参数是否正确。
      if (!Array.isArray(arr) || !arr.length || typeof reduceCallback !== 'function') 
      {
        return [];
      } else {
        // 如果没有将initialValue传递给该函数,我们将使用第一个数组项作为initialValue
        let hasInitialValue = initialValue !== undefined;
        let value = hasInitialValue ? initialValue : arr[0];
       、
    
        // 如果有传递 initialValue,则索引从 1 开始,否则从 0 开始
        for (let i = hasInitialValue ? 0 : 1, len = arr.length; i < len; i++) {
          value = reduceCallback(value, arr[i], i, arr); 
        }
        return value;
      }
    }
    

    37. arguments 的对象是什么?

    arguments对象是函数中传递的参数值的集合。它是一个类似数组的对象,因为它有一个length属性,我们可以使用数组索引表示法arguments[1]来访问单个值,但它没有数组中的内置方法,如:forEach、reduce、filter和map。
    我们可以使用Array.prototype.slice将arguments对象转换成一个数组。

    function one() {
      return Array.prototype.slice.call(arguments);
    }
    注意:箭头函数中没有arguments对象。
    function one() {
      return arguments;
    }
    const two = function () {
      return arguments;
    }
    const three = function three() {
      return arguments;
    }
    
    const four = () => arguments;
    
    four(); // Throws an error  - arguments is not defined
    

    当我们调用函数four时,它会抛出一个ReferenceError: arguments is not defined error。使用rest语法,可以解决这个问题。

    const four = (...args) => args;
    

    这会自动将所有参数值放入数组中。

    38. 如何创建一个没有 prototype(原型)的对象?

    我们可以使用Object.create方法创建没有原型的对象。

    const o1 = {};
    console.log(o1.toString()); // [object Object]
    
    const o2 = Object.create(null);
    console.log(o2.toString());
    // throws an error o2.toString is not a function 
    

    39. 为什么在调用这个函数时,代码中的b会变成一个全局变量?

      function myFunc() {
        let a = b = 0;
      }
    
      myFunc();
    

    原因是赋值运算符是从右到左的求值的。这意味着当多个赋值运算符出现在一个表达式中时,它们是从右向左求值的。所以上面代码变成了这样:

    function myFunc() {
      let a = (b = 0);
    }
    
    myFunc();
    

    首先,表达式b = 0求值,在本例中b没有声明。因此,JS引擎在这个函数外创建了一个全局变量b,之后表达式b = 0的返回值为0,并赋给新的局部变量a。
    我们可以通过在赋值之前先声明变量来解决这个问题。

    function myFunc() {
      let a,b;
      a = b = 0;
    }
    myFunc();
    

    40. ECMAScript 是什么?

    ECMAScript 是编写脚本语言的标准,这意味着JavaScript遵循ECMAScript标准中的规范变化,因为它是JavaScript的蓝图。
    ECMAScript 和 Javascript,本质上都跟一门语言有关,一个是语言本身的名字,一个是语言的约束条件 只不过发明JavaScript的那个人(Netscape公司),把东西交给了ECMA(European Computer Manufacturers Association),这个人规定一下他的标准,因为当时有java语言了,又想强调这个东西是让ECMA这个人定的规则,所以就这样一个神奇的东西诞生了,这个东西的名称就叫做ECMAScript。
    javaScript = ECMAScript + DOM + BOM(自认为是一种广义的JavaScript)
    ECMAScript说什么JavaScript就得做什么!
    JavaScript(狭义的JavaScript)做什么都要问问ECMAScript我能不能这样干!如果不能我就错了!能我就是对的
    ——突然感觉JavaScript好没有尊严,为啥要搞个人出来约束自己,
    那个人被创造出来也好委屈,自己被创造出来完全是因为要约束JavaScript。


    起源地下载网 » 热更-js重点第四日,了解总比不知道强......

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元