前端面试题整理
    https://www.cnblogs.com/haoyijing/p/5789348.html#z1_6
    阮一峰的ES6教程
    http://es6.ruanyifeng.com/?search=map&x=0&y=0
    前端仓库
    https://github.com/wuhaohao1234
    MDN-教程权威资料
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript
    HTTP网络相关
    URL有哪些部分组成?

    浏览器的引擎有哪些?
    [1] IE浏览器 (trident内核) —-trident 三叉戟
    [2] Mozilla firefox (gecko内核) —-gecko 壁虎
    [3] Safari (webkit内核)
    [4] Chrome Opera (Blink内核) —-blink 眨眼
    浅谈cookie跨域的解决方案?
    ● domain-域
    设置这个属性可以使多个web服务器共享cookie。domain属性的默认值是创建cookie的服务器的主机名。不能将一个cookie的域设置成服务器所在的域之外的域;
    举个例子:
    让位于a.taotao.com的服务器能够读取b.taotao.com设置的cookie值。如果b.taotao.com的页面创建的cookie把它的path属性设置为”/”,把domain属性设置成”.taotao.com”,那么所有位于b.taotao.com的网页和所有位于 a.taotao.com的网页,以及位于taotao.com域的其他服务器上的网页都可以访问(或者说是得到)这个cookie。
    ● path-路径
    表示创建该cookie的服务器的哪些路径下的文件有权限读取该 cookie,默认为/,就是创建该cookie的服务器的根目录。

    理解JSONP跨域原理?
    https://blog.csdn.net/inite/article/details/80333130
    前端优化方式有哪些?
    ● 降低请求量:合并资源,减少HTTP 请求数,minify / gzip 压缩,lazyLoad。
    ● 加快请求速度:预解析DNS,减少域名数,并行加载,CDN 分发。
    ● 缓存:HTTP 协议缓存请求,离线缓存 manifest,离线数据缓存localStorage。
    ● 渲染:JS/CSS优化,加载顺序,服务端渲染,pipeline

    http请求头有哪些属性?
    ● content-type
    ● referer
    ● user-agent :Mozilla/5.0 appleWebkit
    ● cookie
    ● accept :text/html
    ● accept-encoding :gzip
    ● accept-language :zh-CN ,zh
    ● Origin
    ● host
    ● proxy

    浏览器的回流和重绘

    ○ DOM树和render树
    从MVC的角度来说,可以将render树看成是V,dom树看成是M,C则是具体的调度者,比HTMLDocumentParser等。
    何时发生回流重绘??
    ● 添加、删除、修改(元素的尺寸(宽 高 margin padding border)或位置) 可见的DOM元素;
    ● 元素内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代;
    ● 页面一开始渲染的时候(这肯定避免不了);
    ● 浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的);
    ● 注意:回流一定会触发重绘,而重绘不一定会回流
    如何减少回流和重绘??
    ● 将多次DOM修改为一次
    ● 批量修改DOM
    ● 使元素脱离文档流
    ● 对其进行多次修改
    ● 再将元素放回到文档中
    ● 对于复杂动画效果,使用绝对定位让其脱离文档流
    ● 对于复杂动画效果,由于会经常的引起回流重绘,因此,我们可以使用绝对定位,让它脱离文档流。否则会引起父元素以及后续元素频繁的回流。
    这个我们就直接上个例子
    https://www.cnblogs.com/chris-oil/p/10800961.html
    举例浏览器兼容性问题的解决办法?
    https://www.nowcoder.com/ta/front-end-interview/review?tpId=10&tqId=11094&query=&asc=true&order=&page=18
    ● png 24位的图片在iE6浏览器上出现背景
    ○ 解决方案:做成PNG 8位,也可以引用一段脚本处理.
    ● 浏览器默认的margin和padding不同
    ○ 解决方案:加一个全局的 *{margin:0;padding:0;} 来统一。
    ● IE下,可以使用 getAttribute() 获取常规属性和自定义属性;Firefox下,只能使用getAttribute()获取自定义属性
    ○ 解决方法:统一通过getAttribute()获取自定义属性。
    ● IE下,event对象有 x、y 属性,但是没有 pageX、pageY属性; Firefox下,event对象有 pageX、pageY 属性,但是没有 x、y 属性
    ○ 解决方法:(条件注释)缺点是在IE浏览器下可能会增加额外的HTTP请求数。



    ● Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示
    ○ 解决方法:可通过加入 CSS 属性 -webkit-text-size-adjust: none;
    ● 漏写 DOCTYPE 声明,Firefox 仍然会按照标准模式来解析网页,但在 IE 中会触发怪异模式。
    ○ 解决方法:统一加上DOCTYPE声明

    HTML
    HTTP状态码
    https://www.runoob.com/http/http-status-codes.html
    HTML中的标签的功能
    https://blog.csdn.net/Coding___Man/article/details/84103853
    name属性
    ● Keywords(关键字)
    ○ keywords用来告诉搜索引擎你网页的关键字是什么
    ● description(网站内容描述)
    ○ description用来告诉搜索引擎你的网站主要内容
    ● viewport(移动端窗口)
    ○ 主要用来设计移动端网页
    ● robots(定义搜索引擎爬虫的索引方式)
    ● author(作者)
    ● copyright(版权)
    http-equiv属性
    ● content-Type(显示字符集的设定)
    ○ 设定页面使用的字符集( //HTML5设定网页字符集的方式推荐使用UTF-8)
    ● cache-control(指定请求和响应遵循的缓存机制)
    ○ 指导浏览器如何缓存某个响应以及缓存多长时间。用法:
    ● Expires(期限)
    ○ 说明:可以用于设定网页的到期时间。一旦网页过期,必须到服务器上重新传输。
    ● Refresh(刷新)
    ○ 说明:自动刷新并指向新页面。用法:<meta http-equiv=”Refresh” content=”2; URL=http://www.root.net">
    ● Set-Cookie(cookie设定)
    ○ 说明:设置cookie, 如果网页过期,那么存盘的cookie将被删除。用法:<meta http-equiv=”Set-Cookie” content=”cookievalue=xxx; expires=Friday, 12-Jan-2001 18:18:18 GMT; path=/“>
    给DOM对象添加属性
    系统内置的标签属性有:
    id name type checked title src href style
    其中class属性在js代码中通过className调用

    1. 通过 “.”+“属性名”设置的属性,也要通过 “.”+“属性名”获取;
    2. setAttribute(‘属性名’,’属性值’),也要通过getAttribute()获取;
    3. 直接在元素标签上加属性 如:
      注意:
      ● 对于自定义属性,使用 . 运算符设置无法通过getAttribute()获取,反之通过 setAttribute(‘self-attr’,’xiong’)设置也无法通过 . 运算符取得;
      ● 用 . 来引用,必须是内置的属性(IE 可以访问自定义属性),而且引用的时候,区分大小写;
      ● 用getAttribute 来引用,可以访问自定义属性,不区分大小写;
      常见的DOM方法?
      DOM(Document Object Model)是针对HTML和XML文档的API
      JavaScript
      基本数据类型
      js基本数据类型类别
      null类型
      https://www.jianshu.com/p/4841fcc6b4e7
      && 逻辑与和 || 逻辑或的用法

    字符串对象
    字符串对象的常用方法集

    substr(start [,length]) //第一个字符的索引是0,start必选 length可选
    substring(start [, end]) //第一个字符的索引是0,start必选 end可选
    slice(start,end) //返回截取的元素,原始数组/字符串未发生变化
    splice(start,deleteCount,item1,item2,item3…) //原始数组/字符串发生变化
    indexOf(val) //数组/字符串中是否有某个值 没有返回-1,有返回下标
    split(“&”) //以&符号分割字符串,返回数组
    “xiong123juntao”.match(/\d+/) //正则匹配,返回[“123”, index: 5, input: “xiong123juntao”, groups: undefined]
    str.replace(正则,替换/执行函数)

    将原生的Ajax封装成promise
    var myNewAjax=function(url){
    return new Promise(function(resolve,reject){
    var xhr = new XMLHttpRequest();
    xhr.open(‘get’,url);
    xhr.send(‘data’);
    xhr.onreadystatechange=function(){
    if(xhr.status200&&xhr.readyState4){
    var json=JSON.parse(xhr.responseText);
    resolve(json)
    }else if(xhr.readyState==4&&xhr.status!=200){
    reject(‘error’);
    }
    }
    })
    };

    js监听对象属性的改变
    https://www.jianshu.com/p/fce3a6a9f920
    Object.defineProperty()的详细用法参考:
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

    (1)在ES5中可以通过Object.defineProperty() 来实现已有属性的监听

    (2)在ES6中可以通过Proxy来实现

    如何实现一个私有变量,不能直接访问只能通过getName()方法访问
    (1)通过defineProperty()来实现
    obj={
    name:’xiong’,
    getName:function(){
    return this.name
    }
    };
    Object.defineProperty(obj,”name”,{
    configurable: false, //不可配置
    enumerable:false, //不可枚举
    writable:false //不可修改
    });
    console.log(obj.name); //xiong
    obj.name = “justin”;
    console.log(obj.getName()); //xiong
    (2)通过构造函数的创建形式(函数的局部变量)
    function product(){
    var name=’xiong’;
    this.getName=function(){
    return name;
    }
    }
    var obj=new product();
    obj.getName()
    setTimeout、setInterval和requestAnimationFrame之间的区别?
    ● setTimeout(func,300) 函数func 等待300ms后执行;
    ● setInterval(func,300) 函数func 每隔300ms执行一次;
    ● requestAnimationFrame(RAF)与setTimeout和setInterval不同,不需要设置时间间隔,大多数电脑显示器的刷新频率是60Hz,大概相当于每秒钟重绘60次。大多数浏览器都会对重绘操作加以限制,不超过显示器的重绘频率,因为即使超过那个频率用户体验也不会有提升。因此,最平滑动画的最佳循环间隔是1000ms/60,约等于16.6ms。RAF采用的是系统时间间隔不会因为前面的任务而影响RAF,但是如果前面的任务多的话,会响应setTimeout和setInterval真正运行时的时间间隔。
    RAF特点:
    (1)requestAnimationFrame会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率;
    (2)在隐藏或不可见的元素中,RAF将不会进行重绘或回流,这当然就意味着更少的CPU、GPU和内存使用量;
    (3)requestAnimationFrame是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,如果页面不是激活状态下的话,动画会自动暂停 节省CPU的开销;

    DOM的宽高和位置
    https://blog.csdn.net/qq_39840761/article/details/91620263
    https://www.jianshu.com/p/44abcc626318
    ● clientHeight:表示的是内容可视区域的高度,不包含border和滚动条;
    ● offsetHeight:表示可视区域的高度,包含了border和滚动条;
    ● scrollHeight:表示了所有区域的高度,包含了因为滚动被隐藏的部分;
    ● clientTop:表示边框border的厚度,在未指定的情况下一般为0;
    ● scrollTop:滚动后被隐藏的高度,获取对象相对于由offsetParent属性指定的父坐标(css定位的元素或body元素)距离顶端的高度;
    mouseEvent对象的高度 宽度对比

    用setTimeout来实现setInterval
    setTimeout(function(){
    //do something
    setTimeout(arguments.callee,200); //arguments.callee 指代引用函数自身
    },200);

    ● arguments是函数调用时创建的一个类似的数组但又不是数组的对象,并且它存储的是实际传递给函数的参数,并不局限于函数声明的参数列表;
    ● arguments.callee == 正被执行的Function对象;
    ● arguments.caller == 调用当前函数的函数对象;
    ● 在JS的非严格模式下,函数的实参和arguments[index] 存在映射关系,严格模式下 arguments和实参直接的映射被切断了;
    arguments用法参考: https://www.cnblogs.com/LMJBlogs/p/6024148.html
    https://www.cnblogs.com/giggle/p/5280812.html
    如何实现sleep的效果
    ● 方式1:while循环
    function sleep(ms){
    var start=Date.now(),expire=start+ms; //Date.now() 获取时间撮,另一种方法 var date = new Date();date.getTime()
    while(Date.now()console.log(‘1111’);
    return;
    }
    sleep(2000)
    ● 方式二:通过promise来实现
    function sleep(ms){
    var temple=new Promise((resolve,reject)=>{
    console.log(111);
    setTimeout(resolve,ms)
    });
    return temple
    }
    sleep(1000).then(function(){
    console.log(222)
    })
    ● 方式三:通过generator+promise来实现
    function* sleep(ms){
    yield new Promise(function(resolve,reject){
    console.log(111);
    setTimeout(resolve,ms);
    })
    }
    //sleep(500).next() //{value: Promise, done: false}
    sleep(500).next().value.then(function () {
    console.log(222)
    })

    JS内存泄漏与垃圾回收机制
    https://blog.csdn.net/qq_17550381/article/details/81126809
    ● 什么是内存泄漏?
    ● JavaScript垃圾回收机制的原理
    ○ 垃圾回收机制会定期扫描那些不再用到的内存(变量),然后将其释放掉
    ● 垃圾回收机制的方法:
    ○ 标记清除
    ○ 引用计数
    ● WeakMap对于值的引用都是不计入垃圾回收机制的,是弱引用
    const wm = new WeakMap();
    const element = document.getElementById(‘example’);
    wm.set(element, ‘some information’);
    wm.get(element) // “some information”

    简单实现Node的Events模块

    前端性能优化方案
    ● 减少HTTP请求
    ● 使用内容发布网络(CDN)
    ● 添加本地缓存
    ● 压缩资源文件
    ● 将CSS样式表放在顶部,把javascript放在底部(浏览器的运行机制决定)
    ● 避免使用CSS表达式
    ● 减少DNS查询
    ● 使用外部javascript和CSS
    ● 避免重定向
    ● 图片lazyLoad

    JS闭包
    闭包就是一个函数,这个函数能够访问其他函数作用域中的变量。
    function outer() {
    var a = ‘变量1’
    var inner = function () {
    console.info(a)
    }
    return inner // inner 就是一个闭包函数,因为他能够访问到outer函数的作用域
    }
    很多人会搞不懂匿名函数与闭包的关系,实际上,闭包是站在作用域的角度上来定义的,因为inner访问到outer作用域的变量,所以inner就是一个闭包函数。虽然定义很简单,但是有很多坑点,比如this指向、变量的作用域,稍微不注意可能就造成内存泄露。我们先把问题抛一边,思考一个问题:为什么闭包函数能够访问其他函数的作用域 ?
    从堆栈的角度看待js函数
    基本变量的值一般都是存在栈内存中,而对象类型的变量的值存储在堆内存中,栈内存存储对应空间地址。基本的数据类型: Number 、Boolean、Undefined、String、Null。
    var a = 1 //a是一个基本类型var
    b = {m: 20 } //b是一个对象

    当我们执行 b={m:30}时,堆内存就有新的对象{m:30},栈内存的b指向新的空间地址( 指向{m:30} ),而堆内存中原来的{m:20}就会被程序引擎垃圾回收掉,节约内存空间。我们知道js函数也是对象,它也是在堆与栈内存中存储的,我们来看一下转化:

    栈是一种先进后出的数据结构:

    1. 在执行fn前,此时我们在全局执行环境(浏览器就是window作用域),全局作用域里有个变量a;
    2. 进入fn,此时栈内存就会push一个fn的执行环境,这个环境里有变量b和函数对象fn1,这里可以访问自身执行环境和全局执行环境所定义的变量;
    3. 进入fn1,此时栈内存就会push 一个fn1的执行环境,这里面没有定义其他变量,但是我们可以访问到fn和全局执行环境里面的变量,因为程序在访问变量时,是向底层栈一个个找,如果找到全局执行环境里都没有对应变量,则程序抛出underfined的错误;
    4. 随着fn1()执行完毕,fn1的执行环境被销毁,接着执行完fn(),fn的执行环境也会被销毁,只剩全局的执行环境下,现在没有b变量和fn1函数对象了,只有a 和 fn(函数声明作用域是window下);

    链接:https://www.jianshu.com/p/26c81fde22fb

    JS语言的特性
    ● 运行在客户端浏览器上;
    ● 不用预编译,直接解析执行代码;
    ● 是弱类型语言,较为灵活;
    ○ 强类型语言(java、C++、Python),当你定义一个变量是某个类型,如果不经过代码显式转换(强制转化),它就永远都是这个类型,如果把它当做其他类型来用,就会报错;
    ○ 弱类型语言(php js vb),你想把这个变量当做什么类型来用,就当做什么类型来用,语言的解析器会自动(隐式)转换;
    ● 与操作系统无关,跨平台的语言;
    ● 脚本语言、解释性语言;
    判断JS对象类型
    ● typeof
    ● instance of
    ● Object.prototype.toString.call()
    https://www.jianshu.com/p/585926ae62cc
    JS中继承的方式有哪些?
    1、原型链继承,将父类的实例作为子类的原型,他的特点是实例是子类的实例也是父类的实例,父类新增的原型方法/属性,子类都能够访问,并且原型链继承简单易于实现,缺点是来自原型对象的所有属性被所有实例共享,无法实现多继承,无法向父类构造函数传参;
    2、构造继承,使用父类的构造函数来增强子类实例,即复制父类的实例属性给子类,构造继承可以向父类传递参数,可以实现多继承,通过call多个父类对象。但是构造继承只能继承父类的实例属性和方法,不能继承原型属性和方法,无法实现函数服用,每个子类都有父类实例函数的副本,影响性能;
    3、实例继承,为父类实例添加新特性,作为子类实例返回,实例继承的特点是不限制调用方法,不管是new 子类()还是子类()返回的对象具有相同的效果,缺点是实例是父类的实例,不是子类的实例,不支持多继承;
    4、拷贝继承:特点:支持多继承,缺点:效率较低,内存占用高(因为要拷贝父类的属性)无法获取父类不可枚举的方法(不可枚举方法,不能使用for in 访问到);
    5、组合继承:通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用;
    6、寄生组合继承:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的组合继承的缺点;
    https://www.cnblogs.com/Grace-zyy/p/8206002.html

    https://www.jianshu.com/p/129976ab0015 class继承方式
    浏览器加载文件的顺序?
    什么是伪数组?
    ● 伪数组是带有length属性能通过Array.prototype.slice 转换为真正的数组的对象
    ● 比如arguments对象,还有像调用getElementsByTagName,document.childNodes之类的,它们都返回NodeList对象都属于伪数组
    ● 我们可以通过Array.prototype.slice.call(fakeArray)将伪数组转变为真正的Array对象: 返回新数组而不会修改原数组  
    https://www.cnblogs.com/fool/archive/2010/10/09/1846966.html

    浏览器端的js包括哪些部分?
    核心( ECMAScript) , 文档对象模型(DOM), 浏览器对象模型(BOM)
    this指向问题总结
    普通函数 this的概念是:this是JavaScript的一个关键字,他是指函数执行过程中,自动生成的一个内部对象,是指当前的对象,只在当前函数内部使用。(this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this指向的是window;当函数被作为某个对象的方法调用时,this就等于那个对象)。

    ● 普通函数调用,此时this 指向window
    function fn(){
    console.log(this);// window
    }
    fn(); //相当于 window.fn(),此处默认省略window
    ● 构造函数调用时, this 指向实例对象
    function Person(age, name){
    this.age = age;
    this.name = name
    console.log(this) // 此处 this 分别指向 Person 的实例对象 p1 p2
    }
    varp1 =newPerson(18,’zs’)
    varp2 =newPerson(18,’ww’)
    ● 对象方法调用 时, this指向该方法所属的对象
    var obj = {
    fn:function(){
    console.log(this); // obj
    }
    }
    obj.fn();
    ● 通过事件绑定的方法, this指向绑定事件的对象
    btn.onclick =function(e){
    console.log(e) //e == MouseEvent点击对象
    console.log(this); // btn
    }
    ● 定时器函数, this指向window
    setInterval(function(){
    console.log(this); // window
    },1000);
    箭头函数的this定义:箭头函数的this是在定义函数时绑定的,不是在执行过程中绑定的。简单的说,函数在定义时,this就继承了定义函数的对象。
    所以,这会很好的解决匿名函数和setTimeout和setInterval的this指向问题。我们不用再去给其用that变量存储this。

    箭头函数和普通函数this指向问题?
    普通函数: this的指向不是函数被创建时绑定,而是被怎么样的方式调用时绑定的。
    箭头函数:this指向是函数被创建时绑定的,它的指向就是当前词法作用域中的this,并且不会因为被怎么样的方式调用改变绑定。
    https://blog.csdn.net/w390058785/article/details/82884032
    判断对象是否包含某个属性的方法?
    ● 最简单的方法,就是使用“!”进行判断,该方法既可以判断自身属性也可以判断继承来的属性;
    let obj = { x: 1 };
    obj.x ! undefined; // true 有x属性
    obj.y !== undefined; // false 无y属性
    obj.toString !== undefined; // true 从Object继承toString属性
    ● 使用 in 运算符,in 的语法是: attr in obj , 同样,该表达式也返回一个布尔值;
    let obj = { x: 1 };
    ‘x’ in obj; // true
    ‘y’ in obj; // false
    ‘toString’ in obj; // true
    //in运算符语法很简单,效果跟undefined是相同的,与undefined不同的是,in可以区分存在但值为undefined的属性。话不多说,看代码:
    let obj = { x: undefined };
    obj.x !== undefined; // false,无法判断属性值为undefined的情况
    ‘x’ in obj; // true
    ● 对象的 hasOwnProperty() 方法可以检测指定属性名是否在对象内,同样返回是布尔值, 当检测属性为自有属性(非继承)的时候返回true;
    let obj = { x: 1, abc: 2 };
    let a = ‘a’;
    let b = ‘bc’;
    obj.hasOwnProperty(‘x’); // true 包含
    obj.hasOwnProperty(‘y’); // false 不包含
    obj.hasOwnProperty(‘toString’); // false 继承属性
    obj.hasOwnProperty(a + b); // true 判断的是属性abc
    //in 运算符和 hasOwnProperty() 的区别就在于hasOwnProperty()能判断该属性是自身的还是继承的,而in不行
    ● propertyIsEnumerable() 是hasOwnProperty() 的增强版,这个方法的用法与hasOwnProperty()相同,但当检测属性是自有属性(非继承)且这个属性是可枚举的,才会返回true;
    //什么是可枚举属性?通俗的讲就是可以通过for…in遍历出来的属性就是可枚举属性。通常由JS代码创建出来的属性都是可枚举的.
    let obj = Object.create({x: 1}); // 通过create()创建一个继承了X属性的对象obj
    obj.propertyIsEnumerable(‘x’); // false x是继承属性
    obj.y = 1; // 给obj添加一个自有可枚举属性y
    obj.propertyIsEnumerable(‘y’); // true
    Object.prototype.propertyIsEnumerable(‘toString’); // false 不可枚举
    数组 length属性特殊用法
    var arr = [1,2,3];
    arr.length = 6;
    console.log(arr);//[1,2,3,undefined3]
    5 in arr; //false
    arr[5] = undefined;
    5 in arr; //true
    Es6中的模块化Module导入导出
    https://www.jianshu.com/p/29f89e8b9cb6
    // 导出暴露name变量
    export var name = “随笔川迹”;
    // 暴露weChatPublic
    export let weChatPublic = “itclanCoder”;
    // 暴露time
    export const time = 2018;
    // 上面的等价于下面的写法,以下这种是常见写法
    var name = “随笔川迹”;
    let weChatPublic = “itclanCoder”;
    const time = 2018;
    export {name,weChatPublic,time}
    // 导出函数
    export function sum(num1,num2){
    return num1+num2;}/

    *

    • 以上等价于
    • function sum(num1,num2){
    • return num1+num2;
    • }
    • export sum;
      /
      // 导出类
      export class People{
      constructor(name,age){
      this.name = name;
      this.age = age;
      }
      info(){
      return 姓名:${this.name} 年龄:${this.age};
      }}
      导入模块
      import { name, weChatPublic,time,sum,People} from “../modelTest1/exportExampleEs5.js”
      var people = new People(“小美”,18); // 实例化perople对象
      console.log(name);
      console.log(weChatPublic);
      console.log(time);
      console.log(sum(1,2));
      console.log(people.info());
      //需要导入的属性和方法比较多时
      全部导入
      import * as example from “../modelTest1/exportExampleEs5.js”
      console.log(example.name);
      JavaScript的设计模式有哪些?
      https://www.w3cschool.cn/zobyhd/3lt2rcqm.html
      ● JavaScript构造器模式
      ● JavaScript单例模式
      ● JavaScript工厂模式
      ● JavaScript发布者订阅者模式
      ● JavaScript模块化模式
      ● JavaScript原型模式
      ● JavaScript MVC模式
      ● JavaScript MVVM模式
      ● JavaScript Mixin混入模式 —-可以举Vue的Mixin混入
      ● JavaScript 装饰模式 —-可以举Python的装饰器例子
      单例模式和工厂模式
      https://www.jianshu.com/p/dd1cd3a3267f
      Flutter的特点:
      Flutter框架分为三层,Framework使用Dart语言实现,Engine使用C实现, Embedder是一个嵌入层,通过该层把Flutter嵌入到各个平台上去,Embedder的主要工作包括渲染Surface设置, 线程设置,以及插件等。平台(如iOS)只是提供一个画布,剩余的所有渲染相关的逻辑都在Flutter内部,这就使得它具有了很好的跨端一致性。
      https://www.jianshu.com/p/1cea8c154ff8
      ● 跨平台:现在flutter至少可以跨5种平台,常见的平台:MacOS,Windows ,Linux ,Android ,iOS ,到目前为止,Flutter算是支持平台最多的框架了。良好的跨平台性,大大减少了开发成本。
      ● 丝滑般的体验:使用Flutter内置的Material Design(android风格)和Cupertino(ios风格)风格组件,以及丰富的motion API,平滑而自然的滑动效果和平台感知,为用户带来全新的体验。
      ● 响应式框架:使用一系列基础组件和响应式框架,可以轻松构建用户界面。使用功能强大且灵活的API可以实现复杂的界面效果。
      ● 支持插件:使用插件可以访问平台本地API,如相机,蓝牙,WIFI等等。借助现有的Java,swift ,object c , c代码实现对原生系统的调用。
      ● 60fps超高性能:Flutter采用GPU渲染技术,编写APP的应用可以达到60fps(每秒传输帧数),完全可以胜任游戏开发。
      一句话概括restful
      restful是一种http请求分格,就是用URL定位资源,用HTTP描述操作
      变量提升和函数提升
      https://www.jianshu.com/p/5a5f6fb21fd3https://blog.csdn.net/sinat_41695090/article/details/81284355
      所有的声明语句无论写在代码的什么位置(if条件判断中的var 变量声明也要提升),在编译执行的时候,都会提升到最顶;
      函数声明在前,变量声明在后;
      console.log(foo);
      foo();//可以执行
      var foo=10;
      foo();//foo已经被赋值为一个变量,无法执行foo为函数
      console.log(foo);
      function foo(){
      var a;
      console.log(a);
      a=12;
      console.log(a);
      }
      console.log(foo);
      实际的代码执行顺序是:
      function foo(){
      var a;
      console.log(a); //undefined
      a=12;
      console.log(a); //12
      }
      var foo;
      console.log(foo); //函数foo
      foo(); //执行函数
      foo=10; //foo设置为数值10
      foo(); //由于这里报错,foo已经被赋值成为一个数值了,找不到这个函数,下面的都不会被执行
      console.log(foo);
      console.log(foo);

    typeof 判断类型
    typeof Symbol() //“symbol”
    typeof Number() //“number”
    typeof String() //“string”
    typeof Function() //“function”
    typeof Object() //“object”
    typeof Boolean() //“boolean”
    typeof null //“object”
    typeof undefined //“undefined”

    var aa = new Array()
    typeof aa
    “object”
    typeof ‘’
    “string”
    typeof []
    “object”
    ‘’false //true
    0false //true
    []==false //true
    undefined == false //false
    null == false //false
    NaN == false //false
    new创建对象内部是如何实现的?
    ● 创建一个空对象
    ● 将所 创建对象的proto属性值设置为构造函数的prototype的属性值
    ● 执行构造函数中的代码,构造函数中的this指向该对象
    ● 返回对象
    var Person = function(name, age) {
    this.name = name;
    this.age = age;
    };
    Person.prototype.show = function() {
    console.log(this.name, this.age);
    };
    // var p = new Person(“bella”, 10);
    var p = {};
    p.proto = Person.prototype;
    Person.call(p, “balle”, 10);
    console.log(p);

    CSS
    CSS选择器常用方法汇总
    https://www.w3school.com.cn/cssref/css_selectors.asp

    选择器 描述 例子
    .class 类选择器,含有该类名的所有标签class=”mycls” .mycls{}
    #id id=”one” #one{}

    • 匹配所有 *{}
      element 标签选择器,匹配所有改标签 button{}
      element1,element2 选择所有 元素 div,p{}
      element1 element2 选择div内部的所有 p,p的父级不一定是div div p{}
      element1>element2 选择父元素为div 的所有p标签 div>p{}
      element1+element2 选择紧接在 div 元素之后的所有 p 元素 div+p{}
      [attribute] 选择带有 target 属性所有元素 [target]

      元素的内容之前插入内容 p:before :after 在每个
      元素的内容之后插入内容 p:after :nth-child(n) 选择属于父元素p的第二个子元素 p:nth-child(2) :last-child 选择属于父元素p的最后一个子元素 p:last-child :checked 选择每个被选中的 元素 input:checked :enabled 选择每个启用的 元素 input:enabled
      CSS实现水平居中和垂直居中的方法
      https://www.cnblogs.com/haoyijing/p/5815394.html

    方法1:flex布局

    方法2:display:table-cell

    方法3:父relative 子absolute(margin: auto;bottom: 0;top: 0;left: 0;right: 0;)

    方法4:父relative 子absolute(width: 300px;height: 200px;margin-left: -150px;margin-top: -100px;top: 50%;left: 50%;)

    方法5:文字居中
    height:36px
    text-align:center;
    line-height:36px
    伪类的用法详解
    https://www.cnblogs.com/ghost-xyx/p/3763669.html
    CSS动画和JS动画的优缺点
    https://www.cnblogs.com/haoyijing/p/5789348.html#z1_6
    src和href的区别
    标签的 href 属性用于指定超链接目标的 URL,一般完成跳转功能。
    src 是指向外部资源位置,主要用在img script iframe标签中,表示引用资源, 在请求src资源时会将其指向的资源下载并应用到当前文档中,例如js脚本,img图片和frame等元素。
    CSS实现两列布局,左边固定宽度,右边自适应

    CSS哪些样式属性可以继承?
    ● 不可继承的:display、margin、border、padding、background、height、min-height、max- height、width、min-width、max-width、overflow、position、left、right、top、 bottom、z-index、float、clear、table-layout、vertical-align、page-break-after、 page-bread-before和unicode-bidi
    ● 所有元素可继承:visibility和cursor
    ● 内联元素可继承:white-space、line-height、color、font、 font-family、font-size、font-style、font-weight、 text- decoration、word-spacing、text-transform、direction、letter-spacing、
    ● 块状元素可继承:text-indent和text-align
    ● 列表元素可继承:list-style、list-style-type、list-style-position、list-style-image
    ● 表格元素可继承:border-collapse
    BFC
    (BlockFormatContext块级格式化上下文,用于清除浮动防止margin重叠等)
    BFC是页面上的一个独立容器,不会与浮动 box重叠,子元素不会影响到外面;计算BFC的高度时,内部的浮动元素也参与计算;
    BFC特性:

    1. 使 BFC 内部浮动元素不会到处乱跑;
    2. 和浮动元素产生边界。(margin-left = 浮动元素宽度+与浮动元素的左边距)
      哪些元素会生成BFC呢?
      ● 根元素
      ● float不为none的元素;
      ● position为fixed和absolute的元素;
      ● display为inline-block、table-cell、table-caption,flex,inline-flex的元素;
      ● overflow不为visible;
      https://www.jianshu.com/p/0d713b32cd0d

    Git
    Git常用指令
    ● git init
    ● git add .
    ● git commit -m ‘本次提交说明’
    ● git remote add origin git@github.com:/<仓库名>
    ● git push
    ● git checkout -b <分支名>
    ● git log
    ● git reset —hard HEAD^
    ● git rm text.txt
    Linux常用指令
    ● cd ..
    ● cd ./home
    ● pwd 显示工作路径
    ● ls 查看目录中的所有文件
    ● mkdir dir1 创建目录dir1
    ● rm -f file1 删除文件名为file1的文件
    ● mv dir1 dir2 移动文件
    ● cp file1 file2 复制一个文件
    ● gzip file1 压缩文件
    ● rar
    ● tar
    ● zip
    ● touch 创建文件
    ● vi 编辑文件(vim环境 :w保存文件 :wq保存退出 :q不保存直接退出 )
    ● cat 显示文件内容

    // Debian, Ubuntu系统的包管理工具apt-get
    ● apt-get install package_name
    ● df 检查各个磁盘分区和已挂载上来的文件系统的磁盘空间

    说一说http2.0的特点?
    ● 提升访问速度(可以对于,请求资源所需时间更少,访问速度更快,相比http1.0);
    ● 允许多路复用:多路复用允许同时通过单一的HTTP/2连接发送多重请求-响应信息。改善了:在http1.1中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制(连接数量),超过限制会被阻塞;
    ● 二进制分帧:HTTP2.0会将所有的传输信息分割为更小的信息或者帧,并对他们进行二进制编码;
    ● 首部压缩;
    ● 服务器端推送;

    比较 Canvas 或者 SVG 渲染
    Canvas 更适合绘制图形元素数量非常大(这一般是由数据量大导致)的图表(如热力图、地理坐标系或平行坐标系上的大规模线图或散点图等),也利于实现某些炫酷的视觉 特效(如粒子效果 鼠标跟随)。
    SVG 具有的优势:它的内存占用更低(这对移动端尤其重要)、渲染性能略高、并且用户使用浏览器内置的缩放功能时图片不会模糊。

    二叉树的分类
    ● 完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列;
    ● 满二叉树的定义是所有叶节点都在最底层的完全二叉树;
    ● 平衡二叉树(AVL树):当且仅当任何节点的两棵子树的高度差不大于1的二叉树;

    五种进程调度的算法实现(一)
    ● 最短工作优先(SJF);
    ● 最短剩余时间优先(SRTF);
    ● 最高响应比优先(HRRF);
    ● 优先级调度(Priority);
    ● 轮转调度(RR)。

    还有以下知识点:
    1、进程
    2、线程
    3、同步与异步
    4、并发与并行
    5、死锁
    https://www.cnblogs.com/bajdcc/p/4707544.html

    认识哈希表

    常见的哈希算法:
    1) 直接定址法
    2) 除留余数法
    3) 数字分析法
    4) 平方取中法
    5) 随机数法

    哪些操作会造成内存泄漏?
    内存泄漏指对象在您不再引用或没有变量指向它时 它之后仍然存在。
    垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。

    1. setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
    2. 闭包
    3. 控制台日志
    4. 循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

    用call或bind实现bind()
    Function.prototype.bind2 = function (context) {
    var self = this;
    var args=Array.prototype.slice.call(arguments,1)//模拟bind时的传参
    return function () {
    var bindArgs=Array.prototype.slice(arguments)//模拟执行bind的返回函数时的传参
    self.apply(context,args.concat(bindArgs));//修改返回函数的this指向为context,并将bind时和执行bind的返回函数传入的参数concat后绑定给返回函数。
    }
    }
    补充:
    Array.prototype.slice.call(arguments,1) 把类数组arguments的参数截取出来,索引从1开始

    异步加载JS的方式有哪些?

    宏任务和微任务(是异步任务中的两种)
    macro-task宏任务:包括整体代码script、setTimeout、setInterval
    micro-task微任务:Promise process.nextTick
    原理:

    示例:

    彻底弄懂 JavaScript 执行机制 谈Event Loop
    http://www.ruanyifeng.com/blog/2014/10/event-loop.html
    https://juejin.im/post/59e85eebf265da430d571f89

    ● 同步和异步任务分别进入不同的执行”场所”,同步的进入主线程,异步的进入Event Table并注册函数。
    ● 当指定的事情完成时,Event Table会将这个函数移入Event Queue。
    ● 主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。
    ● 上述过程会不断重复,也就是常说的Event Loop(事件循环)。

    比较 onclick 和 addEventListener??
    ● onclick 它不可以一个事件函数处理多个事件,addEventListener可以针对同一个对象做多个处理方法,$div0.onclick = function() $div0.onclick = function() 定义多个时后一个会覆盖前一个;
    ● onclick不能设置捕获和冒泡阶段那个优先,addEventListener可以设置捕获和冒泡优先级;
    ● onclick这种事件没有自由度(侦听点击),addEventListener可以侦听所有自定义的事件;

    阻止默认事件
    e.preventDefault()
    阻止事件冒泡
    e.stopPropagation();//阻止冒泡
    e.cancelBubble=true;//只适用于IE8及以下

    webpack和gulp区别(模块化与流的区别)
    gulp强调的是前端开发的流程化,首先定义一系列的task,然后配置task要处理的事务(例如ES6转ES5、雪碧图,图片压缩,scss转成css),最后让gulp来依次执行这些task,从而构建项目的整个前端开发流程。
    webpack强调前端模块化开发,更侧重模块和打包,我们可以把开发中的所有资源(图片、js文件、css文件等)都看成模块,通过loader(加载器)和plugins(插件)对资源进行处理,打包成符合生产环境部署的前端资源。

    什么时候用grunt/gulp呢?
    如果你的工程模块依赖非常简单,甚至是没有用到模块化的概念。只需要进行简单的合并、压缩,就使用grunt/gulp即可。
    但是如果整个项目使用了模块化管理,而且相互依赖非常强, 我们就可以使用更加强大的webpack了。
    所以,grunt/gulp和webpack有什么不同呢?
    grunt/gulp更加强调的是前端流程的自动化,模块化不是它的核心。 webpack更加强调模块化开发管理,而文件压缩合并、预处理等功能,是他附带的功能。

    知道PWA吗?
    PWA全称Progressive Web App,即渐进式WEB应用。
    特点:

    1. 可靠——即时加载,即使在不确定的网络条件下也不会受到影响。
    2. 快速————— 页面展现之后,用户期望有平滑的体验,过渡动画和快速响应。
    3. 沉浸式体验—— 感觉就像设备上的原生APP,具有沉浸式的用户体验。
      PWA中包含的核心功能及特性如下:
    4. Web App Manifest(表明 表现)
    5. Service Worker
    6. Cache API 缓存
    7. Push&Notification 推送与通知
    8. Background Sync 后台同步
    9. 响应式设计
      https://www.jianshu.com/p/098af61bbe04

    函数防抖:
    函数防抖,就是指触发事件后在一定时间内(n 秒内)函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
    函数节流:
    控制函数不要频繁的执行。

    节流throttle:

    防抖debounce:

    判断数据类型??
    typeof([1,2,3])

    “object”
    typeof(“12”)

    “string”
    [1,2] instanceof Array //true
    Object.prototype.toString.call([1,2,3])

    数组有哪些去重方法??
    ● 双层for循环(效率最低)
    for (let i=0, len=arr.length; ifor (let j=i+1; jif (arr[i] == arr[j]) {
    arr.splice(j, 1);
    // splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一
    len—;
    j—;
    }
    }
    }
    ● ES6 Set
    Array.from(new Set(arr))
    //示例

    var alist = [1,2,5,3,6,2,4,6,3]
    Array.from(new Set(alist))
    [1, 2, 5, 3, 6, 4]
    ● 一层for循环+indexOf
    let arr = [1,2,3,4,3,2,3,4,6,7,6];
    let unique = (arr) => {
    let result = [];
    for( var i = 0 ; i < arr.length ; i++){
    if(result.indexOf(arr[i]) == -1){
    result.push(arr[i])
    }
    };
    return result;
    };
    unique(arr);
    ● filter+indexOf
    let arr = [1,2,3,4,3,2,3,4,6,7,6];
    let unique = (arr) => {
    return arr.filter((item,index) => {
    return arr.indexOf(item) === index;
    })
    };
    unique(arr);

    ● for of +includes
    function distinct(a, b) {
    let arr = a.concat(b)
    let result = []
    for (let i of arr) {
    if(!result.includes(i)){
    result.push(i)
    }
    }
    return result
    }

    暂停死区(暂时性死区)
    在代码块内,使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。

    写一个函数,第一秒打印1,第二秒打印2
    let 块级作用域写法
    for(let i=0;i<5;i++){
    setTimeout(function(){
    console.log(i)
    },1000i)
    }
    闭包自执行函数写法
    for(var i=0;i<5;i++){
    (function(i){
    setTimeout(function(){
    console.log(i)
    },1000
    i)
    })(i)
    }

    谈一谈Symbol
    ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因;

    怎么获得对象上的属性?
    for(let i in obj) //该方法依次访问一个对象及其原型链中所有可枚举的类型
    obj1 = {name:’xiong’,age:18,gender:’man’}
    Object.keys(obj1)

    [“name”, “age”, “gender”]
    Object.getOwnPropertyNames(obj1)

    [“name”, “age”, “gender”]

    JavaScript正则表达式:
    https://www.cnblogs.com/moqiutao/p/6513628.html
    手机号:
    /^1(3|4|5|7|8)\d{9}前端面试题1 - 图1%0AisIDCard1%3D%2F%5E%5B1-9%5D%5Cd%7B7%7D((0%5Cd)%7C(1%5B0-2%5D))((%5B0%7C1%7C2%5D%5Cd)%7C3%5B0-1%5D)%5Cd%7B3%7D#card=math&code=%2F%0A%E4%BB%A51%E5%BC%80%E5%A4%B4%EF%BC%8C%E7%AC%AC%E4%BA%8C%E4%BD%8D%E5%8F%AF%E8%83%BD%E6%98%AF3%2F4%2F5%2F7%2F8%E7%AD%89%E7%9A%84%E4%BB%BB%E6%84%8F%E4%B8%80%E4%B8%AA%EF%BC%8C%E5%9C%A8%E5%8A%A0%E4%B8%8A%E5%90%8E%E9%9D%A2%E7%9A%84%5Cd%E8%A1%A8%E7%A4%BA%E6%95%B0%E5%AD%97%5B0-9%5D%E7%9A%849%E4%BD%8D%EF%BC%8C%E6%80%BB%E5%85%B1%E5%8A%A0%E8%B5%B7%E6%9D%A511%E4%BD%8D%E7%BB%93%E6%9D%9F%E3%80%82%0A%E8%BA%AB%E4%BB%BD%E8%AF%81%EF%BC%9A%0A%2F%2F%E8%BA%AB%E4%BB%BD%E8%AF%81%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%2815%E4%BD%8D%29%0AisIDCard1%3D%2F%5E%5B1-9%5D%5Cd%7B7%7D%28%280%5Cd%29%7C%281%5B0-2%5D%29%29%28%28%5B0%7C1%7C2%5D%5Cd%29%7C3%5B0-1%5D%29%5Cd%7B3%7D&id=o924m)/;
    //身份证正则表达式(18位)
    isIDCard2=/[1]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}前端面试题1 - 图2)|(^\d{17}([0-9]|X)前端面试题1 - 图3%0A%E5%85%B6%E4%BB%96%E4%B8%80%E4%BA%9B%E6%AD%A3%E5%88%99%EF%BC%9A%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E7%BD%91%E7%BB%9C%E9%93%BE%E6%8E%A5%3A(h%7CH)(r%7CR)(e%7CE)(f%7CF)%20%3D%20(‘%7C%22)%3F(%5Cw%7C%5C%5C%7C%5C%2F%7C%5C.)%2B(‘%7C%22%7C%20%7C%3E)%3F%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E9%82%AE%E4%BB%B6%E5%9C%B0%E5%9D%80%3A%5Cw%2B(%5B-%2B.%5D%5Cw%2B)%40%5Cw%2B(%5B-.%5D%5Cw%2B)%5C.%5Cw%2B(%5B-.%5D%5Cw%2B)%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5%3A(s%7CS)(r%7CR)(c%7CC)%20%3D%20(‘%7C%22)%3F(%5Cw%7C%5C%5C%7C%5C%2F%7C%5C.)%2B(‘%7C%22%7C%20%7C%3E)%3F%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84IP%E5%9C%B0%E5%9D%80%3A(%5Cd%2B)%5C.(%5Cd%2B)%5C.(%5Cd%2B)%5C.(%5Cd%2B)%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E4%B8%AD%E5%9B%BD%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%EF%BC%88%E5%8C%85%E6%8B%AC%E7%A7%BB%E5%8A%A8%E5%92%8C%E5%9B%BA%E5%AE%9A%E7%94%B5%E8%AF%9D%EF%BC%89%3A(%5C(%5Cd%7B3%2C4%7D%5C)%7C%5Cd%7B3%2C4%7D-%7C%5Cs)%3F%5Cd%7B7%2C14%7D%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E4%B8%AD%E5%9B%BD%E9%82%AE%E6%94%BF%E7%BC%96%E7%A0%81%3A%5B1-9%5D%7B1%7D(%5Cd%2B)%7B5%7D%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E4%B8%AD%E5%9B%BD%E8%BA%AB%E4%BB%BD%E8%AF%81%E5%8F%B7%E7%A0%81%3A%5Cd%7B18%7D%7C%5Cd%7B15%7D%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E6%95%B4%E6%95%B0%EF%BC%9A%5Cd%2B%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E6%B5%AE%E7%82%B9%E6%95%B0%EF%BC%88%E5%8D%B3%E5%B0%8F%E6%95%B0%EF%BC%89%EF%BC%9A(-%3F%5Cd)%5C.%3F%5Cd%2B%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E4%BB%BB%E4%BD%95%E6%95%B0%E5%AD%97%20%EF%BC%9A(-%3F%5Cd)(%5C.%5Cd%2B)%3F%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E4%B8%AD%E6%96%87%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9A%5B%5Cu4e00-%5Cu9fa5%5D%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E5%8F%8C%E5%AD%97%E8%8A%82%E5%AD%97%E7%AC%A6%E4%B8%B2%20(%E6%B1%89%E5%AD%97)%EF%BC%9A%5B%5E%5Cx00-%5Cxff%5D%0A%E5%8E%BB%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%A6%96%E5%B0%BE%E7%A9%BA%E6%A0%BC%EF%BC%9F%EF%BC%9F%0A%2F(%5E%5Cs)%7C(%5Cs*#card=math&code=%29%0A%E5%85%B6%E4%BB%96%E4%B8%80%E4%BA%9B%E6%AD%A3%E5%88%99%EF%BC%9A%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E7%BD%91%E7%BB%9C%E9%93%BE%E6%8E%A5%3A%28h%7CH%29%28r%7CR%29%28e%7CE%29%28f%7CF%29%20%2A%3D%20%2A%28%27%7C%22%29%3F%28%5Cw%7C%5C%5C%7C%5C%2F%7C%5C.%29%2B%28%27%7C%22%7C%20%2A%7C%3E%29%3F%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E9%82%AE%E4%BB%B6%E5%9C%B0%E5%9D%80%3A%5Cw%2B%28%5B-%2B.%5D%5Cw%2B%29%2A%40%5Cw%2B%28%5B-.%5D%5Cw%2B%29%2A%5C.%5Cw%2B%28%5B-.%5D%5Cw%2B%29%2A%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5%3A%28s%7CS%29%28r%7CR%29%28c%7CC%29%20%2A%3D%20%2A%28%27%7C%22%29%3F%28%5Cw%7C%5C%5C%7C%5C%2F%7C%5C.%29%2B%28%27%7C%22%7C%20%2A%7C%3E%29%3F%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84IP%E5%9C%B0%E5%9D%80%3A%28%5Cd%2B%29%5C.%28%5Cd%2B%29%5C.%28%5Cd%2B%29%5C.%28%5Cd%2B%29%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E4%B8%AD%E5%9B%BD%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%EF%BC%88%E5%8C%85%E6%8B%AC%E7%A7%BB%E5%8A%A8%E5%92%8C%E5%9B%BA%E5%AE%9A%E7%94%B5%E8%AF%9D%EF%BC%89%3A%28%5C%28%5Cd%7B3%2C4%7D%5C%29%7C%5Cd%7B3%2C4%7D-%7C%5Cs%29%3F%5Cd%7B7%2C14%7D%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E4%B8%AD%E5%9B%BD%E9%82%AE%E6%94%BF%E7%BC%96%E7%A0%81%3A%5B1-9%5D%7B1%7D%28%5Cd%2B%29%7B5%7D%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E4%B8%AD%E5%9B%BD%E8%BA%AB%E4%BB%BD%E8%AF%81%E5%8F%B7%E7%A0%81%3A%5Cd%7B18%7D%7C%5Cd%7B15%7D%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E6%95%B4%E6%95%B0%EF%BC%9A%5Cd%2B%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E6%B5%AE%E7%82%B9%E6%95%B0%EF%BC%88%E5%8D%B3%E5%B0%8F%E6%95%B0%EF%BC%89%EF%BC%9A%28-%3F%5Cd%2A%29%5C.%3F%5Cd%2B%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E4%BB%BB%E4%BD%95%E6%95%B0%E5%AD%97%20%EF%BC%9A%28-%3F%5Cd%2A%29%28%5C.%5Cd%2B%29%3F%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E4%B8%AD%E6%96%87%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9A%5B%5Cu4e00-%5Cu9fa5%5D%2A%0A%E6%8F%90%E5%8F%96%E4%BF%A1%E6%81%AF%E4%B8%AD%E7%9A%84%E5%8F%8C%E5%AD%97%E8%8A%82%E5%AD%97%E7%AC%A6%E4%B8%B2%20%28%E6%B1%89%E5%AD%97%29%EF%BC%9A%5B%5E%5Cx00-%5Cxff%5D%2A%0A%E5%8E%BB%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%A6%96%E5%B0%BE%E7%A9%BA%E6%A0%BC%EF%BC%9F%EF%BC%9F%0A%2F%28%5E%5Cs%2A%29%7C%28%5Cs%2A&id=Hef1J))/g

    “ xiong “.replace(/(^\s)|(\s$)/g,””)
    “xiong”

    $1 $2 $3 …$9分别表示()分组匹配到的内容
    var str = ‘123-mm’;
    var strReg = str.replace(/(\d+)-([A-Za-z]+)/g,’$2’);
    console.log(strReg)//mm 上面那段$2这个就是表示正则第二组个匹配到的内容

    var str = “Hellllo world”;
    str = str.replace(/(l)\1/g, ‘$1’);

    解析:
    对于正则表达式 /(l)\1/g,其中(l)是第一个分组,\1指向第一个分组,即\1重复了第一个分组的内容,所以该正则表达式可以表示成/(ll)/g
    而对于第二个参数$1,表示用第一个分组的内容 l 对匹配到的部分进行替换(即 ll 替换成 l ),同时正则表达式有g表示全局匹配,所以4个ll被替换成2个ll。


    1. 1-9 ↩︎