js复习

1.数据类型
number string Boolean undefined null object
es6新增属性symbol
判断数据类型 typeof instanceof
2 ===和==的区别,

    ===会判断类型和值    ==只判断值    比如 “6”==6是成立的   undefined==null    

    判断值的时候  想到 []!=[]        NAN!=NAN       ES6新语法  Number.isNaN(NaN)的结果是true   

        es6中专门用来判断变量是NAN的方法  Number.isNaN()

3 js onload和DOMcontentloaded的区别 这也是jq加载函数和JS 的onload的区别

        window.onload 事件在所有页面元素(包括图片,脚本等)都下载完毕后才会触发。

        除了 IE,其它浏览器支持 DOMContentLoaded 事件。当 DOM 内容下载完毕,就会立刻触发。

        针对 IE,有各种模拟 DOMContentLoaded 事件的办法。目前被广泛采纳的方案是判断 document 是否可以滚动(doScroll)。一旦可以        滚   动,就意味着 DOM Content 已经加载完毕。

4 给10个li添加点击事件。弹出下标
给每个li定义一个属性索引值,赋
alert("下标索引值为:"+this.index+"\n"+"文本内容是:"+this.innerHTML); // \n换行 索引值从0开始
5.通过字符串拼接添加dom元素和通过appendchild添加dom有什么区别,那个更好?
与parentNode.appendChild()的区别在于:
parentNode.append()可以同时传入多个节点或字符串,没有返回值;他会有兼容问题
而parentNode.appendChild()只能传一个节点,且不直接支持传字符串(需要parentNode.appendChild(document.createTextElement('字符串'))代替),返回追加的Node节点

6 你都使用什么实现模块加载?
在es6之前,js不像其他语言自带成熟的模块化功能,页面只能靠插入一个个script标签来引入自己的或第三方的脚本,并且容易带来命名冲突的问题。js社区做了很多努力,在当时的运行环境中,实现"模块"的效果。

通用的js模块化标准有CommonJS与AMD,前者运用于node环境,后者在浏览器环境中由Require.js等实现。此外还有国内的开源项目Sea.js,遵循CMD规范。(目前随着es6的普及已经停止维护,不论是AMD还是CMD,都将是一段历史了)
一、模块化加载的技术原理

7 如何对数组随机排序?
var arr = [1,2,3,4,5]; console.log(arr.sort(function(){return Math.random()-0.5;})); //结果:[4, 2, 1, 5, 3];

这个主要思路就是sort是根据后面的参数的正负来排序,我们取个随机数0~1,这个以0.5为分界线(这个不难理解吧,如果理解不了去回炉中小学数学)。

sort方法说明:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值

8 如何理解原型和原型链?


12905187-e3f167108c23f52c.png

谈谈你对模块化的理解?
模块化(Modularity)这个概念与其说是一种创新,不如说是一个"发现"。这正是人们在解决问题时常用的行为方式和思维过程。它不是单纯的技术问题,更深深地影响着整个社会生活。可以读读<<设计原则:模块化的力量>>, 在<<Unxi编程艺术>>第4章也提到了这本书!

我们获取知识有两个重要的方式:归纳(conclude)和演绎(deduce),不用多解释。它们其实就是自下而上和自上而下的差别。人类有与生俱来的抽象思维能力,沟通问题时使用隐喻会大大提升效率。太多的琐事常常影响我们的判断力,所以我们总是在追求分理主次,简化问题。社会的发展带来了越来越多样的社会分工,在亚当.斯密的<<国富论>>讲到了社会分工的必然性。整个世界都在分分合合中保持着一种稳定,发展形势上也有自下而上和自上而下之分。

所以模块化正是我们思维习惯的体现,它的发现是一个必然的结果。它的目的可以概括为:

1.信息隐藏 (抽象,黑盒)。

2.分工 (正交性,聚合)。

分工同时可以更容易实现并行开发,带来开发效率的提升。而信息隐藏则降低了对程序员的要求,能够更好地掌握模块内的复杂度。而最终是一个经济目的:低成本。

经济上定义了公司的一个决策行为,当内部生产的成本高于在开放市场上购买的成本时,就不会自己生产,而是转向购买。 也就是分工合作。模块就像不同的公司,上下游之间有着各式各样的互动。当公司/模块独立运作(低耦合)时,只关注公司/模块间的契约或合同(信息隐藏),这就是模块化。可以宏观的看(不同的公司或国家),也可以微观的看(不同的部门或器官)。并且模块化本身是动态的过程,合合分分。 当发现两个公司产品线相互紧密依赖(内部生产的成本优于在市场上采购)或相似(整合会产生规模效应),就会出现并购。当公司内部某个产品线与其它产品线开始分化(更好或更差,或者经营目标等不一致时),就可能会分拆。

模块化的要素

模块化的第一要素是角色和责任(Role&Responsibility, HR上的一个概念,能引起一些思考.)。如果焦点只关注在模块,容易造成局部最优,但整体不佳的问题。这也正是约束理论要解决的问题。所以还要有标准。从系统的层级定义一个模块的目标功能,划分好角色,来约束模块的演进,以保证整体系统的最优。

