第一次面试总结

一、如何根据音量大小制作会跳动的音波特效

1、使用AudioContext接口new这个对象创建上下文
AudioContext接口表示由链接在一起的音频模块构建的音频处理图,每个模块由一个AudioNode表示。音频上下文控制它包含的节点的创建和音频处理或解码的执行。在做任何其他操作之前,您需要创建一个AudioContext对象,因为所有事情都是在上下文中发生的。建议创建一个AudioContext对象并复用它,而不是每次初始化一个新的AudioContext对象,并且可以对多个不同的音频源和管道同时使用一个AudioContext对象。
2、audioContext.createMediaElementSource(elem)从该元素获取源并将其通过管道传递到我们创建的上下文中
3、 audioContext.createAnalyser()创建一个Analyser节点,获取音频时间和频率数据,来实现可视化
4、 AnalyserNode.fftsize,这是一个无符号长整型的数,默认值为2048,表示样本的窗口大小,用来获取频域数据

二、如何制作上传文件并可以在本地预览

文件上传需要使用<input type=”file”/>,如下:

<input type="file" name="upload" mutipart accept="image/*">
<!--
    ** 可用属性 **
    type: file(必填),必须为file
    multipart: 指示是否可以多选
    accept : 指示文件类型,指示可选择的文件,使用逗号(,)分隔
        可能的值为:
        * 后缀,如.jpg,.png
        * 一个有效的MIME type
        * audio/* 音乐文件
        * video/* 视频文件
        * image/* 图片文件
-->
原理

通过input的 type = file属性和window的内置FileReader对象,利用FileReader对象的readAsDataURL方法,把图片数据转成base64字符串数据,然后把这个base64字符串数据赋值给一个图片标签的src。

伪代码
//input标签,获取本地图片
<input type="file" onchange="uploadImg(this)" accept="image/*"/>

//预览图片标签
 <img id="viewImg"/>


 function uploadImg(fileDom) {
    //取到file文件的本地路径,就是你电脑上的存储路径
    console.log(fileDom.value);

    // 获取图片数据对象
    var file = fileDom.files[0];

    // 获取图片名字
    console.log(file.name); 

    // 获取图片文件大小,单位为byte
    console.log(file.size);

    var reader = new FileReader();
    reader.readAsDataURL(file);

    //确保文件成功获取,base64数据量比较大
    reader.onload = function (event) {
        var e = event || window.event
        var img = document.getElementById("viewImg");
        img.src = e.target.result;
        //或者 img.src = this.result; 因为e.target == this
    }
}
知识延伸

FileReader除了readAsDataURL方法之外,还有另外两个比较重要的方法,分别为readAsBinaryString 将选择的文件读取成二进制和readAsText将选择的文件读取成文本格式 ;

三、跨域

同源策略

一个域下的 js 脚本在未经允许的情况下,不能够访问另一个域的内容。这里的同源的指的是两个域的协议、域名、端口号必须相同,否则不属于同一个域。

同源政策主要限制了三个方面:

  • 第一个是当前域下的 js 脚本不能够访问其他域下的 cookie、localStorage 和 indexDB。
  • 第二个是当前域下的 js 脚本不能够操作访问操作其他域下的 DOM。
  • 第三个是当前域下 ajax 无法发送跨域请求。

同源政策的目的主要是为了保证用户的信息安全,对于一般的 img、或者
script 脚本请求都不会有跨域的限制,因为这些操作都不会通过响应结果来进行可能出现安全问题的操作。

解决跨域的方法
  • 通过 jsonp 跨域
    使用 jsonp 来实现跨域请求,它的主要原理是通过动态构建 script 标签来实现跨域请求,因为浏览器对 script 标签的引入没有跨域的访问限制 。通过在请求的 url 后指定一个回调函数,然后服务器在返回数据的时候,构建一个 json 数据的包装,这个包装就是回调函数,然后返回给前端,前端接收到数据后,因为请求的是脚本文件,所以会直接执行,这样我们先前定义好的回调函数就可以被调用,从而实现了跨域请求的处理。这种方式只能用于 get 请求

  • 跨域资源共享(CORS)
    Access-Control-Allow-origin: 允许请求的方法/*(办事多源,但是不能携带cookie)
    Access-Control-Allow-Methods:允许的方法,多个方法用逗号分开
    Access-Control-Allow-Headers:允许的头信息,多个方法用逗号分开
    Access-Control-Allow-Credentials:true(跨资源请求发送的凭据cookie等)

  • Proxy代理

  • nginx 代理跨域

  • postMessage 跨域
    h5 中新增的一个 api。通过它我们可以实现多窗口间的信息传递,通过获取到指定窗口的引用,然后调用 postMessage 来发送信息,在窗口中我们通过对 message 信息的监听来接收信息,以此来实现不同源间的信息交换。

  • WebSocket 协议跨域
    使用 websocket 协议,这个协议没有同源限制。

  • document.domain + iframe 跨域
    只能实现同一个主域,不同子域之间的操作

如果是想要解决不同跨域窗口间的通信问题,比如说一个页面想要和页面的中的不同源的 iframe 进行通信的问题,我们可以使用 location.hash 或者 window.name 或者 postMessage 来解决。

  • window.name + iframe 跨域
    主要是基于同一个窗口中设置了 window.name 后不同源的页面也可以访问,所以不同源的子页面可以首先在 window.name 中写入数据,然后跳转到一个和父级同源的页面。这个时候级页面就可以访问同源的子页面中 window.name 中的数据了,这种方式的好处是可以传输的数据量大。

  • location.hash + iframe
    我们可以在主页面动态的修改 iframe 窗口的 hash 值,然后在 iframe 窗口里实现监听函数来实现这样一个单向的通信。因为在 iframe 是没有办法访问到不同源的父级窗口的,所以我们不能直接修改父级窗口的 hash 值来实现通信,我们可以在 iframe 中再加入一个 iframe ,这个 iframe 的内容是和父级页面同源的,所以我们可以 window.parent.parent 来修改最顶级页面的 src,以此来实现双向通信。
    缺点: 传入的数据值有限

四、[ ] == [ ] 和 { } =={ }输出值?null == null?

false false true

堆、栈

栈(stack):先进后出;自动分配内存空间,由系统自动释放;

堆(heap):队列优先,先进先出;动态分配内存,大小不定也不会自动释放;存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定;一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。

js中基本数据类型和引用数据类型

基本类型:存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。
Undefined / Null / Boolean / Number / String,它们是直接按值存放的,可以直接访问。

引用类型:存放在堆内存中的对象;每个空间大小不一样,根据情况进行特定的分配。

当我们需要访问引用数据类型 (对象 / 数组 / 函数) 的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。

所以,现在就可以解释 var a = function(){}; var b = function(){}; a==b 为false,null == nul为true
变量a实际保存的是指向堆内存中对象的一个指针,而b保存的是指向堆内存中另一个对象的一个指针;虽然这两个对象的值是一样的,但它们是独立的2个对象,占了2份内存空间;所以 a==b 为 false。

如果 var a = {}; var b = a; 这时变量b复制了变量a保存的指针,它们都指向堆内存中同一个对象;所以 a==b 为 true。

五、react的优点

优点
1、React速度很快:它并不直接对DOM进行操作,引入了一个叫做虚拟DOM的概念,安插在javascript逻辑和实际的DOM之间,性能好。
2、跨浏览器兼容:虚拟DOM帮助我们解决了跨浏览器问题,它为我们提供了标准化的API,甚至在IE8中都是没问题的。
3、一切都是component:代码更加模块化,重用代码更容易,可维护性高。
4、单向数据流:Flux是一个用于在JavaScript应用中创建单向数据层的架构,它随着React视图库的开发而被Facebook概念化。
5、同构、纯粹的javascript:因为搜索引擎的爬虫程序依赖的是服务端响应而不是JavaScript的执行,预渲染你的应用有助于搜索引擎优化。
6、兼容性好:比如使用RequireJS来加载和打包,而Browserify和Webpack适用于构建大型应用。它们使得那些艰难的任务不再让人望而生畏。

缺点
1、React本身只是一个V而已,并不是一个完整的框架,所以如果是大型项目想要一套完整的框架的话,基本都需要加上ReactRouter和Flux才能写大型应用。

六、制作滚动条?如果用原生的话如何实现?

audio的属性以及百分比实现

  • currentTime
  • duration 持续时间
  • audio.onloadedmetadata加载完元数据触发事件
拖动进度条的时候有哪些实现方式? 区别有哪些?
  • lefttranslateX可以拖动
    • 从布局看,left属性基于父元素的大小。transform属性基于目标元素的大小。
    • 从属范围看,left 常用于position,属于css2,而translate属于transformcss3
    • 从实现动画来看,两个都能实现位移动画,但是对于位移较为复杂的情况下,使用transformleft要好点
    • 从渲染方式来看,position设置的是DOM的样式,性能消耗大

七、强制类型转换

  • boolean
  • string
  • number
  • parseInt()
  • parseFloat()

八、事件循环

https://zhuanlan.zhihu.com/p/87684858

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • $HTML, HTTP,web综合问题 1、前端需要注意哪些SEO 3、HTTP的几种请求方法用途 4、从浏览器地...
    peng凯阅读 771评论 0 1
  • Web前端面试题总结 HTML+CSS理论知识 1、讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a.域...
    慕尚花开阅读 691评论 0 0
  • 前端开发面试知识点大纲: HTML&CSS: 对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:...
    秀才JaneBook阅读 2,362评论 0 25
  • 一.简述前端构建工具。fis3,Gulp,Grunt,Webpack www.tuicool.com/articl...
    錢小强_阅读 1,323评论 0 5
  • 一、CSS相关问题 1、 行内元素,块级元素,空元素 行内元素有:a b span select strong(强...
    余音绕梁_0809阅读 547评论 0 0