• 温习JavaScript


    1.布尔值:undefined,null,false,0,NaN,""或''(空字符串) 都会视为false ;空数组[],空对象{},都会视为true

    2.js操作对象用点和中括号的区别 例如,var obj = {name:'alhh'}   obj.name 用点的时候后面需要跟一个指定的属性名称,用中括号的时候,里面是字符串或者是变量 var obj = name ;obj[name] 

    3.属性的读取一个是用点,一个是放在方括号中,放在方括号中需要必须使用引号,否则会被认为是变量 obj['a'],方括号内还可以使用表达式,数字不需要加引号因为会自动转化为字符串

    4.函数体内部声明的函数,作用域绑定在函数体内部

    5.闭包可以简单理解为:定义在一个函数内部的函数,本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁

    闭包还可以形象的理解为中国的父子关系 父函数包裹着子函数,父里面定义的局部变量子都可以访问(父母总是毫无保留的对待孩子),父不能访问子里面定义的变量,除非子return出去(父母不会直接去索取孩子的东西,除非孩子自己给)

    注意:外层函数每次运行,都会生产新的闭包,而这个闭包又会保存外层函数的内部变量,所以内存消耗很大,因此不能滥用闭包,否则会造成网页的性能问题

    6.立即调用的函数表达式,可以避免污染全局变量 

    (function(){ /* code */ }());
    // 或者
    (function(){ /* code */ })(); //分号是必须的

    7.eval 接受一个字符串作为参数,并将这个字符串当做语句执行,如果不是字符串,就原样返回,如果字符串无法按照语句执行就会报错,eval没有自己的作用域,都在当前作用域执行,因此会修改当前作用域的变量,造成安全问题,为了防止这种风险,JavaScript规定,如果有严格模式‘use strict’ eval内部声明的变量,不会影响外部,但是仍会修改外部变量不推荐使用,一般用在解析JSON字符串,但是可以用JSON.parse代替。除了eval()是直接调用,其他都是别名调用,window.eval(' ...')or eval.call(null,',,') eval的别名调用,作用域都是全局作用域

    8.foreach不返回值,只用来操作数据,如果数组遍历的目的是用来得到返回值,那么使用map方法.

    9.Javascript提供apply,call,bind这三个方法,来切换/固定this的指向.①.call参数是一个对象,如果参数为空,null,undefined则默认传入全局对象.也可以传入多个参数,第一个参数是this所要指向的对象,后面的参数是函数调用时所需的参数,例如

    function add(a, b) {
      return a + b;
    }
    
    add.call(this, 1, 2) // 3

    ②.apply方法与call类似,唯一区别是func.apply(thisValue,[arg1,arg2,...]),apply接收一个数组作为函数执行时的参数,这样就会有一些应用 ,

    1.找出数组最大的元素

    var a =[23,45,6,77] 
    Math.max.apply(null,a)
    //77

    2.将数组的空元素变为undefined

     Array.apply(null,[a,,b]) //['a',undefined,'b']
    //空元素和undefined的区别在于,使用forEach遍历数组的时候会跳过空元素,但是不会跳过undefined,undefined会被打印出来

    3.转换类似数组对象,另外,利用数组对象的slice方法,可以将一个类似数组的对象(比如arguments对象)转为真正的数组。

    Array.prototype.slice.apply({0: 1, length: 1}) // [1]
    Array.prototype.slice.apply({0: 1}) // []
    Array.prototype.slice.apply({0: 1, length: 2}) // [1, undefined]
    Array.prototype.slice.apply({length: 1}) // [undefined]

    ③.bind用于将函数体内的this绑定到某一个对象上,然后返回一个新的函数

    注意事项:1.每一次返回一个新的函数,这样会产生一些问题,比如监听事件的时候不能这样

    element.addEventListener('click', o.m.bind(o));
    element.removeEventListener('click', o.m.bind(o));
    //这样绑在一个匿名函数上面,无法取消绑定

    正确的应该这样

    var listener = o.m.bind(o);
    element.addEventListener('click', listener);
    //  ...
    element.removeEventListener('click', listener);

     10.原型链:Object.prototype对象有没有它的原型呢?回答是Object.prototype的原型是nullnull没有任何属性和方法,也没有自己的原型。因此,原型链的尽头就是null

     11.异步-定时器 例如,用户输入后立即将字母转换成大写的(会有很多类似的应用)

    <input type="text" id="input-box">
    document.getElementById('input-box').onkeypress = function (event) {
      this.value = this.value.toUpperCase();
    }
    //这样子是达不到目的的,它只能将本次输入前的字符转为大写的,因为浏览器还没收到新的文本,

    但是使用setTimeout改写,就可以了

    document.getElementById('input-box').onkeypress = function() {
      var self = this;
      setTimeout(function() {
        self.value = self.value.toUpperCase();
      }, 0);
    }
    //放在setTimeout之中,就能使得它在浏览器接收到文本后再触发

    12.异步-Promise

    const p1 = new Promise((resolve, reject) => {
      resolve('hello');
    })
    .then(result => result)
    .catch(e => e);
    
    const p2 = new Promise((resolve, reject) => {
      throw new Error('报错了');
    })
    .then(result => result)
    .catch(e => e);
    
    Promise.all([p1, p2])
    .then(result => console.log(result))
    .catch(e => console.log(e));
    // ["hello", Error: 报错了]

    注意,如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()catch方法。

    Promise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。

    13.同源 

    所谓同源指的是三个相同 ①:协议相同 ②:域名相同 ③:端口相同

  • 相关阅读:
    微信机器人开发SDK使用教程--清粉任务
    微信机器人开发SDK使用教程--养号任务停止
    linux和 unix 介绍
    thinkphp5.1学习笔记
    nginx的相关配置记录和总结
    php优秀框架codeigniter学习系列——CI_URI类学习
    求职过程中的灵感
    设计模式学习系列——过滤器模式
    php优秀框架codeigniter学习系列——CI_Utf8类
    php优秀框架codeigniter学习系列——hooks
  • 原文地址:https://www.cnblogs.com/alhh/p/9663431.html
Copyright © 2020-2023  润新知