模块化的第二个要素是接口,包括静态的接口定义(职责)和动态的交互定义(行为方式,如何协作,异常处理等),也可以概括为契约(contract),在技术上则称为接口(interface)。

所以模块化设计要从大的系统视角规划角色,又要从小的模块视角设计协作的细节,中间一定不断有冲突,要经过不断演化来达到一个相对稳定的结构,这取决于时间和成本上的考虑。

*在软件开发中,模块化和语言无关,关键是领域,也就是业务面的问题。这也和敏捷与否无关,不同的只是模块化程度的问题。

跨域是如何产生的,解决方式是什么?
浏览器的同源策略是浏览器上为安全性考虑实施的非常重要的安全策略。
从一个域上加载的脚本不允许访问另外一个域的文档属性。
举个例子:比如一个恶意网站的页面通过iframe嵌入了银行的登录页面(二者不同源),
如果没有同源限制,恶意网页上的javascript脚本就可以在用户登录银行的时候获取用户名和密码。
何谓同源:URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示它们同源。
在浏览器中,<script>、<img>、<iframe>、<link>等标签都可以加载跨域资源,而不受同源限制,
但浏览器会限制脚本中发起的跨域请求。比如,使用 XMLHttpRequest 对象和Fetch发起 HTTP 请求就必须遵守同源策略。
Web 应用程序通过 XMLHttpRequest 对象或Fetch能且只能向同域名的资源发起 HTTP 请求,而不能向任何其它域名发起请求。
不允许跨域访问并非是浏览器限制了发起跨站请求,而是跨站请求可以正常发起,但是返回结果被浏览器拦截了。
最好的例子是CSRF跨站攻击原理,请求是发送到了后端服务器,无论是否设置允许跨域,
有些浏览器不允许从HTTPS跨域访问HTTP,比如Chrome和Firefox,这些浏览器在请求还未发出的时候就会拦截请求,这是特例。

克服跨域限制的方法有(实践中后两种最常用,所以重点介绍):
(1)通过jsonp跨域
(2)通过修改document.domain来跨子域
(3)使用window.name来进行跨域
(4)使用HTML5中新引进的window.postMessage方法来跨域传送数据
(5)使用代理服务器,使用代理方式跨域更加直接,因为同源限制是浏览器实现的。如果请求不是从浏览器发起的,就不存在跨域问题了。
使用本方法跨域步骤如下:

  1. 把访问其它域的请求替换为本域的请求
  2. 服务器端的动态脚本负责将本域的请求转发成实际的请求
    为了通过Ajax从http://localhost:8080访问http://localhost:8081/api,可以将请求发往http://localhost:8080/api
    然后利用Apache Web服务器的Reverse Proxy功能做如下配置:ProxyPass /api http://localhost:8081/api
    (6)CORS全称是"跨域资源共享"(Cross-origin resource sharing),CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能
    (IE浏览器不能低于IE10),因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
    浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)
    (1) 请求方法是以下三种方法之一:HEAD GET POST
    (2)HTTP的头信息不超出以下几种字段:Accept Accept-Language Content-Language Last-Event-ID
    Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
    凡是不同时满足上面两个条件,就属于非简单请求。

对于简单请求,浏览器在发出CORS请求时会在头信息之中增加一个Origin字段。服务器的返回会多出3个字段:
Access-Control-Allow-Origin(必须) 允许跨域的源
Access-Control-Allow-Credentials(可选) 表示是否允许发送Cookie。默认情况下,Cookie可以包含在请求中,一起发给服务器
如果服务器不需要浏览器发送Cookie,删除该字段即可。
Access-Control-Expose-Headers(可选) CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:
Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,
就必须在Access-Control-Expose-Headers里面指定。如指定Access-Control-Expose-Headers: FooBar,则可通过
getResponseHeader('FooBar')获取FooBar字段的值。

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。
非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。
"预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,
浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

ajax 对象建立 open send 等待数据 接受数据?
2.1 数据发送方面:
λ open方法绑定一个发送过程,但不发送数据。Send用于开始数据的发送过程。
λ open方法最后一个参数为true时表示异步,否则表示同步。send方法可以传入一个参数,在open方法的第一个参数为"POST"时有用,为要post的数据,在"GET"时忽略该参数。
2.2 数据接受方面:
λ 同步的时候,send方法要接收到服务器返回的数据后才返回。
λ 在异步的时候,send调用后立即返回,服务器返回的数据在onreadystatechange设置的异步回调里面进行读取

12 图片懒加载原理 ?
原理:先将img标签中的src链接设为同一张图片(空白图片),将其真正的图片地址存储再img标签的自定义属性中(比如data-src)。当js监听到该图片元素进入可视窗口时,即将自定义属性中的地址存储到src属性中,达到懒加载的效果。
这样做能防止页面一次性向服务器响应大量请求导致服务器响应慢,页面卡顿或崩溃等问题。

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

推荐阅读更多精彩内容