精华内容
下载资源
问答
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    此外,可以直接检查 /var/log/messages文件,在该文件中可以找到计算机开机后系统已辨认出来的设备代号。 (3)查找挂接点 在决定将设备挂接之前,先要查看一下计算机是不是有个/mnt的空目录,该目录就是专门用来...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    正则表达式构造函数var reg=new RegExp(“xxx”)与正则表达字面量var reg=//有什么不同?匹配邮箱的正则表达式? 63 看下面代码,给出输出结果。 63 写一个function,清除字符串前后的空格。(兼容所有浏览器) ...

    前端面试题汇总

    一、HTML和CSS 21

    1. 你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? 21
    2. 每个HTML文件里开头都有个很重要的东西,Doctype,知道这是干什么的吗? 21
    3. Quirks模式是什么?它和Standards模式有什么区别 21
    4. div+css的布局较table布局有什么优点? 22
    5. img的alt与title有何异同? strong与em的异同? 22
    6. 你能描述一下渐进增强和优雅降级之间的不同吗? 23
    7. 为什么利用多个域名来存储网站资源会更有效? 23
    8. 请谈一下你对网页标准和标准制定机构重要性的理解。 24
    9. 请描述一下cookies,sessionStorage和localStorage的区别? 24
    10. 简述一下src与href的区别。 24
    11. 知道的网页制作会用到的图片格式有哪些? 25
    12. 知道什么是微格式吗?谈谈理解。在前端构建中应该考虑微格式吗? 25
    13. 在css/js代码上线之后开发人员经常会优化性能,从用户刷新网页开始,一次js请求一般情况下有哪些地方会有缓存处理? 25
    14. 一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验。 25
    15. 你如何理解HTML结构的语义化? 26
    16. 谈谈以前端角度出发做好SEO需要考虑什么? 27
    17. 有哪项方式可以对一个DOM设置它的CSS样式? 28
    18. CSS都有哪些选择器? 28
    19. CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内? 29
    20. 超链接访问过后hover样式就不出现的问题是什么?如何解决? 29
    21. 什么是Css Hack?ie6,7,8的hack分别是什么? 30
    22. 行内元素和块级元素的具体区别是什么?行内元素的padding和margin可设置吗? 30
    23. 什么是外边距重叠?重叠的结果是什么? 31
    24. rgba()和opacity的透明效果有什么不同? 31
    25. css中可以让文字在垂直和水平方向上重叠的两个属性是什么? 31
    26. 如何垂直居中一个浮动元素? 31
    27. px和em的区别。 32
    28. 描述一个”reset”的CSS文件并如何使用它。知道normalize.css吗?你了解他们的不同之处? 33
    29. Sass、LESS是什么?大家为什么要使用他们? 33
    30. display:none与visibility:hidden的区别是什么? 33
    31. CSS中link和@import的区别是: 34
    32. 简介盒子模型: 34
    33. 为什么要初始化样式? 34
    34. BFC是什么? 35
    35. html语义化是什么? 35
    36. Doctype的作用?严格模式与混杂模式的区别? 35
    37. IE的双边距BUG:块级元素float后设置横向margin,ie6显示的margin比设置的较大。 35
    38. HTML与XHTML——二者有什么区别? 35
    39. html常见兼容性问题? 36
    40. 对WEB标准以及W3C的理解与认识 36
    41. 行内元素有哪些?块级元素有哪些?CSS的盒模型? 36
    42. 前端页面有哪三层构成,分别是什么?作用是什么? 37
    43. Doctype作用? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义? 37
    44. 行内元素有哪些?块级元素有哪些? 空(void)元素有那些? 37
    45. CSS的盒子模型? 37
    46. CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? CSS3新增伪类有那些? 37
    47. 如何居中div,如何居中一个浮动元素? 38
    48. 浏览器的内核分别是什么?经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么,常用hack的技巧 ? 39
    49. 列出display的值,说明他们的作用。position的值, relative和absolute定位原点是? 40
    50. absolute的containing block计算方式跟正常流有什么不同? 40
    51. 对WEB标准以及W3C的理解与认识 41
    52. css的基本语句构成是? 41
    53. 浏览器标准模式和怪异模式之间的区别是什么? 41
    54. CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内? 41
    55. 行内元素和块级元素的具体区别是什么?行内元素的padding和margin可设置吗? 42
    56. 什么是外边距重叠?重叠的结果是什么? 42
      58、描述一个"reset"的CSS文件并如何使用它。知道normalize.css吗?你了解他们的不同之处? 42
    57. 说display属性有哪些?可以做什么? 43
    58. 哪些css属性可以继承? 43
    59. css优先级算法如何计算? 43
    60. b标签和strong标签,i标签和em标签的区别? 43
    61. 有那些行内元素、有哪些块级元素、盒模型? 43
    62. 有哪些选择符,优先级的计算公式是什么?行内样式和!important哪个优先级高? 45
    63. 我想让行内元素跟上面的元素距离10px,加margin-top和padding-top可以吗? 45
    64. CSS的盒模型由什么组成? 45
    65. 说说display属性有哪些?可以做什么? 46
    66. 哪些css属性可以继承? 46
    67. css优先级算法如何计算? 46
      二、JS基础 46
    68. javascript的typeof返回哪些数据类型 46
    69. 例举3种强制类型转换和2种隐式类型转换? 47
    70. split() 、join() 的区别 47
    71. 数组方法pop() push() unshift() shift() 47
    72. 事件绑定和普通事件有什么区别 47
    73. IE和DOM事件流的区别 48
    74. IE和标准下有哪些兼容性的写法 48
    75. call和apply的区别 49
    76. b继承a的方法 49
    77. 如何阻止事件冒泡和默认事件 50
    78. 添加 删除 替换 插入到某个接点的方法 50
    79. javascript的本地对象,内置对象和宿主对象 50
    80. window.onload 和document ready的区别 50
    81. ”和“=”的不同 51
    82. javascript的同源策略 51
    83. JavaScript是一门什么样的语言,它有哪些特点? 51
    84. JavaScript的数据类型都有什么? 52
    85. 已知ID的Input输入框,希望获取这个输入框的输入值,怎么做?(不使用第三方框架) 53
    86. 希望获取到页面中所有的checkbox怎么做?(不使用第三方框架) 53
    87. 设置一个已知ID的DIV的html内容为xxxx,字体颜色设置为黑色(不使用第三方框架) 53
    88. 当一个DOM节点被点击时候,我们希望能够执行一个函数,应该怎么做? 53
    89. 看下列代码输出为何?解释原因。 54
    90. 看下列代码,输出什么?解释原因。 54
    91. 看下列代码,输出什么?解释原因。 54
    92. 看代码给答案。 56
    93. 已知数组var stringArray = [“This”, “is”, “Baidu”, “Campus”],Alert出”This is Baidu Campus”。 56
    94. 已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”。 56
    95. var numberArray = [3,6,2,4,1,5]; (考察基础API) 57
    96. 输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26 57
    97. 将字符串”{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲</td><td>{name}”中的{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲替换成10,{name}替换成Tony (使用正则表达式) 58
    98. 为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数escapeHtml,将<, >, &, “进行转义 58
    99. foo = foo||bar ,这行代码是什么意思?为什么要这样写? 59
    100. 看下列代码,将会输出什么?(变量声明提升) 59
    101. 用js实现随机选取10–100之间的10个数字,存入一个数组,并排序。 60
    102. 把两个数组合并,并删除第二个元素。 61
    103. 怎样添加、移除、移动、复制、创建和查找节点(原生JS,实在基础,没细写每一步) 61
    104. 有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}。 62
    105. 正则表达式构造函数var reg=new RegExp(“xxx”)与正则表达字面量var reg=//有什么不同?匹配邮箱的正则表达式? 63
    106. 看下面代码,给出输出结果。 63
    107. 写一个function,清除字符串前后的空格。(兼容所有浏览器) 64
    108. Javascript中callee和caller的作用? 65
    109. Javascript中, 以下哪条语句一定会产生运行错误? 答案( B C ) 66
    110. 以下两个变量a和b,a+b的哪个结果是NaN? 答案( AC ) 66
    111. var a=10; b=20; c=4; ++b+c+a++ 以下哪个结果是正确的?答案( B ) 66
    112. 下面的JavaScript语句中,( D )实现检索当前页面中的表单元素中的所有文本框,并将它们全部清空 66
    113. 要将页面的状态栏中显示“已经选中该文本框”,下列JavaScript语句正确的是( A ) 67
    114. 以下哪条语句会产生运行错误:(AD) 67
    115. 以下哪个单词不属于javascript保留字:(B) 67
    116. 请选择结果为真的表达式:(C) 68
    117. Javascript中, 如果已知HTML页面中的某标签对象的id=”username”,用____document.getElementById(‘username’)___ _方法获得该标签对象。 68
    118. typeof运算符返回值中有一个跟javascript数据类型不一致,它是________”function”_________。 68
    119. 定义了一个变量,但没有为该变量赋值,如果alert该变量,javascript弹出的对话框中显示___undefined______ 。 68
    120. 分析代码,得出正确的结果。 68
    121. 写出函数DateDemo的返回结果,系统时间假定为今天 68
    122. 写出程序运行的结果? 69
    123. 阅读以下代码,请分析出结果: 69
    124. 补充按钮事件的函数,确认用户是否退出当前页面,确认之后关闭窗? 69
    125. 写出简单描述html标签(不带属性的开始标签和结束标签)的正则表达式,并将以下字符串中的html标签去除掉 70
    126. 完成foo()函数的内容,要求能够弹出对话框提示当前选中的是第几个单选框。 70
    127. 完成函数showImg(),要求能够动态根据下拉列表的选项变化,更新图片的显示 71
    128. 截取字符串abcdefg的efg 72
    129. 列举浏览器对象模型BOM里常用的至少4个对象,并列举window对象的常用方法至少5个 72
    130. 简述列举文档对象模型DOM里document的常用的查找访问节点的方法并做简单说明 72
    131. 希望获取到页面中所有的checkbox怎么做?(不使用第三方框架) 72
    132. 简述创建函数的几种方式 73
    133. Javascript如何实现继承? 73
    134. Javascript创建对象的几种方式? 73
    135. iframe的优缺点? 75
    136. 请你谈谈Cookie的弊端? 75
    137. js延迟加载的方式有哪些? 76
    138. documen.write和 innerHTML 的区别? 76
    139. 哪些操作会造成内存泄漏? 76
    140. 判断一个字符串中出现次数最多的字符,统计这个次数 77
    141. 写一个获取非行间样式的函数 77
    142. 事件委托是什么 78
    143. 闭包是什么,有什么特性,对页面有什么影响 78
    144. 解释jsonp的原理,以及为什么不是真正的ajax 79
    145. javascript的本地对象,内置对象和宿主对象 79
    146. 字符串反转,如将 ‘12345678’ 变成 ‘87654321’ 79
    147. 将数字 12345678 转化成 RMB形式 如: 12,345,678  79
    148. 生成5个不同的随机数; 80
    149. 去掉数组中重复的数字 方法一; 81
    150. 阶乘函数; 82
    151. window.location.search() 返回的是什么? 83
    152. window.location.hash 返回的是什么? 83
    153. window.location.reload() 作用? 83
    154. 、javascript 中的垃圾回收机制? 83
    155. 看题做答: 84
    156. 下面输出多少? 84
    157. 再来一个 85
    158. a输出多少? 86
    159. 看程序,写结果 87
    160. JS的继承性 87
    161. 精度问题: JS 精度不能精确到 0.1 所以  。。。。同时存在于值和差值中 88
    162. 加减运算 88
    163. 什么是同源策略? 88
    164. 为什么不能定义1px左右的div容器?    89
    165. 结果是什么? 89
    166. 输出结果 89
    167. 计算字符串字节数: 90
    168. 结果是: 90
    169. 声明对象,添加属性,输出属性 91
    170. 匹配输入的字符:第一个必须是字母或下划线开头,长度5-20 91
    171. 检测变量类型 92
    172. 如何在HTML中添加事件,几种方法? 92
    173. BOM对象有哪些,列举window对象? 92
    174. 请问代码实现 outerHTML 93
    175. JS中的简单继承 call方法! 94
    176. bind(), live(), delegate()的区别 95
    177. 看下列代码输出什么? 96
    178. 看下列代码,输出什么? 96
    179. 你如何优化自己的代码? 96
    180. 请描述出下列代码运行的结果 96
    181. 怎样实现两栏等高? 97
    182. 使用js实现这样的效果:在文本域里输入文字时,当按下enter键时不换行,而是替换成“{{enter}}”,(只需要考虑在行尾按下enter键的情况). 98
    183. 以下代码中end字符串什么时候输出 98
    184. specify(‘hello,world’)//=>’h,e,l,l,o,w,o,r,l,d’实现specify函数 99
    185. 请将一个URL的search部分参数与值转换成一个json对象 99
    186. 请用原生js实现jquery的get\post功能,以及跨域情况下 99
    187. 请简要描述web前端性能需要考虑哪方面,你的优化思路是什么? 99
    188. 、简述readyonly与disabled的区别 99
    189. 写出3个使用this的典型应用 100
    190. 请尽可能详尽的解释ajax的工作原理 100
    191. 、为什么扩展javascript内置对象不是好的做法? 100
    192. 什么是三元表达式?“三元”表示什么意思? 100
    193. 浏览器标准模式和怪异模式之间的区别是什么? 100
    194. modulo(12,5)//2 实现满足这个结果的modulo函数 101
    195. HTTP协议中,GET和POST有什么区别?分别适用什么场景 ? 101
    196. HTTP状态消息200 302 304 403 404 500分别表示什么 101
    197. HTTP协议中,header信息里面,怎么控制页面失效时间(last-modified,cache-control,Expires分别代表什么) 101
    198. HTTP雷锋议目前常用的有哪几个?KEEPALIVE从哪个版本开始出现的? 101
    199. 业界常用的优化WEB页面加载速度的方法(可以分别从页面元素展现,请求连接,css,js,服务器等方面介绍) 101
    200. 列举常用的web页面开发,调试以及优化工具 101
    201. 解释什么是sql注入,xss漏洞 101
    202. 如何判断一个js变量是数组类型 101
    203. 请列举js数组类型中的常用方法 101
    204. FF与IE中如何阻止事件冒泡,如何获取事件对象,以及如何获取触发事件的元素 101
    205. 列举常用的js框架以及分别适用的领域 102
    206. js中如何实现一个map 103
    207. js可否实现面向对象编程,如果可以如何实现js对象的继承 103
    208. 约瑟夫环—已知n个人(以编号1,2,3…分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 103
    209. 有1到10w这个10w个数,去除2个并打乱次序,如何找出那两个数? 103
    210. 如何获取对象a拥有的所有属性(可枚举的、不可枚举的,不包括继承来的属性) 103
    211. 有下面这样一段HTML结构,使用css实现这样的效果: 103
    212. 下面这段代码想要循环输出结果01234,请问输出结果是否正确,如果不正确,请说明为什么,并修改循环内的代码使其输出正确结果 103
    213. 以下哪些是javascript的全局函数:(ABC) 104
    214. 关于IE的window对象表述正确的有:(ACD) 104
    215. 下面正确的是 A 105
    216. 错误的是 B 105
    217. 不用任何插件,如何实现一个tab栏切换? 105
    218. 变量的命名规范以及命名推荐 106
    219. 三种弹窗的单词以及三种弹窗的功能 106
    220. console.log( 8 | 1 ); 输出值是多少? 107
    221. 只允许使用 + - * / 和 Math.* ,求一个函数 y = f(x, a, b);当x > 100 时返回 a 的值,否则返回 b 的值,不能使用 if else 等条件语句,也不能使用|,?:,数组。 107
    222. JavaScriptalert(0.4*0.2);结果是多少?和你预期的一样吗?如果不一样该如何处理? 108
    223. 一个div,有几种方式得到这个div的jQuery对象?
      想直接获取这个div的dom对象,如何获取?dom对象如何转化为jQuery对象? 108
    224. 、主流浏览器内核 108
    225. 如何显示/隐藏一个dom元素?请用原生的JavaScript方法实现 108
    226. jQuery框架中$.ajax()的常用参数有哪些?写一个post请求并带有发送数据和返回数据的样例 109
    227. JavaScript的循环语句有哪些? 109
    228. 作用域-编译期执行期以及全局局部作用域问题 109
    229. 闭包:下面这个ul,如何点击每一列的时候alert其index? 110
    230. 列出3条以上ff和IE的脚本兼容问题 111
    231. 如现在有一个效果,有显示用户头像、用户昵称、用户其他信息;当用户鼠标移到头像上时,会弹出用户的所有信息;如果是你,你会如何实现这个功能,请用代码实现? 111
    232. 用正则表达式,写出由字母开头,其余由数字、字母、下划线组成的6~30的字符串? 111
    233. 列举浏览器对象模型BOM里常用的至少4个对象,并列举window对象的常用方法至少5个 (10分) 112
    234. 在Javascript中什么是伪数组?如何将伪数组转化为标准数组? 112
    235. 写一个函数可以计算 sum(5,0,-5);输出0; sum(1,2,3,4);输出10; 112
    236. 《正则》写出正确的正则表达式匹配固话号,区号3-4位,第一位为0,中横线,7-8位数字,中横线,3-4位分机号格式的固话号 113
    237. 《算法》 一下A,B可任选一题作答,两题全答加分 113
    238. 请写一个正则表达式:要求最短6位数,最长20位,阿拉伯数和英文字母(不区分大小写)组成 114
    239. 统计1到400亿之间的自然数中含有多少个1?比如1-21中,有1、10、11、21这四个自然数有5个1 115
    240. 删除与某个字符相邻且相同的字符,比如fdaffdaaklfjklja字符串处理之后成为“fdafdaklfjklja” 115
    241. 请写出三种以上的Firefox有但,InternetExplorer没有的属性或者函数 115
    242. 请写出一个程序,在页面加载完成后动态创建一个form表单,并在里面添加一个input对象并给它任意赋值后义post方式提交到:http://127.0.0.1/save.php 115
    243. 用JavaScript实现冒泡排序。数据为23、45、18、37、92、13、24 116
    244. 前端代码优化的方法 116
    245. 下列JavaScript代码执行后,依次alert的结果是 117
    246. 下列JavaScript代码执行后,iNum的值是 118
    247. 输出结果是多少? 119
    248. 用程序实现找到html中id名相同的元素? 123
    249. 下列JavaScript代码执行后,运行的结果是 125
    250. 下列JavaScript代码执行后,依次alert的结果是 125
    251. 下列JavaScript代码执行后的效果是 126
    252. 下列JavaScript代码执行后的li元素的数量是 128
    253. 程序中捕获异常的方法? 128
    254. 将字符串”{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲</td><td>{name}”中的{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲替换成10,{name}替换成Tony (使用正则表达式) 129
    255. 给String对象添加一个方法,传入一个string类型的参数,然后将string的每个字符间价格空格返回,例如:addSpace(“hello world”) // -> ‘h e l l o ?w o r l d’ 129
    256. 数组和字符串 129
    257. 下列控制台都输出什么 131
      第2题: 131
      第3题: 132
      第4题: 132
      第5题: 132
      第6题: 133
      第7题: 133
      第8题: 133
      第9题: 134
      第10题: 134
      第11题:考点:函数声明提前 134
      第12题: 135
      第13题: 135
      第14题: 135
      第15题 136
      第16题:以下执行会有什么输出 136
      三、HTML5 CSS3 137
    258. CSS3有哪些新特性? 137
    259. html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5? 137
    260. 本地存储(Local Storage )和cookies(储存在用户本地终端上的数据)之间的区别是什么? 138
    261. 如何实现浏览器内多个标签页之间的通信? 138
    262. 你如何对网站的文件和资源进行优化? 138
    263. 什么是响应式设计? 138
    264. 新的 HTML5 文档类型和字符集是? 139
    265. HTML5 Canvas 元素有什么用? 139
    266. HTML5 存储类型有什么区别? 139
    267. 用H5+CSS3解决下导航栏最后一项掉下来的问题 139
    268. CSS3新增伪类有那些? 139
    269. 请用CSS实现:一个矩形内容,有投影,有圆角,hover状态慢慢变透明。 139
    270. 描述下CSS3里实现元素动画的方法 140
    271. html5\CSS3有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5? 140
    272. 你怎么来实现页面设计图,你认为前端应该如何高质量完成工作? 一个满屏 品 字布局 如何设计? 140
    273. 你能描述一下渐进增强和优雅降级之间的不同吗? 141
    274. 为什么利用多个域名来存储网站资源会更有效? 141
      CDN缓存更方便  141
    275. 请谈一下你对网页标准和标准制定机构重要性的理解。 142
    276. 请描述一下cookies,sessionStorage和localStorage的区别? 142
    277. 知道css有个content属性吗?有什么作用?有什么应用? 142
    278. 如何在 HTML5 页面中嵌入音频? 143
        143
    279. 如何在 HTML5 页面中嵌入视频? 143
        143
    280. HTML5 引入什么新的表单属性? 143
    281. CSS3新增伪类有那些? 143
    282. (写)描述一段语义的html代码吧。 144
    283. cookie在浏览器和服务器间来回传递。 sessionStorage和localStorage区别 144
    284. html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5? 144
    285. 如何区分: DOCTYPE声明\新增的结构元素\功能元素 145
    286. 语义化的理解? 145
    287. HTML5的离线储存? 145
    288. 写出HTML5的文档声明方式 145
    289. HTML5和CSS3的新标签      145
    290. 自己对标签语义化的理解 146
      四、移动web开发 146
      1、移动端常用类库及优缺点 146
      2、Zepto库和JQ区别 146
      五、Ajax 146
      1、Ajax 是什么? 如何创建一个Ajax? 146
      }else{ 146
      2、同步和异步的区别? 147
      3、如何解决跨域问题? 147
      4、页面编码和被请求的资源编码如果不一致如何处理? 147
      5、简述ajax 的过程。 147
      6、阐述一下异步加载。 148
      7、请解释一下 JavaScript 的同源策略。 148
      8、GET和POST的区别,何时使用POST? 148
      POST:一般用于修改服务器上的资源,对所发送的信息没有限制 148
      9、ajax 是什么?ajax 的交互模型?同步和异步的区别?如何解决跨域问题? 148
      10、 Ajax的最大的特点是什么。 149
      11、ajax的缺点 149
      12、ajax请求的时候get 和post方式的区别 149
      13、解释jsonp的原理,以及为什么不是真正的ajax 149
      14、什么是Ajax和JSON,它们的优缺点。 149
      15、http常见的状态码有那些?分别代表是什么意思? 149
      16、一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么? 150
      17、ajax请求的时候get 和post方式的区别 150
      18、ajax请求时,如何解释json数据 150
      19、.javascript的本地对象,内置对象和宿主对象 150
      20、为什么利用多个域名来存储网站资源会更有效? 151
      21、请说出三种减低页面加载时间的方法 151
      22、HTTP状态码都有那些。 151
      六、JS高级 151
      1、 JQuery一个对象可以同时绑定多个事件,这是如何实现的? 151
      2、 知道什么是webkit么? 知道怎么用浏览器的各种工具来调试和debug代码么? 151
      3、 如何测试前端代码? 知道BDD, TDD, Unit Test么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit…)? 152
      5、 简述一下 Handlebars 的基本用法? 152
      6、 简述一下 Handlerbars 的对模板的基本处理流程, 如何编译的?如何缓存的? 152
      7、 用js实现千位分隔符? 152
      8、 检测浏览器版本版本有哪些方式? 152
      9、 我们给一个dom同时绑定两个点击事件,一个用捕获,一个用冒泡,你来说下会执行几次事件,然后会先执行冒泡还是捕获 152
      10、实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制 152
      11、如何消除一个数组里面重复的元素? 154
      12、小贤是一条可爱的小狗(Dog),它的叫声很好听(wow),每次看到主人的时候就会乖乖叫一声(yelp)。从这段描述可以得到以下对象: 154
      13、下面这个ul,如何点击每一列的时候alert其index?(闭包) 155
      14、编写一个JavaScript函数,输入指定类型的选择器(仅需支持id,class,tagName三种简单CSS选择器,无需兼容组合选择器)可以返回匹配的DOM节点,需考虑浏览器兼容性和性能。 156
      15、请评价以下代码并给出改进意见。 158
      16、给String对象添加一个方法,传入一个string类型的参数,然后将string的每个字符间价格空格返回,例如: 158
      17、定义一个log方法,让它可以代理console.log的方法。 159
      18、在Javascript中什么是伪数组?如何将伪数组转化为标准数组? 159
      19、对作用域上下文和this的理解,看下列代码: 160
      20、原生JS的window.onload与Jquery的$(document).ready(function(){})有什么不同?如何用原生JS实现Jq的ready方法? 161
      21、(设计题)想实现一个对页面某个节点的拖曳?如何做?(使用原生JS) 163
      22、请实现如下功能 163
      23、说出以下函数的作用是?空白区域应该填写什么? 164
      24、 Javascript作用链域? 165
      25、 谈谈This对象的理解。 165
      26、 eval是做什么的? 165
      27、 关于事件,IE与火狐的事件机制有什么区别? 如何阻止冒泡? 165
      28、 什么是闭包(closure),为什么要用它? 166
      29、javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么? 166
      30、如何判断一个对象是否属于某个类? 166
      31、new操作符具体干了什么呢? 166
      32、用原生JavaScript的实现过什么功能吗? 166
      33、Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是? 166
      HasOwnProperty 167
      34、对JSON的了解? 167
      35、js延迟加载的方式有哪些? 167
      36、模块化开发怎么做? 167
      37、AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别? 167
      38、requireJS的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何 缓存的?) 167
      39、让你自己设计实现一个requireJS,你会怎么做? 168
      40、谈一谈你对ECMAScript6的了解? 168
      ES6新的语法糖,类,模块化等新特性 168
      41、ECMAScript6 怎么写class么,为什么会出现class这种东西? 168
      42、异步加载的方式有哪些? 168
      43、documen.write和 innerHTML的区别? 168
      44、DOM操作——怎样添加、移除、移动、复制、创建和查找节点? 169
      45、call() 和 .apply() 的含义和区别? 169
      46、数组和对象有哪些原生方法,列举一下? 169
      Array.concat( ) 连接数组 169
      Object.hasOwnProperty( ) 检查属性是否被继承 170
      47、JS 怎么实现一个类。怎么实例化这个类 170
      48、JavaScript中的作用域与变量声明提升? 170
      49、如何编写高性能的Javascript? 170
      50、那些操作会造成内存泄漏? 171
      51、javascript对象的几种创建方式? 171
      52、javascript继承的 6 种方法? 171
      53、eval是做什么的? 171
      54、JavaScript 原型,原型链 ? 有什么特点? 171
      55、事件、IE与火狐的事件机制有什么区别? 如何阻止冒泡? 172
      56、简述一下Sass、Less,且说明区别? 172
      57、关于javascript中apply()和call()方法的区别? 172
      58、简述一下JS中的闭包? 172
      59、说说你对this的理解? 172
      60、分别阐述split(),slice(),splice(),join()? 173
      61、事件委托是什么? 173
      62、如何阻止事件冒泡和默认事件? 173
      63、添加 删除 替换 插入到某个接点的方法? 173
      64、你用过require.js吗?它有什么特性? 174
      65、谈一下JS中的递归函数,并且用递归简单实现阶乘? 174
      66、请用正则表达式写一个简单的邮箱验证。 174
      67、简述一下你对web性能优化的方案? 174
      68、在JS中有哪些会被隐式转换为false 174
      Undefined、null、关键字false、NaN、零、空字符串 174
      69、定时器setInterval有一个有名函数fn1,setInterval(fn1,500)与setInterval(fn1(),500)有什么区别? 174
      70、外部JS文件出现中文字符,会出现什么问题,怎么解决? 174
      71、谈谈浏览器的内核,并且说一下什么是内核? 175
      72、JavaScript原型,原型链 ? 有什么特点? 175
      73、写一个通用的事件侦听器函数 175
      74、事件、IE与火狐的事件机制有什么区别? 如何阻止冒泡? 178
      75、什么是闭包(closure),为什么要用? 178
      76、如何判断一个对象是否属于某个类? 178
      77、new操作符具体干了什么呢? 178
      78、JSON 的了解 179
      79、js延迟加载的方式有哪些 179
      80、模块化怎么做? 179
      81、异步加载的方式 179
      82、告诉我答案是多少? 180
      83、JS中的call()和apply()方法的区别? 180
      84、Jquery与jQuery UI 有啥区别? 180
      85、jquery 中如何将数组转化为json字符串,然后再转化回来? 180
      $.fn.stringifyArray = function(array) { 180
      86、JavaScript中的作用域与变量声明提升? 181
      87、前端开发的优化问题(看雅虎14条性能优化原则)。 181
      88、http状态码有那些?分别代表是什么意思? 181
      89、一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好) 182
      七、流行框架 182
      1、JQuery的源码看过吗?能不能简单概况一下它的实现原理? 182
      2、jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this? 182
      3、 jquery中如何将数组转化为json字符串,然后再转化回来? 182
      4、 jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝? 182
      5、 jquery.extend 与 jquery.fn.extend的区别? 182
      Jquery.extend用来扩展jQuery对象本身;jquery.fn.extend用来扩展jQuery实例 182
      6、谈一下Jquery中的bind(),live(),delegate(),on()的区别? 182
      7、JQuery一个对象可以同时绑定多个事件,这是如何实现的? 182
      10、 Jquery与jQuery UI有啥区别? 182
      11、 jQuery和Zepto的区别?各自的使用场景? 183
      12、 针对 jQuery 的优化方法? 183
      13、 Zepto的点透问题如何解决? 183
      14、知道各种JS框架(Angular, Backbone, Ember, React, Meteor, Knockout…)么? 能讲出他们各自的优点和缺点么? 183
      15、Underscore 对哪些 JS 原生对象进行了扩展以及提供了哪些好用的函数方法? 184
      Underscore的熟悉程度 184
      16、使用过angular吗?angular中的过滤器是干什么用的 184
      八、移动APP开发 184
      1、移动端最小触控区域是多大? 184
      九、NodeJs 184
    291. 对Node的优点和缺点提出了自己的看法: 184
    292. 需求:实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案? 184
    293. Node.js的适用场景? 185
    294. (如果会用node)知道route, middleware, cluster, nodemon, pm2, server-side rendering么? 185
      Nodejs相关概念的理解程度 185
    295. 解释一下 Backbone 的 MVC 实现方式? 185
    296. 什么是“前端路由”?什么时候适合使用“前端路由”? “前端路由”有哪些优点和缺点? 185
    297. 对Node的优点和缺点提出了自己的看法? 185
      十、前端概括性问题 186
    298. 常使用的库有哪些?常用的前端开发工具?开发过什么应用或组件? 186
    299. 对BFC规范的理解? 186
    300. 99%的网站都需要被重构是那本书上写的? 186
    301. WEB应用从服务器主动推送Data到客户端有那些方式? 186
    302. 加班的看法 187
    303. 平时如何管理你的项目,如何设计突发大规模并发架构? 187
    304. 那些操作会造成内存泄漏? 187
    305. 你说你热爱前端,那么应该WEB行业的发展很关注吧? 说说最近最流行的一些东西吧? 187
      Node.js、Mongodb、npm、MVVM、MEAN、react、angularjs 187
    306. 你有了解我们公司吗?说说你的认识? 187
    307. 移动端(比如:Android IOS)怎么做好用户体验? 187
    308. 你所知道的页面性能优化方法有那些? 188
    309. 除了前端以外还了解什么其它技术么?你最最厉害的技能是什么? 188
    310. AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别? 188
    311. 谈谈你认为怎样做能使项目做的更好? 188
    312. 你对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样? 188
    313. php中下面哪个函数可以打开一个文件,以对文件进行读和写操作? 188
    314. php中rmdir可以直接删除文件夹吗?该目录必须是空的,而且要有相应的权限–来自api 188
    315. phpinset和empty的区别,举例说明 188
    316. php中$_SERVER变量中如何得到当前执行脚本路劲 189
    317. 写一个php函数,要求两个日期字符串的天数差,如2012-02-05~2012-03-06的日期差数 189
    318. 一个衣柜中放了许多杂乱的衬衫,如果让你去整理一下,使得更容易找到你想要的衣服;你会怎么做?请写出你的做法和思路? 189
    319. 如何优化网页加载速度? 189
    320. 工作流程,你怎么来实现页面设计图,你认为前端应该如何高质量完成工作? 190
    321. 介绍项目经验、合作开发、独立开发。 190
    322. 开发过程中遇到困难,如何解决。 190
    323. 对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样? 190

    一、HTML和CSS
    1.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么?
    IE: trident内核
    Firefox:gecko内核
    Safari:webkit内核
    Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核
    Chrome:Blink(基于webkit,Google与Opera Software共同开发)
    2.每个HTML文件里开头都有个很重要的东西,Doctype,知道这是干什么的吗?

     声明位于文档中的最前面的位置,处于  标签之前。此标签可告知浏览器文档使用哪种 HTML 或 XHTML 规范。(重点:告诉浏览器按照何种规范解析页面)

    3.Quirks模式是什么 ?它和Standards模式有什么区别
    从IE6开始,引入了Standards模式,标准模式中,浏览器尝试给符合标准的文档在规范上的正确处理达到在指定浏览器中的程度。
    在IE6之前CSS还不够成熟,所以IE5等之前的浏览器对CSS的支持很差, IE6将对CSS提供更好的支持,然而这时的问题就来了,因为有很多页面是基于旧的布局方式写的,而如果IE6 支持CSS则将令这些页面显示不正常,如何在即保证不破坏现有页面,又提供新的渲染机制呢?
    在写程序时我们也会经常遇到这样的问题,如何保证原来的接口不变,又提供更强大的功能,尤其是新功能不兼容旧功能时。遇到这种问题时的一个常见做法是增加参数和分支,即当某个参数为真时,我们就使用新功能,而如果这个参数 不为真时,就使用旧功能,这样就能不破坏原有的程序,又提供新功能。IE6也是类似这样做的,它将DTD当成了这个“参数”,因为以前的页面大家都不会去写DTD,所以IE6就假定 如果写了DTD,就意味着这个页面将采用对CSS支持更好的布局,而如果没有,则采用兼容之前的布局方式。这就是Quirks模式(怪癖模式,诡异模式,怪异模式)。
    区别:
    总体会有布局、样式解析和脚本执行三个方面的区别。
    盒模型:在W3C标准中,如果设置一个元素的宽度和高度,指的是元素内容的宽度和高度,而在Quirks 模式下,IE的宽度和高度还包含了padding和border。

    设置行内元素的高宽:在Standards模式下,给等行内元素设置wdith和height都不会生效,而在quirks模式下,则会生效。
    设置百分比的高度:在standards模式下,一个元素的高度是由其包含的内容来决定的,如果父元素没有设置百分比的高度,子元素设置一个百分比的高度是无效的用margin:0 auto设置水平居中:使用margin:0 auto在standards模式下可以使元素水平居中,但在quirks模式下却会失效。
    (还有很多,答出什么不重要,关键是看他答出的这些是不是自己经验遇到的,还是说都是看文章看的,甚至完全不知道。)
    4.div+css的布局较table布局有什么优点?
    改版的时候更方便 只要改css文件。
    页面加载速度更快、结构化清晰、页面显示简洁。
    表现与结构相分离。
    易于优化(seo)搜索引擎更友好,排名更容易靠前。
    5.img的alt与title有何异同? strong与em的异同?
    a:alt(alt text):为不能显示图像、窗体或applets的用户代理(UA),alt属性用来指定替换文字。替换文字的语言由lang属性指定。(在IE浏览器下会在没有title时把alt当成 tool tip显示)
    title(tool tip):该属性为设置该属性的元素提供建议性的信息。
    strong:粗体强调标签,强调,表示内容的重要性
    em:斜体强调标签,更强烈强调,表示内容的强调点
    6.你能描述一下渐进增强和优雅降级之间的不同吗?
    渐进增强 progressive enhancement:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
    优雅降级 graceful degradation:一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
    区别:优雅降级是从复杂的现状开始,并试图减少用户体验的供给,而渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带。
    “优雅降级”观点
    “优雅降级”观点认为应该针对那些最高级、最完善的浏览器来设计网站。而将那些被认为“过时”或有功能缺失的浏览器下的测试工作安排在开发周期的最后阶段,并把测试对象限定为主流浏览器(如 IE、Mozilla 等)的前一个版本。
    在这种设计范例下,旧版的浏览器被认为仅能提供“简陋却无妨 (poor, but passable)” 的浏览体验。你可以做一些小的调整来适应某个特定的浏览器。但由于它们并非我们所关注的焦点,因此除了修复较大的错误之外,其它的差异将被直接忽略。
    “渐进增强”观点
    “渐进增强”观点则认为应关注于内容本身。
    内容是我们建立网站的诱因。有的网站展示它,有的则收集它,有的寻求,有的操作,还有的网站甚至会包含以上的种种,但相同点是它们全都涉及到内容。这使得“渐进增强”成为一种更为合理的设计范例。这也是它立即被 Yahoo! 所采纳并用以构建其“分级式浏览器支持 (Graded Browser Support)”策略的原因所在。
    那么问题来了。现在产品经理看到IE6,7,8网页效果相对高版本现代浏览器少了很多圆角,阴影(CSS3),要求兼容(使用图片背景,放弃CSS3),你会如何说服他?
    7.为什么利用多个域名来存储网站资源会更有效?
    CDN缓存更方便(Content Delivery Network,即内容分发网络)
    突破浏览器并发限制
    节约cookie带宽
    节约主域名的连接数,优化页面响应速度
    防止不必要的安全问题
    8.请谈一下你对网页标准和标准制定机构重要性的理解。
    网页标准和标准制定机构都是为了能让web发展的更‘健康’,开发者遵循统一的标准,降低开发难度,开发成本,SEO也会更好做,也不会因为滥用代码导致各种BUG、安全问题,最终提高网站易用性。
    9.请描述一下cookies,sessionStorage和localStorage的区别?
    sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。而localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
    web storage和cookie的区别
    Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。
    除此之外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie。但是Cookie也是不可以或缺的:Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生。

    1.cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递。而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下。
    2.存储大小限制也不同,cookie数据不能超过4k,同时因为每次http请求都会携带cookie,所以cookie只适合保存很小的数据,如会话标识。sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。存储大小:localStorage=sessionStorage>cookie
    3.数据有效期不同,sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie只在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭。数据持久:localStorage>cookie>sessionStorage
    4.作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。作用域:localStorage=cookie>sessionStorage

    10.简述一下src与href的区别。
    1.src 是指向物件的来源地址,是引入。在 img、script、iframe 等元素上使用。
    2.href 是超文本引用,指向需要连结的地方,是与该页面有关联的,是引用。在 link和a 等元素上使用。
    使用区别:
    src通常用作“拿取”(引入),href 用作 “连结前往”(引用)。

    src用于替换当前元素,href用于在当前文档和引用资源之间确立联系。
    src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。

    当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js脚本放在底部而不是头部。
    href是Hypertext Reference的缩写,指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,如果我们在文档中添加

    那么浏览器会识别该文档为css文件,就会并行下载资源并且不会停止对当前文档的处理。这也是为什么建议使用link方式来加载css,而不是使用@import方式。 11.知道的网页制作会用到的图片格式有哪些? png-8,png-24,jpeg,gif,svg。 但是上面的那些都不是面试官想要的最后答案。面试官希望听到是Webp。(是否有关注新技术,新鲜事物) 科普一下Webp:WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间。Facebook Ebay等知名网站已经开始测试并使用WebP格式。 在质量相同的情况下,WebP格式图像的体积要比JPEG格式图像小40% 12.知道什么是微格式吗?谈谈理解。在前端构建中应该考虑微格式吗? 微格式(Microformats)是一种让机器可读的语义化XHTML词汇的集合,是结构化数据的开放标准。是为特殊应用而制定的特殊格式。 优点:将智能数据添加到网页上,让网站内容在搜索引擎结果界面可以显示额外的提示。(应用范例:豆瓣,有兴趣自行google) 13.在css/js代码上线之后开发人员经常会优化性能,从用户刷新网页开始,一次js请求一般情况下有哪些地方会有缓存处理? 答案:dns缓存,cdn缓存,浏览器缓存,服务器缓存。 14.一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验。 图片懒加载,在页面上的未可视区域可以添加一个滚动条事件,判断图片位置与浏览器顶端的距离与页面的距离,如果前者小于后者,优先加载。 如果为幻灯片、相册等,可以使用图片预加载技术,将当前展示图片的前一张和后一张优先下载。 如果图片为css图片,可以使用CSSsprite,SVGsprite,Iconfont(服务器字体)、Base64等技术。 如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图,以提高用户体验。 如果图片展示区域小于图片的真实大小,则因在服务器端根据业务需要先行进行图片压缩,图片压缩后大小与展示一致。 15.你如何理解HTML结构的语义化?  去掉或样式丢失的时候能让页面呈现清晰的结构: html本身是没有表现的,我们看到例如

    是粗体,字体大小2em,加粗;是加粗的,不要认为这是html的表现,这些其实html默认的css样式在起作用,所以去掉或样式丢失的时候能让页面呈现清晰的结构不是语义化的HTML结构的优点,但是浏览器都有有默认样式,默认样式的目的也是为了更好的表达html的语义,可以说浏览器的默认样式和语义化的HTML结构是不可分割的。 屏幕阅读器(如果访客有视障)会完全根据你的标记来“读”你的网页. 例如,如果你使用的含语义的标记,屏幕阅读器就会“逐个拼出”你的单词,而不是试着去对它完整发音. PDA、手机等设备可能无法像普通电脑的浏览器一样来渲染网页(通常是因为这些设备对CSS的支持较弱) 使用语义标记可以确保这些设备以一种有意义的方式来渲染网页.理想情况下,观看设备的任务是符合设备本身的条件来渲染网页. 语义标记为设备提供了所需的相关信息,就省去了你自己去考虑所有可能的显示情况(包括现有的或者将来新的设备).例如,一部手机可以选择使一段标记了标题的文字以粗体显示.而掌上电脑可能会以比较大的字体来显示.无论哪种方式一旦你对文本标记为标题,您就可以确信读取设备将根据其自身的条件来合适地显示页面. 搜索引擎的爬虫也依赖于标记来确定上下文和各个关键字的权重 过去你可能还没有考虑搜索引擎的爬虫也是网站的“访客”,但现在它们他们实际上是极其宝贵的用户.没有他们的话,搜索引擎将无法索引你的网站,然后一般用户将很难过来访问. 你的页面是否对爬虫容易理解非常重要,因为爬虫很大程度上会忽略用于表现的标记,而只注重语义标记. 因此,如果页面文件的标题被标记,而不是,那么这个页面在搜索结果的位置可能会比较靠后.除了提升易用性外,语义标记有利于正确使用CSS和JavaScript,因为其本身提供了许多“钩钩”来应用页面的样式与行为. SEO主要还是靠你网站的内容和外部链接的。 便于团队开发和维护 W3C给我们定了一个很好的标准,在团队中大家都遵循这个标准,可以减少很多差异化的东西,方便开发和维护,提高开发效率,甚至实现模块化开发。 16.谈谈以前端角度出发做好SEO需要考虑什么? 了解搜索引擎如何抓取网页和如何索引网页 你需要知道一些搜索引擎的基本工作原理,各个搜索引擎之间的区别,搜索机器人(SE robot 或叫 web crawler)如何进行工作,搜索引擎如何对搜索结果进行排序等等。 Meta标签优化 主要包括主题(Title),网站描述(Description),和关键词(Keywords)。还有一些其它的隐藏文字比如Author(作者),Category(目录),Language(编码语种)等。 如何选取关键词并在网页中放置关键词 搜索就得用关键词。关键词分析和选择是SEO最重要的工作之一。首先要给网站确定主关键词(一般在5个上下),然后针对这些关键词进行优化,包括关键词密度(Density),相关度(Relavancy),突出性(Prominency)等等。 了解主要的搜索引擎 虽然搜索引擎有很多,但是对网站流量起决定作用的就那么几个。比如英文的主要有Google,Yahoo,Bing等;中文的有百度,搜狗,有道等。不同的搜索引擎对页面的抓取和索引、排序的规则都不一样。还要了解各搜索门户和搜索引擎之间的关系,比如AOL网页搜索用的是Google的搜索技术,MSN用的是Bing的技术。 主要的互联网目录 Open Directory自身不是搜索引擎,而是一个大型的网站目录,他和搜索引擎的主要区别是网站内容的收集方式不同。目录是人工编辑的,主要收录网站主页;搜索引擎是自动收集的,除了主页外还抓取大量的内容页面。 按点击付费的搜索引擎 搜索引擎也需要生存,随着互联网商务的越来越成熟,收费的搜索引擎也开始大行其道。最典型的有Overture和百度,当然也包括Google的广告项目Google Adwords。越来越多的人通过搜索引擎的点击广告来定位商业网站,这里面也大有优化和排名的学问,你得学会用最少的广告投入获得最多的点击。 搜索引擎登录 网站做完了以后,别躺在那里等着客人从天而降。要让别人找到你,最简单的办法就是将网站提交(submit)到搜索引擎。如果你的是商业网站,主要的搜索引擎和目录都会要求你付费来获得收录(比如Yahoo要299美元),但是好消息是(至少到目前为止)最大的搜索引擎Google目前还是免费,而且它主宰着60%以上的搜索市场。 链接交换和链接广泛度(Link Popularity) 网页内容都是以超文本(Hypertext)的方式来互相链接的,网站之间也是如此。除了搜索引擎以外,人们也每天通过不同网站之间的链接来Surfing(“冲浪”)。其它网站到你的网站的链接越多,你也就会获得更多的访问量。更重要的是,你的网站的外部链接数越多,会被搜索引擎认为它的重要性越大,从而给你更高的排名。 合理的标签使用 17.有哪项方式可以对一个DOM设置它的CSS样式?  DOM文档对象模型(Document Object model,DOM), BOM浏览器对象模型(Browser Object model,BOM) 外部样式表,引入一个外部css文件 内部样式表,将css代码放在  标签内部 内联样式,将css样式直接定义在 HTML 元素内部 18.CSS都有哪些选择器? 派生选择器(用HTML标签申明) id选择器(用DOM的ID申明) 类选择器(用一个样式类名申明) 属性选择器(用DOM的属性申明,属于CSS2,IE6不支持,不常用,不知道就算了) 除了前3种基本选择器,还有一些扩展选择器,包括 后代选择器(利用空格间隔,比如div .a{  }) 群组选择器(利用逗号间隔,比如p,div,#a{  }) 那么问题来了,CSS选择器的优先级是怎么样定义的? 基本原则: 一般而言,选择器越特殊,它的优先级越高。也就是选择器指向的越准确,它的优先级就越高。 复杂的计算方法: 用1表示派生选择器的优先级 用10表示类选择器的优先级 用100标示ID选择器的优先级 div.test1 .span var 优先级 1+10 +10 +1 span#xxx .songs li 优先级1+100 + 10 + 1 #xxx li 优先级 100 +1 那么问题来了,看下列代码,

    标签内的文字是什么颜色的?

    123

    答案:red。与样式定义在文件中的先后顺序有关,即是后面的覆盖前面的,与在

    33.为什么要初始化样式?
    由于浏览器兼容的问题,不同的浏览器对标签的默认样式值不同,若不初始化会造成不同浏览器之间的显示差异,但是初始化CSS会对搜索引擎优化造成小影响
    34.BFC是什么?
    BFC(块级格式化上下文),一个创建了新的BFC的盒子是独立布局的,盒子内元素的布局不会影响盒子外面的元素。在同一个BFC中的两个相邻的盒子在垂直方向发生margin重叠的问题
    BFC是指浏览器中创建了一个独立的渲染区域,该区域内所有元素的布局不会影响到区域外元素的布局,这个渲染区域只对块级元素起作用
    35.html语义化是什么?
    当页面样式加载失败的时候能够让页面呈现出清晰的结构
    有利于seo优化,利于被搜索引擎收录(更便于搜索引擎的爬虫程序来识别)
    便于项目的开发及维护,使html代码更具有可读性,便于其他设备解析。
    36.Doctype的作用?严格模式与混杂模式的区别?

    用于告知浏览器该以何种模式来渲染文档

    严格模式下:页面排版及JS解析是以该浏览器支持的最高标准来执行
    混杂模式:不严格按照标准执行,主要用来兼容旧的浏览器,向后兼容
    37.IE的双边距BUG:块级元素float后设置横向margin,ie6显示的margin比设置的较大。

      解决:加入_display:inline
    

    38.HTML与XHTML——二者有什么区别?

    1. 所有的标记都必须要有一个相应的结束标记
    2. 所有标签的元素和属性的名字都必须使用小写
    3. 所有的 XML 标记都必须合理嵌套
    4. 所有的属性必须用引号 “” 括起来
    5. 把所有 < 和 & 特殊符号用编码表示
    6. 给所有属性赋一个值
    7. 不要在注释内容中使用 “–”
    8. 图片必须有说明文字
      39.html常见兼容性问题?
      1.双边距BUG float引起的 使用display
      2.3像素问题 使用float引起的 使用dislpay:inline -3px
      3.超链接hover 点击后失效 使用正确的书写顺序 link visited hover active
      4.Ie z-index问题 给父级添加position:relative
      5.Png 透明 使用js代码 改
      6.Min-height 最小高度 !Important 解决’
      7.select 在ie6下遮盖 使用iframe嵌套
      8.为什么没有办法定义1px左右的宽度容器(IE6默认的行高造成的,使用over:hidden,zoom:0.08 line-height:1px)
      9.IE5-8不支持opacity,解决办法:
      .opacity {
      opacity: 0.4
      filter: alpha(opacity=60); /* for IE5-7 /
      -ms-filter: “progid:DXImageTransform.Microsoft.Alpha(Opacity=60)”; /
      for IE 8*/
      }
    9. IE6不支持PNG透明背景,解决办法: IE6下使用gif图片
      40.对WEB标准以及W3C的理解与认识
      答:标签闭合、标签小写、不乱嵌套、提高搜索机器人搜索几率、使用外 链css和js脚本、结构行为表现的分离、文件下载与页面速度更快、内容能被更多的用户所访问、内容能被更广泛的设备所访问、更少的代码和组件,容易维 护、改版方便,不需要变动页面内容、提供打印版本而不需要复制内容、提高网站易用性。
      41.行内元素有哪些?块级元素有哪些?CSS的盒模型?
      答:块级元素:div p h1 h2 h3 h4 form ul
      行内元素: a b br i span input select
      Css盒模型:内容,border ,margin,padding
      42.前端页面有哪三层构成,分别是什么?作用是什么?
      答:结构层 Html 表示层 CSS 行为层 js。
      43.Doctype作用? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?
      (1)、<!DOCTYPE> 声明位于文档中的最前面,处于 标签之前。告知浏览器的解析器,用什么文档类型 规范来解析这个文档。
      (2)、严格模式的排版和 JS 运作模式是 以该浏览器支持的最高标准运行。
      (3)、在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。
      (4)、DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。
      44.行内元素有哪些?块级元素有哪些? 空(void)元素有那些?
      (1)CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,比如div默认display属性值为“block”,成为“块级”元素;span默认display属性值为“inline”,是“行内”元素。
      (2)行内元素有:a b span img input select strong(强调的语气) 块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
      (3)知名的空元素:


      鲜为人知的是:

      45.CSS的盒子模型?
      (1)两种, IE 盒子模型、标准 W3C 盒子模型;IE 的content部分包含了 border 和 pading;
      (2)盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border).
      46.CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? CSS3新增伪类有那些?
      • 1.id选择器( # myid)
        2.类选择器(.myclassname)
        3.标签选择器(div, h1, p)
        4.相邻选择器(h1 + p)
        5.子选择器(ul < li)
        6.后代选择器(li a)
        7.通配符选择器( * )
        8.属性选择器(a[rel = “external”])
        9.伪类选择器(a: hover, li: nth - child)
      • 可继承: font-size font-family color, UL LI DL DD DT;
      • 不可继承 :border padding margin width height ;
      • 优先级就近原则,样式定义最近者为准;
      • 载入样式以最后载入的定位为准;
        优先级为:
        !important > id > class > tag
        important 比 内联优先级高
        CSS3新增伪类举例:
        p:first-of-type 选择属于其父元素的首个

        元素的每个

        元素。
        p:last-of-type 选择属于其父元素的最后

        元素的每个

        元素。
        p:only-of-type 选择属于其父元素唯一的

        元素的每个

        元素。
        p:only-child 选择属于其父元素的唯一子元素的每个

        元素。
        p:nth-child(2) 选择属于其父元素的第二个子元素的每个

        元素。
        :enabled、:disabled 控制表单控件的禁用状态。
        :checked,单选框或复选框被选中。
        47.如何居中div,如何居中一个浮动元素?
        给div设置一个宽度,然后添加margin:0 auto属性
        div{
        width:200px;
        margin:0 auto;
        }
        居中一个浮动元素
        确定容器的宽高 宽500 高 300 的层
        设置层的外边距
        .div {
        Width:500px ; height:300px;//高度可以不设
        Margin: -150px 0 0 -250px;
        position:relative;相对定位
        background-color:pink;//方便看效果
        left:50%;
        top:50%;
        }
        48.浏览器的内核分别是什么?经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么,常用hack的技巧 ?

      • IE浏览器的内核Trident、 Mozilla的Gecko、google的WebKit、Opera内核Presto;
      • png24为的图片在iE6浏览器上出现背景,解决方案是做成PNG8.
      • 浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一。
      • IE6双边距bug:块属性标签float后,又有横行的margin情况下,在ie6显示margin比设置的大。
        浮动ie产生的双倍距离 #box{ float:left; width:10px; margin:0 0 0 100px;}
        这种情况之下IE会产生20px的距离,解决方案是在float的标签样式控制中加入 ——_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)
        渐进识别的方式,从总体中逐渐排除局部。
        首先,巧妙的使用“\9”这一标记,将IE游览器从所有情况中分离出来。
        接着,再次使用“+”将IE8和IE7、IE6分离开来,这样IE8已经独立识别。
        css
        .bb{
        background-color:#f1ee18;/所有识别/
        .background-color:#00deff\9; /IE6、7、8识别/
        +background-color:#a200ff;/IE6、7识别/
        _background-color:#1e0bd1;/IE6识别/
        }
      • IE下,可以使用获取常规属性的方法来获取自定义属性,
        也可以使用getAttribute()获取自定义属性;
        Firefox下,只能使用getAttribute()获取自定义属性.
        解决方法:统一通过getAttribute()获取自定义属性.
      • IE下,even对象有x,y属性,但是没有pageX,pageY属性;
        Firefox下,event对象有pageX,pageY属性,但是没有x,y属性.
      • (条件注释)缺点是在IE浏览器下可能会增加额外的HTTP请求数。
      • Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示, 可通过加入 CSS 属性 -webkit-text-size-adjust: none; 解决.
        超链接访问过后hover样式就不出现了 被点击访问过的超链接样式不在具有hover和active了解决方法是改变CSS属性的排列顺序:
        L-V-H-A : a:link {} a:visited {} a:hover {} a:active {}
        49.列出display的值,说明他们的作用。position的值, relative和absolute定位原点是?
    10. block 象块类型元素一样显示。
      none 缺省值。向行内元素类型一样显示。
      inline-block 象行内元素一样显示,但其内容象块类型元素一样显示。
      list-item 象块类型元素一样显示,并添加样式列表标记。
    11. position的值
      *absolute
      生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。
      *fixed (老IE不支持)
      生成绝对定位的元素,相对于浏览器窗口进行定位。
    • relative
      生成相对定位的元素,相对于其正常位置进行定位。
    • static 默认值。没有定位,元素出现在正常的流中
      *(忽略 top, bottom, left, right z-index 声明)。
    • inherit 规定从父元素继承 position 属性的值。
      50.absolute的containing block计算方式跟正常流有什么不同?
      lock-level boxes
      一个 block-level element (‘display’ 属性值为 ‘block’, ‘list-item’ 或是 ‘table’) 会生成一个 block-level box,这样的盒子会参与到 block-formatting context (一种布局的方式) 中。
      block formatting context
      在这种布局方式下,盒子们自所在的 containing block 顶部起一个接一个垂直排列,水平方向上撑满整个宽度 (除非内部的盒子自己内部建立了新的 BFC)。
      containing block
      一般来说,盒子本身就为其子孙建立了 containing block,用来计算内部盒子的位置、大小,而对内部的盒子,具体采用哪个 containing block 来计算,需要分情况来讨论:

    若此元素为 inline 元素,则 containing block 为能够包含这个元素生成的第一个和最后一个 inline box 的 padding box (除 margin, border 外的区域) 的最小矩形;
    否则则由这个祖先元素的 padding box 构成。
    根元素所在的 containing block 被称为 initial containing block,在我们常用的浏览器环境下,指的是原点与 canvas 重合,大小和 viewport 相同的矩形;
    对于 position 为 static 或 relative 的元素,其 containing block 为祖先元素中最近的 block container box 的 content box (除 margin, border, padding 外的区域);
    对于 position:fixed 的元素,其 containing block 由 viewport 建立;
    对于 position:absolute 的元素,则是先找到其祖先元素中最近的 position 属性非 static 的元素,然后判断:
    如果都找不到,则为 initial containing block。

    51.对WEB标准以及W3C的理解与认识
    标签闭合、标签小写、不乱嵌套、提高搜索机器人搜索几率、使用外 链css和js脚本、结构行为表现的分离、文件下载与页面速度更快、内容能被更多的用户所访问、内容能被更广泛的设备所访问、更少的代码和组件,容易维 护、改版方便,不需要变动页面内容、提供打印版本而不需要复制内容、提高网站易用性;
    52.css的基本语句构成是?
    选择器{属性1:值1;属性2:值2;……}
    53.浏览器标准模式和怪异模式之间的区别是什么?
    盒子模型 渲染模式的不同
    使用 window.top.document.compatMode 可显示为什么模式
    54.CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内?  
    1.Display:none; 不占位
    2.Visibility:hidden; 占位
      3.设置宽高为0,设置透明度为0,设置z-index位置在-1000
    55.行内元素和块级元素的具体区别是什么?行内元素的padding和margin可设置吗?
      块级元素(block)特性:
    总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显示;
    宽度(width)、高度(height)、内边距(padding)和外边距(margin)都可控制;
      内联元素(inline)特性:
    和相邻的内联元素在同一行;
    宽度(width)、高度(height)、内边距的top/bottom(padding-top/padding-bottom)和外边距的top/bottom(margin-top/margin-bottom)都不可改变(也就是padding和margin的left和right是可以设置的),就是里面文字或图片的大小。
      那么问题来了,浏览器还有默认的天生inline-block元素(拥有内在尺寸,可设置高宽,但不会自动换行),有哪些?
      答案: 、 、 、 、

    事件绑定方式添加事件:
    var btn = document.getElementById(“hello”);
    btn.addEventListener(“click”,function(){
    alert(1);
    },false);
    btn.addEventListener(“click”,function(){
    alert(2);
    },false);
    执行上面的代码会先alert 1 再 alert 2
    普通添加事件的方法不支持添加多个事件,最下面的事件会覆盖上面的,而事件绑定(addEventListener)方式添加事件可以添加多个。
    addEventListener不兼容低版本IE
    普通事件无法取消
    addEventLisntener还支持事件冒泡+事件捕获
    IE和DOM事件流的区别
    1.执行顺序不一样、
    2.参数不一样
    3.事件加不加on
    4.this指向问题
    IE和标准下有哪些兼容性的写法
    Var ev = ev || window.event
    document.documentElement.clientWidth || document.body.clientWidth
    Var target = ev.srcElement||ev.target
    call和apply的区别
    call方法: 
    语法:call(thisObj,Object1,Object2…)
    定义:调用一个对象的一个方法,以另一个对象替换当前对象。
    说明:
    call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
    如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

    apply方法: 
    语法:apply(thisObj,[argArray])
    定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
    说明: 
    如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 
    如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
    b继承a的方法
    function A( age, name ){
    this.age = age;
    this.name = name;
    }

    A.prototype.show = function(){
    alert(‘父级方法’);
    }

    function B(age,name,job){
    A.apply( this, arguments );
    this.job = job;
    }

    B.prototype = new A();
    var b = new A(14,‘侠客行’);
    var a = new B(15,‘狼侠’,‘侠客’);
    如何阻止事件冒泡和默认事件
    canceBubble()只支持IE,return false,stopPropagation()
    添加 删除 替换 插入到某个接点的方法
    obj.appendChid()
    obj.insertBefore()
    obj.replaceChild()
    obj.removeChild()
    javascript的本地对象,内置对象和宿主对象
    本地对象为array obj regexp等可以new实例化
    内置对象为gload Math 等不可以实例化的
    宿主为浏览器自带的document,window 等
    window.onload 和document ready的区别
    window.onload 是在dom文档树加载完和所有文件加载完之后执行一个函数Document.ready原生种没有这个方法,jquery中有 $().ready(function),在dom文档树加载完之后执行一个函数(注意,这里面的文档树加载完不代表全部文件加载完)。
    ( d o c u m e n t ) . r e a d y 要 比 w i n d o w . o n l o a d 先 执 行 w i n d o w . o n l o a d 只 能 出 来 一 次 , (document).ready要比window.onload先执行 window.onload只能出来一次, (document).readywindow.onloadwindow.onload(document).ready可以出现多次
    ”和“=”的不同
    前者会自动转换类型
    后者不会
    javascript的同源策略
    一段脚本只能读取来自于同一来源的窗口和文档的属性,这里的同一来源指的是主机名、议和端口号的组合
    JavaScript是一门什么样的语言,它有哪些特点?
    没有标准答案。
    javaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML网页上使用,用来给HTML网页增加动态功能。JavaScript兼容于ECMA标准,因此也称为ECMAScript。
    基本特点
    1.是一种解释性脚本语言(代码不进行预编译)。
    2.主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。
    3.可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。
    4.跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。
    JavaScript的数据类型都有什么?
    基本数据类型:String,boolean,Number,Undefined, Null
    引用数据类型:Object(Array,Date,RegExp,Function)
    那么问题来了,如何判断某变量是否为数组数据类型?
    方法一.判断其是否具有“数组性质”,如slice()方法。可自己给该变量定义slice方法,故有时会失效
    方法二.obj instanceof Array 在某些IE版本中不正确
    方法三.方法一二皆有漏洞,在ECMA Script5中定义了新方法Array.isArray(), 保证其兼容性,最好的方法如下:

    if(typeof Array.isArray==="undefined")
    

    {
      Array.isArray = function(arg){
            return Object.prototype.toString.call(arg)==="[object Array]"
        }; 
    }
    已知ID的Input输入框,希望获取这个输入框的输入值,怎么做?(不使用第三方框架)
    document.getElementById(“ID”).value
    希望获取到页面中所有的checkbox怎么做?(不使用第三方框架)

    var domList = document.getElementsByTagName(‘input’)
    

    var checkBoxList = [];
    var len = domList.length;  //缓存到局部变量
    while (len–) {  //使用while的效率会比for循环更高
      if (domList[len].type == ‘checkbox’) {
          checkBoxList.push(domList[len]);
      }
    }
    设置一个已知ID的DIV的html内容为xxxx,字体颜色设置为黑色(不使用第三方框架)

    var dom = document.getElementById(“ID”);
    

    dom.innerHTML = “xxxx”
    dom.style.color = “#000”
    当一个DOM节点被点击时候,我们希望能够执行一个函数,应该怎么做?
    直接在DOM里绑定事件:


    在JS里通过onclick绑定:xxx.onclick = test
    通过事件添加进行绑定:addEventListener(xxx, ‘click’, test)
    那么问题来了,Javascript的事件流模型都有什么?
    “事件冒泡”:事件开始由最具体的元素接受,然后逐级向上传播
    “事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的
    “DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡
    看下列代码输出为何?解释原因。

    var a;
    

    alert(typeof a); // undefined
    alert(b); // 报错
    解释:Undefined是一个只有一个值的数据类型,这个值就是“undefined”,在使用var声明变量但并未对其赋值进行初始化时,这个变量的值就是undefined。而b由于未声明将报错。注意未申明的变量和声明了未赋值的是不一样的。
    看下列代码,输出什么?解释原因。

    var a = null;
    

    alert(typeof a); //object
    解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”。
    看下列代码,输出什么?解释原因。

    var undefined;
    

    undefined == null; // true
    1 == true;   // true
    2 == true;   // false
    0 == false;  // true
    0 == ‘’;     // true
    NaN == NaN;  // false
    [] == false; // true
    [] == ![];   // true
    undefined与null相等,但不恒等(=
    一个是number一个是string时,会尝试将string转换为number
    尝试将boolean转换为number,0或1
    尝试将Object转换成number或string,取决于另外一个对比量的类型
    所以,对于0、空字符串的判断,建议使用 “
    =” 。“===”会先判断两边的值类型,类型不匹配时为false。
    那么问题来了,看下面的代码,输出什么,foo的值为什么?

    var foo = "11"+2-"1";
    

    console.log(foo);
    console.log(typeof foo);
    执行完后foo的值为111,foo的类型为String。
    看代码给答案。

    var a = new Object();
    

    a.value = 1;
    b = a;
    b.value = 2;
    alert(a.value);
    答案:2(考察引用数据类型细节)
    已知数组var stringArray = [“This”, “is”, “Baidu”, “Campus”],Alert出”This is Baidu Campus”。
    答案:alert(stringArray.join(“”))
    已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”。

    function combo(msg){
    

    var arr=msg.split("-");
        for(var i=1;i<arr.length;i++){
            arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
        }
        msg=arr.join("");
        return msg;
    }
    (考察基础API)
    var numberArray = [3,6,2,4,1,5]; (考察基础API)
    1) 实现对该数组的倒排,输出[5,1,4,2,6,3]
    numberArray.reverse()
    2) 实现对该数组的降序排列,输出[6,5,4,3,2,1]
    numberArray.sort(function(a,b){return b-a})
    输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26

    var d = new Date();
    

    // 获取年,getFullYear()返回4位的数字
    var year = d.getFullYear();
    // 获取月,月份比较特殊,0是1月,11是12月
    var month = d.getMonth() + 1;
    // 变成两位
    month = month < 10 ? ‘0’ + month : month;
    // 获取日
    var day = d.getDate();
    day = day < 10 ? ‘0’ + day : day;
    alert(year + ‘-’ + month + ‘-’ + day);
    将字符串”{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲</td><td>{name}”中的{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲替换成10,{name}替换成Tony (使用正则表达式)
    答案:"{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲</td><td>{id}_{$name}".replace(/{$id}/g, ‘10’).replace(/{$name}/g, ‘Tony’);
    为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数escapeHtml,将<, >, &, “进行转义

    function escapeHtml(str) {
    

    return str.replace(/[<>”&]/g, function(match) {
        switch (match) {
                       case “<”:
                          return “<”;
                       case “>”:
                          return “>”;
                       case “&”:
                          return “&”;
                       case “\””:
                          return “"”;
          }
      });
    }
    foo = foo||bar ,这行代码是什么意思?为什么要这样写?
    答案:if(!foo) foo = bar; //如果foo存在,值不变,否则把bar的值赋给foo。
    短路表达式:作为”&&”和”||”操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值。
    看下列代码,将会输出什么?(变量声明提升)

    var foo = 1;
    

    (function(){
        console.log(foo);
        var foo = 2;
        console.log(foo);
    })()
    答案:输出undefined 和 2。上面代码相当于:

    var foo = 1;
    

    (function(){
        var foo;
        console.log(foo); //undefined
        foo = 2;
        console.log(foo); // 2;  
    })()
    函数声明与变量声明会被JavaScript引擎隐式地提升到当前作用域的顶部,但是只提升名称不会提升赋值部分。
    用js实现随机选取10–100之间的10个数字,存入一个数组,并排序。

    function randomNub(aArray, len, min, max) {
               if (len >= (max - min)) {
                   return '超过' + min + '-' + max + '之间的个数范围' + (max - min - 1) + '个的总数';
               }
               if (aArray.length >= len) {
                   aArray.sort(function(a, b) {
                       return a - b
                   });
                   return aArray;
               }
               var nowNub = parseInt(Math.random() * (max - min - 1)) + (min + 1);
               for (var j = 0; j < aArray.length; j++) {
                   if (nowNub == aArray[j]) {
                       randomNub(aArray, len, min, max);
                       return;
                   }
               }
               aArray.push(nowNub);
               randomNub(aArray, len, min, max);
               return aArray;
           }
    

    var arr=[];
    randomNub(arr,10,10,100);
    把两个数组合并,并删除第二个元素。

    var array1 = ['a','b','c'];
    

    var bArray = [‘d’,‘e’,‘f’];
    var cArray = array1.concat(bArray);
    cArray.splice(1,1);
    怎样添加、移除、移动、复制、创建和查找节点(原生JS,实在基础,没细写每一步)
    1)创建新节点
    createDocumentFragment()    //创建一个DOM片段
    createElement()   //创建一个具体的元素
    createTextNode()   //创建一个文本节点
    2)添加、移除、替换、插入
    appendChild()      //添加
    removeChild()      //移除
    replaceChild()      //替换
    insertBefore()      //插入
    3)查找
    getElementsByTagName()    //通过标签名称
    getElementsByName()     //通过元素的Name属性的值
    getElementById()        //通过元素Id,唯一性
    有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}。
    答案:

    function serilizeUrl(url) {
    var urlObject = {};
    if (/\?/.test(url)) {
        var urlString = url.substring(url.indexOf("?") + 1);
        var urlArray = urlString.split("&");
        for (var i = 0, len = urlArray.length; i < len; i++) {
            var urlItem = urlArray[i];
            var item = urlItem.split("=");
            urlObject[item[0]] = item[1];
        }
        return urlObject;
    }
    return null;
    

    }
    正则表达式构造函数var reg=new RegExp(“xxx”)与正则表达字面量var reg=//有什么不同?匹配邮箱的正则表达式?
    答案:当使用RegExp()构造函数的时候,不仅需要转义引号(即\”表示”),并且还需要双反斜杠(即\表示一个\)。使用正则表达字面量的效率更高。 
    邮箱的正则匹配:
    var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;
    看下面代码,给出输出结果。

    for(var i=1;i<=3;i++){
    

    setTimeout(function(){
          console.log(i);   
      },0); 
    };
    答案:4 4 4。
    原因:Javascript事件处理器在线程空闲之前不会运行。追问,如何让上述代码输出1 2 3?

    for(var i=1;i<=3;i++){
    

    setTimeout((function(a){  //改成立即执行函数
           console.log(a);   
       })(i),0); 
    };
     
    1           //输出
    2
    3
    写一个function,清除字符串前后的空格。(兼容所有浏览器)
    使用自带接口trim(),考虑兼容性:

    if (!String.prototype.trim) { 
    

    String.prototype.trim = function() {
     return this.replace(/^\s+/, “”).replace(/\s+$/,"");
     }
    }
     
    // test the function
    var str = " \t\n test string ".trim();
    alert(str == “test string”); // alerts “true”
    Javascript中callee和caller的作用?
    caller是返回一个对函数的引用,该函数调用了当前函数;
    callee是返回正在被执行的function函数,也就是所指定的function对象的正文。
    那么问题来了?如果一对兔子每月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,第n个月能繁殖成多少对兔子?(使用callee完成)

    var result=[];
    

    function fn(n){  //典型的斐波那契数列
       if(n1){
            return 1;
       }else if(n
    2){
               return 1;
       }else{
            if(result[n]){
                    return result[n];
            }else{
                    //argument.callee()表示fn()
                    result[n]=arguments.callee(n-1)+arguments.callee(n-2);
                    return result[n];
            }
       }
    }
    Javascript中, 以下哪条语句一定会产生运行错误? 答案( B C )
    var _变量=NaN; B、var 0bj = []; C、var obj = //; D、var obj = {};
    以下两个变量a和b,a+b的哪个结果是NaN? 答案( AC )
    A、var a=undefined; b=NaN
    B、var a= ‘123’; b=NaN
    C、var a =undefined , b =NaN
    var a=NaN , b=‘undefined’
    var a=10; b=20; c=4; ++b+c+a++ 以下哪个结果是正确的?答案( B )
    A、34 B、35 C、36 D、37
    下面的JavaScript语句中,( D )实现检索当前页面中的表单元素中的所有文本框,并将它们全部清空
    A. for(vari=0;i< form1.elements.length;i++) {
    if(form1.elements.type==”text”)
    form1.elements.value=”";}
    B. for(vari=0;i<document.forms.length;i++) {
    if(forms[0].elements.type==”text”)
    forms[0].elements.value=”";
    }
    C. if(document.form.elements.type==”text”)
    form.elements.value=”";
    D. for(vari=0;i<document.forms.length; i++){
    for(var j=0;j<document.forms.elements.length; j++){
    if(document.forms.elements[j].type==”text”)
    document.forms.elements[j].value=”";
    }
    }
    要将页面的状态栏中显示“已经选中该文本框”,下列JavaScript语句正确的是( A )
    A. window.status=”已经选中该文本框”
    B. document.status=”已经选中该文本框”
    C. window.screen=”已经选中该文本框”
    D. document.screen=”已经选中该文本框”
    以下哪条语句会产生运行错误:(AD)

    A.var obj = ();
    B.var obj = [];
    C.var obj = {};
    D.var obj = //;
    以下哪个单词不属于javascript保留字:(B)

    A.with
    B.parent
    C.class
    D.void
    请选择结果为真的表达式:(C)

    A.null instanceof Object
    B.null === undefined
    C.null == undefined
    D.NaN == NaN
    Javascript中, 如果已知HTML页面中的某标签对象的id=”username”,用____document.getElementById(‘username’)___ 方法获得该标签对象。
    typeof运算符返回值中有一个跟javascript数据类型不一致,它是
    _______”function”_________。
    定义了一个变量,但没有为该变量赋值,如果alert该变量,javascript弹出的对话框中显示___undefined______ 。
    分析代码,得出正确的结果。
    var a=10, b=20 , c=30;
    ++a;
    a++;
    e=++a+(++b)+(c++)+a++;
    alert(e);
    弹出提示对话框:77
    写出函数DateDemo的返回结果,系统时间假定为今天
    function DateDemo(){
    var d, s=“今天日期是:”;
    d = new Date();
    s += d.getMonth() +1+ “/”;
    s += d.getDate() + “/”;
    s += d.getFullYear();
    return s;}
    结果:今天日期是:7/17/2010
    写出程序运行的结果?
    for(i=0, j=0; i<10, j<6; i++, j++){
    k = i + j;}
    结果:10
    阅读以下代码,请分析出结果:
    var arr = new Array(1 ,3 ,5);
    arr[4]=‘z’;
    arr2 = arr.reverse();
    arr3 = arr.concat(arr2);
    alert(arr3);
    弹出提示对话框:z,5,3,1,z,5,3,1
    补充按钮事件的函数,确认用户是否退出当前页面,确认之后关闭窗?


    城市生活 都市早报 青山绿水 截取字符串abcdefg的efg alert('abcdefg'.substring(4)); 列举浏览器对象模型BOM里常用的至少4个对象,并列举window对象的常用方法至少5个 对象:window, document, location, screen, history, navigator 方法:alert(), confirm(), prompt(), open(), close() 简述列举文档对象模型DOM里document的常用的查找访问节点的方法并做简单说明 Document.getElementById 根据元素id查找元素 Document.getElementByName 根据元素name查找元素 Document.getElementTagName 根据指定的元素名查找元素 希望获取到页面中所有的checkbox怎么做?(不使用第三方框架) var domList = document.getElementsByTagName(‘input’) var checkBoxList = []; var len = domList.length;  //缓存到局部变量 while (len--) {  //使用while的效率会比for循环更高   if (domList[len].type == ‘checkbox’) {   checkBoxList.push(domList[len]);   } } 简述创建函数的几种方式 第一种(函数声明):  function sum1(num1,num2){    return num1+num2; } 第二种(函数表达式): var sum2 = function(num1,num2){    return num1+num2; } 第三种(函数对象方式): var sum3 = new Function("num1","num2","return num1+num2");

    Javascript如何实现继承?
    1.构造继承法
    2.原型继承法
    3.实例继承法
    Javascript创建对象的几种方式?
    1、var obj = {};(使用json创建对象)
    如:obj.name = ‘张三’;​
    obj.action = function ()
    {
    alert(‘吃饭’);
    }​;
    2、var obj = new Object();(使用Object创建对象)
    如:obj.name = ‘张三’;​
    obj.action = function ()
    {
    alert(‘吃饭’);
    }​;
    3、​通过函数创建对象。
    (1)、使用this关键字​
    如:var obj = function (){
    this.name =‘张三’;
    this.age = 19;
    this.action = function ()
    {
    alert(‘吃饭’);
    }​;
    }​
    (2)、使用prototype关键字
    如:function obj (){}
    obj.prototype.name =‘张三’;
    ​obj.prototype.action=function ()
    {
    alert(‘吃饭’);
    }​;
    4、通过Window创建对象。
    如:window.name = '‘张三’;
    window.age = 19;
    window.action= function()
    {
    alert(‘吃饭’);
    };
    5、使用内置对象创建对象。
    如:var str = new String(“实例初始化String”);
    var str1 = “直接赋值的String”;
    var func = new Function(“x”,“alert(x)”);//示例初始化func
    var obj = new Object();//示例初始化一个Object
    iframe的优缺点?
    优点:

    1. 解决加载缓慢的第三方内容如图标和广告等的加载问题
    2. Security sandbox
    3. 并行加载脚本
      缺点:
    4. iframe会阻塞主页面的Onload事件
    5. 即时内容为空,加载也需要时间
    6. 没有语意
      请你谈谈Cookie的弊端?
      缺点:
      1.Cookie数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。
      2.安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。
      3.有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。
      js延迟加载的方式有哪些?
    7. defer和async
    8. 动态创建DOM方式(创建script,插入到DOM中,加载完毕后callBack)
    9. 按需异步载入js
      documen.write和 innerHTML 的区别?
      document.write 只能重绘整个页面
      innerHTML 可以重绘页面的一部分
      哪些操作会造成内存泄漏?
      内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
      垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
    10. setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
    11. 闭包
    12. 控制台日志
    13. 循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
      判断一个字符串中出现次数最多的字符,统计这个次数
      答:var str = ‘asdfssaaasasasasaa’;
      var json = {};
      for (var i = 0; i < str.length; i++) {
              if(!json[str.charAt(i)]){
                      json[str.charAt(i)] = 1;
              }else{
                      json[str.charAt(i)]++;
              }
      };
      var iMax = 0;
      var iIndex = ‘’;
      for(var i in json){
              if(json[i]>iMax){
                      iMax = json[i];
                      iIndex = i;
              }
      }
      alert(‘出现次数最多的是:’+iIndex+‘出现’+iMax+‘次’);
      写一个获取非行间样式的函数
      function getStyle(obj,attr,value)
      {
      if(!value)
      {
      if(obj.currentStyle)
      {
      return obj.currentStyle(attr);
      }
      else{
      obj.getComputedStyle(attr,false);
      }
      }
      else
      {
      obj.style[attr] = value;
      }
      }
      事件委托是什么
      让利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!
      闭包是什么,有什么特性,对页面有什么影响
          答:我的理解是,闭包就是能够读取其他函数内部变量的函数。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
      function outer(){
          var num = 1;
          function inner(){
              var n = 2;
              alert(n + num);
          }
          return inner;
      }
      outer()();

    http://blog.csdn.net/gaoshanwudi/article/details/7355794 此链接可查看(问这个问题的不是一个公司)
    解释jsonp的原理,以及为什么不是真正的ajax
    动态创建script标签,回调函数
    Ajax是页面无刷新请求数据操作
    javascript的本地对象,内置对象和宿主对象
    本地对象为array obj regexp等可以new实例化
    内置对象为gload Math 等不可以实例化的
    宿主为浏览器自带的document,window 等
    字符串反转,如将 ‘12345678’ 变成 ‘87654321’
    //大牛做法;
    //思路:先将字符串转换为数组 split(),利用数组的反序函数 reverse()颠倒数组,再利用 jion() 转换为字符串
    var str = ‘12345678’;
    str = str.split(’’).reverse().join(’’);
    将数字 12345678 转化成 RMB形式 如: 12,345,678 
    //个人方法;
    //思路:先将数字转为字符, str= str + ‘’ ;
    //利用反转函数,每三位字符加一个 ','最后一位不加; re()是自定义的反转函数,最后再反转回去!
    function re(str) {
    str += ‘’;
    return str.split("").reverse().join("");
    }

    function toRMB(num) {
    var tmp=’’;
    for (var  i  =  1;  i  <=  re(num).length;  i++) {    
    tmp  +=  re(num)[i  -  1];    
    if (i  %  3  ==  0  &&  i  !=  re(num).length) {        
    tmp  +=  ‘,’;    
    }
    }
    return re(tmp);
    }
    生成5个不同的随机数;
    //思路:5个不同的数,每生成一次就和前面的所有数字相比较,如果有相同的,则放弃当前生成的数字!
    var num1 = [];
    for(var i = 0; i < 5; i++){
        num1[i] = Math.floor(Math.random()*10) + 1; //范围是 [1, 10]
        for(var j = 0; j < i; j++){
            if(num1[i] == num1[j]){
                i–;
            }
        }
    }
    去掉数组中重复的数字 方法一;

    //思路:每遍历一次就和之前的所有做比较,不相等则放入新的数组中!
    

    //这里用的原型 个人做法;
    Array.prototype.unique = function(){
        var len = this.length,
            newArr = [],
            flag = 1;
        for(var i = 0; i < len; i++, flag = 1){
            for(var j = 0; j < i; j++){
                if(this[i] == this[j]){
                    flag = 0;        //找到相同的数字后,不执行添加数据
                }
            }
            flag ? newArr.push(this[i]) : ‘’;
        }
        return newArr;
    }
        方法二:
    var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];
    Array.prototype.unique2 = function()
    {
    var n = []; //一个新的临时数组
    for(var i = 0; i < this.length; i++) //遍历当前数组
    {
    //如果当前数组的第i已经保存进了临时数组,那么跳过,
    //否则把当前项push到临时数组里面
    if (n.indexOf(this[i]) == -1) n.push(this[i]);
    }
    return n;
    }

    var newArr2=arr.unique2(arr);
    alert(newArr2); //输出1,2,3,4,5,6,9,25

    阶乘函数;
    //原型方法
    Number.prototype.N = function(){
        var re = 1;
        for(var i = 1; i <= this; i++){
            re *= i;
        }
        return re;
    }
    var num = 5;
    alert(num.N());
    window.location.search() 返回的是什么?
        答:查询(参数)部分。除了给动态语言赋值以外,我们同样可以给静态页面,并使用javascript来获得相信应的参数值
            返回值:?ver=1.0&id=timlq 也就是问号后面的!
    window.location.hash 返回的是什么?
        答:锚点 , 返回值:#love ;
    window.location.reload() 作用?
        答:刷新当前页面。
    、javascript 中的垃圾回收机制?
        答:在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再  被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么  函数a执行后不会被回收的原因。
    看题做答:
    function f1(){
        var tmp = 1;
        this.x = 3;
        console.log(tmp);    //A
        console.log(this.x);     //B
    }
    var obj = new f1(); //1
    console.log(obj.x)     //2
    console.log(f1());        //3
        分析:    
            这道题让我重新认识了对象和函数,首先看代码(1),这里实例话化了 f1这个类。相当于执行了 f1函数。所以这个时候 A 会输出 1, 而 B 这个时候的 this 代表的是 实例化的当前对象 obj B 输出 3.。 代码(2)毋庸置疑会输出 3, 重点 代码(3)首先这里将不再是一个类,它只是一个函数。那么 A输出 1, B呢?这里的this 代表的其实就是window对象,那么this.x 就是一个全局变量 相当于在外部 的一个全局变量。所以 B 输出 3。最后代码由于f没有返回值那么一个函数如果没返回值的话,将会返回 underfined ,所以答案就是 : 1, 3, 3, 1, 3, underfined 。
    下面输出多少?
    var o1 = new Object();
    var o2 = o1;
    o2.name = “CSSer”;
    console.log(o1.name);
      如果不看答案,你回答真确了的话,那么说明你对javascript的数据类型了解的还是比较清楚了。js中有两种数据类型,分别是:基本数据类型和引用数据类型(object Array)。对于保存基本类型值的变量,变量是按值访问的,因为我们操作的是变量实际保存的值。对于保存引用类型值的变量,变量是按引用访问的,我们操作的是变量值所引用(指向)的对象。答案就清楚了:  //CSSer;
    再来一个
    function changeObjectProperty (o) {
        o.siteUrl = “http://www.csser.com/”;
        o = new Object();
        o.siteUrl = “http://www.popcg.com/”;
    }
    var CSSer = new Object();
    changeObjectProperty(CSSer);
    console.log(CSSer.siteUrl); //
        如果CSSer参数是按引用传递的,那么结果应该是"http://www.popcg.com/",但实际结果却仍是"http://www.csser.com/"。事实是这样的:在函数内部修改了引用类型值的参数,该参数值的原始引用保持不变。我们可以把参数想象成局部变量,当参数被重写时,这个变量引用的就是一个局部变量,局部变量的生存期仅限于函数执行的过程中,函数执行完毕,局部变量即被销毁以释放内存。    
        (补充:内部环境可以通过作用域链访问所有的外部环境中的变量对象,但外部环境无法访问内部环境。每个环境都可以向上搜索作用域链,以查询变量和函数名,反之向下则不能。)
    a输出多少?
    var a = 6;
    setTimeout(function () {    
        var a = 666;
        alert(a);      // 输出666,
    }, 1000);
    因为var a = 666;定义了局部变量a,并且赋值为666,根据变量作用域链,
    全局变量处在作用域末端,优先访问了局部变量,从而覆盖了全局变量 。
    var a = 6;
    setTimeout(function () {    
        alert(a);      // 输出undefined 
        var a = 666;
    }, 1000);
    因为var a = 666;定义了局部变量a,同样覆盖了全局变量,但是在alert(a);之前
    a并未赋值,所以输出undefined。

    var a = 6; 
    

    setTimeout(function(){
        alert(a);
        var a = 66; 
    }, 1000);
    a = 666; 
    alert(a); 
    // 666, undefined;
    记住: 异步处理,一切OK 声明提前
    看程序,写结果
    function setN(obj){
        obj.name=‘屌丝’;
        obj = new Object(); 
        obj.name = ‘腐女’;
    };
    var per = new Object();
    setN(per);
    alert(per.name);  //屌丝 内部
    JS的继承性
    window.color = ‘red’;
    var o = {color: ‘blue’};
    function sayColor(){
        alert(this.color);
    }
    sayColor(); //red
    sayColor.call(this); //red this-window对象
    sayColor.call(window); //red
    sayColor.call(o); //blue
    精度问题: JS 精度不能精确到 0.1 所以  。。。。同时存在于值和差值中
    var n = 0.3,m = 0.2, i = 0.2, j = 0.1;
    alert((n - m) == (i - j)); //false
    alert((n-m) == 0.1); //false
    alert((i-j)==0.1); //true
    加减运算
    alert(‘5’+3); //53 string
    alert(‘5’+‘3’); //53 string
    alert(‘5’-3); //2 number
    alert(‘5’-‘3’); //2 number
    什么是同源策略?
        指: 同协议、端口、域名的安全策略,由王景公司提出来的安全协议!
    为什么不能定义1px左右的div容器?   
    IE6下这个问题是因为默认的行高造成的,解决的方法也有很多,例如:
    overflow:hidden | zoom:0.08 | line-height:1px
    结果是什么?
    function foo(){
        foo.a = function(){alert(1)}; 
        this.a = function(){alert(2)};
        a = function(){alert(3)};
        var a = function(){alert(4)};
    }; 
    foo.prototype.a = function(){alert(5)};
    foo.a = function(){alert(6)};
    foo.a(); //6
    var obj = new foo();
    obj.a(); //2
    foo.a(); //1
    输出结果
    var a = 5; 
    function test(){
        a = 0; 
        alert(a); 
        alert(this.a); //没有定义 a这个属性
        var a; 
        alert(a)
    }
    test(); // 0, 5, 0
    new test(); // 0, undefined, 0 //由于类它自身没有属性a, 所以是undefined
    计算字符串字节数:
    new function(s){ 
         if(!arguments.length||!s) return null;  
         if(""==s) return 0;     
         var l=0;
         for(var i=0;i<s.length;i++){        
             if(s.charCodeAt(i)>255) l+=2; else l+=1;  //charCodeAt()得到的是unCode码   
         }     //汉字的unCode码大于 255bit 就是两个字节
         alert(l); 
    }(“hello world!”);
    结果是:
    var bool = !!2; alert(bool);//true;
    双向非操作可以把字符串和数字转换为布尔值。
    声明对象,添加属性,输出属性
        var obj = {
            name: ‘leipeng’,
            showName: function(){
                alert(this.name);
            }
        }
    obj.showName();
    匹配输入的字符:第一个必须是字母或下划线开头,长度5-20
    var reg = /1[a-zA-Z0-9_]{5,20}/,
                name1 = ‘leipeng’,
                name2 = ‘0leipeng’,
                name3 = ‘你好leipeng’,
                name4 = ‘hi’;
         
            alert(reg.test(name1));
            alert(reg.test(name2));
            alert(reg.test(name3));
            alert(reg.test(name4));
    检测变量类型
    function checkStr(str){
    return str ==‘string’;
    }

    console.log(checkStr(“aaa”));
    如何在HTML中添加事件,几种方法?
        1、标签之中直接添加 οnclick=“fun()”;
        2、JS添加 Eobj.onclick = method;
        3、现代事件  IE: obj.attachEvent(‘onclick’, method);
                    FF: obj.addEventListener(‘click’, method, false);
    BOM对象有哪些,列举window对象?
        1、window对象 ,是JS的最顶层对象,其他的BOM对象都是window对象的属性;
        2、document对象,文档对象;
        3、location对象,浏览器当前URL信息;
        4、navigator对象,浏览器本身信息;
        5、screen对象,客户端屏幕信息;
        6、history对象,浏览器访问历史信息;
    请问代码实现 outerHTML
        //说明:outerHTML其实就是innerHTML再加上本身;
    Object.prototype.outerHTML = function(){
            var innerCon = this.innerHTML, //获得里面的内容
                outerCon = this.appendChild(innerCon); //添加到里面
            alert(outerCon); 
        }
        演示代码:
         
     <!doctype html>
     
      
        
        Document
      
      
        


           hello
        

      
     
     
    JS中的简单继承 call方法!
    //顶一个父母类,注意:类名都是首字母大写的哦!
      function Parent(name, money){
                 this.name = name;
                this.money = money;
                 this.info = function(){
                    alert('姓名: ‘+this.name+’ 钱: '+ this.money);
                }
            }
            //定义孩子类
            function Children(name){
                Parent.call(this, name); //继承 姓名属性,不要钱。  
                 this.info = function(){
                    alert('姓名: '+ this.name);
                }
            }
            //实例化类
            var per = new Parent(‘parent’, 800000000000);
            var chi = new Children(‘child’);
             per.info();
             chi.info();
    bind(), live(), delegate()的区别
        bind: 绑定事件,对新添加的事件不起作用,方法用于将一个处理程序附加到每个匹配元素的事件上并返回jQuery对象。
        live: 方法将一个事件处理程序附加到与当前选择器匹配的所有元素(包含现有的或将来添加的)的指定事件上并返回jQuery对象。
        delegate: 方法基于一组特定的根元素将处理程序附加到匹配选择器的所有元素(现有的或将来的)的一个或多个事件上。  
    看下列代码输出什么?
    var foo = “11”+2-“1”;
    console.log(foo);
    console.log(typeof foo);
    执行完后foo的值为111,foo的类型为Number。
    看下列代码,输出什么?
    var a = new Object();
    a.value = 1;
    b = a;
    b.value = 2;
    alert(a.value);
    执行完后输出结果为2
    你如何优化自己的代码?
    代码重用
    避免全局变量(命名空间,封闭空间,模块化mvc…)
    拆分函数避免函数过于臃肿
    注释
    请描述出下列代码运行的结果
    function d(){
    console.log(this);
    }
    d();//输出window对象
    怎样实现两栏等高?

    Title
    内容
    内容
    内容
    内容
    内容
    内容

    使用js实现这样的效果:在文本域里输入文字时,当按下enter键时不换行,而是替换成“{{enter}}”,(只需要考虑在行尾按下enter键的情况).

    以下代码中end字符串什么时候输出
    var t=true;
    setTimeout(function(){
    console.log(123);
    t=false;
    },1000);
    while(t){}
    console.log(‘end’);
    永远不输出
    specify(‘hello,world’)//=>’h,e,l,l,o,w,o,r,l,d’实现specify函数
    function specify(str){
    var tempArray = Array.prototype.filter.call(str,function(value,index,array){
    return value >= ‘A’ && value <= ‘z’ && value != “_”;
    });
    return tempArray.join(",");
    }

    console.log(specify(“hedd____df*(%$#a !!!))))))llo,Wo@@@r ld”)); //h,e,l,l,o,W,o,r,l,d

    请将一个URL的search部分参数与值转换成一个json对象
    请用原生js实现jquery的get\post功能,以及跨域情况下
    请简要描述web前端性能需要考虑哪方面,你的优化思路是什么?
    、简述readyonly与disabled的区别
    ReadOnly和Disabled的作用是使用户不能够更改表单域中的内容.
    但是二者还是有着一些区别的:
    1、Readonly只针对input(text/password)和textarea有效,而disabled对于所有的表单元素有效,包括select,radio,checkbox,button等。
    2、在表单元素使用了disabled后,我们将表单以POST或者GET的方式提交的话,这个元素的值不会被传递出去,而readonly会将该值传递出去
    写出3个使用this的典型应用
    请尽可能详尽的解释ajax的工作原理
    Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。这样把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的。

    简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对 XMLHttpRequest有所了解。

    、为什么扩展javascript内置对象不是好的做法?
    因为你不知道哪一天浏览器或javascript本身就会实现这个方法,而且和你扩展的实现有不一致的表现。到时候你的javascript代码可能已经在无数个页面中执行了数年,而浏览器的实现导致所有使用扩展原型的代码都崩溃了。。。

    什么是三元表达式?“三元”表示什么意思?
    三元运算符:
    三元如名字表示的三元运算符需要三个操作数。
    语法是 条件 ? 结果1 : 结果2;. 这里你把条件写在问号(?)的前面后面跟着用冒号(:)分隔的结果1和结果2。满足条件时结果1否则结果2。

    浏览器标准模式和怪异模式之间的区别是什么?
    所谓的标准模式是指,浏览器按W3C标准解析执行代码;怪异模式则是使用浏览器自己的方式解析执行代码,因为不同浏览器解析执行的方式不一样,所以我们称之为怪异模式
    modulo(12,5)//2 实现满足这个结果的modulo函数
    HTTP协议中,GET和POST有什么区别?分别适用什么场景 ?
    HTTP状态消息200 302 304 403 404 500分别表示什么
    HTTP协议中,header信息里面,怎么控制页面失效时间(last-modified,cache-control,Expires分别代表什么)
    HTTP雷锋议目前常用的有哪几个?KEEPALIVE从哪个版本开始出现的?
    业界常用的优化WEB页面加载速度的方法(可以分别从页面元素展现,请求连接,css,js,服务器等方面介绍)
    列举常用的web页面开发,调试以及优化工具
    解释什么是sql注入,xss漏洞
    如何判断一个js变量是数组类型
    请列举js数组类型中的常用方法
    FF与IE中如何阻止事件冒泡,如何获取事件对象,以及如何获取触发事件的元素
    function stopPropagation(e) {  
        e = e || window.event;  
        if(e.stopPropagation) { //W3C阻止冒泡方法  
            e.stopPropagation();  
        } else {  
            e.cancelBubble = true; //IE阻止冒泡方法  
        }  
    }  
    document.getElementById(‘need_hide’).onclick = function(e) {  
        stopPropagation(e);  
    }

    列举常用的js框架以及分别适用的领域
    js中如何实现一个map
    js可否实现面向对象编程,如果可以如何实现js对象的继承
    约瑟夫环—已知n个人(以编号1,2,3…分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
    有1到10w这个10w个数,去除2个并打乱次序,如何找出那两个数?
    如何获取对象a拥有的所有属性(可枚举的、不可枚举的,不包括继承来的属性)
    有下面这样一段HTML结构,使用css实现这样的效果:
    左边容器无论宽度如何变动,右边容器都能自适应填满父容器剩余的宽度。

    下面这段代码想要循环输出结果01234,请问输出结果是否正确,如果不正确,请说明为什么,并修改循环内的代码使其输出正确结果 for(var i=0;i<5;++i){ setTimeout(function(){ console.log(i+’’); },100*i); } 以下哪些是javascript的全局函数:(ABC) A. escape 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。 B. parseFloat parseFloat() 函数可解析一个字符串,并返回一个浮点数。 该函数指定字符串中的首个字符是否是数字。如果是,则对字符串进行解析,直到到达数字的末端为止,然后以数字返回该数字,而不是作为字符串。 C. eval 函数可计算某个字符串,并执行其中的的 JavaScript 代码。 D. setTimeout E. alert

    关于IE的window对象表述正确的有:(ACD)
    A. window.opener属性本身就是指向window对象
    B. window.reload()方法可以用来刷新当前页面 应该是location.reload或者window.location.reload
    C. window.location=”a.html”和window.location.href=”a.html”的作用都是把当前页面替换成a.html页面
    D. 定义了全局变量g;可以用window.g的方式来存取该变量
    下面正确的是 A
    A: 跨域问题能通过JsonP方案解决 B:不同子域名间仅能通过修改window.name解决跨域 还可以通过script标签src jsonp等h5 Java split等
    C:只有在IE中可通过iframe嵌套跨域 D:MediaQuery属性是进行视频格式检测的属性是做响应式的
    错误的是 B
    A: Ajax本质是XMLHttpRequest
    B: 块元素实际占用的宽度与它的width、border、padding属性有关,与background无关
    C: position属性absolute、fixed、—relative—会使文档脱标
    D: float属性left也会使div脱标
    答案C:relative不会脱离文档流
    不用任何插件,如何实现一个tab栏切换?
    变量的命名规范以及命名推荐
    变量,函数,方法:小写开头,以后的每个单词首字母大写 (驼峰)
    构造函数,class:每个单词大写开头
    基于实际情况,以动词,名词,谓词来命名。尽量言简意骇,以命名代替注释

    三种弹窗的单词以及三种弹窗的功能
    1.alert
    //弹出对话框并输出一段提示信息
    function ale() {
    //弹出一个对话框
    alert(“提示信息!”);

    }  
    

    2.confirm
    //弹出一个询问框,有确定和取消按钮
    function firm() {
    //利用对话框返回的值 (true 或者 false)
    if (confirm(“你确定提交吗?”)) {
    alert(“点击了确定”);
    }
    else {
    alert(“点击了取消”);
    }

    }  
    

    3.prompt
    //弹出一个输入框,输入一段文字,可以提交
    function prom() {
    var name = prompt(“请输入您的名字”, “”); //将输入的内容赋给变量 name ,

        //这里需要注意的是,prompt有两个参数,前面是提示的话,后面是当对话框出来后,在对话框里的默认值  
        if (name)//如果返回的有内容  
        {  
            alert("欢迎您:" + name)  
        }  
    
    }
    

    console.log( 8 | 1 ); 输出值是多少?
    答案:9
    只允许使用 + - * / 和 Math.* ,求一个函数 y = f(x, a, b);当x > 100 时返回 a 的值,否则返回 b 的值,不能使用 if else 等条件语句,也不能使用|,?:,数组。
    答案:
    function f(x, a, b) {
    var temp = Math.ceil(Math.min(Math.max(x - 100, 0), 1));

    return a * temp + b * (1 - temp);
    

    }
    console.log(f(-10, 1, 2));
    JavaScriptalert(0.4*0.2);结果是多少?和你预期的一样吗?如果不一样该如何处理?
    有误差,应该比准确结果偏大。 一般我会将小数变为整数来处理。当前之前遇到这个问题时也上网查询发现有人用try catch return写了一个函数,
    当然原理也是一致先转为整数再计算。
    一个div,有几种方式得到这个div的jQuery对象?

    想直接获取这个div的dom对象,如何获取?dom对象如何转化为jQuery对象?
    $(“#nodesView”) , ( “ . a a b b c c ” ) , (“.aabbcc”) , (.aabbcc),(“#nodesView”)[0] , $(“.aabbcc”)[0]

    、主流浏览器内核
    IE trident 火狐gecko 谷歌苹果webkit Opera:Presto
    如何显示/隐藏一个dom元素?请用原生的JavaScript方法实现
    jQuery框架中$.ajax()的常用参数有哪些?写一个post请求并带有发送数据和返回数据的样例
    async是否异步
    url请求地址
    contentType发送信息至服务器时内容编码类型
    data发送到服务器的数据
    dataType预期服务器返回的数据类型
    type请求类型
    success请求成功回调函数
    error请求失败回调函数

    $.ajax({
    url: “/jquery/test1.txt”,
    type: ‘post’,
    data: {
    id: 1
    },
    success: function(data) {
    alert(data);
    }
    }

    JavaScript的循环语句有哪些?
    For,for…in,while,do…while
    作用域-编译期执行期以及全局局部作用域问题
    闭包:下面这个ul,如何点击每一列的时候alert其index?

    • 这是第一条
    • 这是第二条
    • 这是第三条
    //js window.onload = function() { var lis = document.getElementById('test').children; for (var i = 0; i < lis.length; i++) { lis[i].onclick = (function(i) { return function() { alert(i) }; })(i); }; } 列出3条以上ff和IE的脚本兼容问题 (1) window.event:  表示当前的事件对象,IE有这个对象,FF没有,FF通过给事件处理函数传递事件对象 

    (2) 获取事件源 
    IE用srcElement获取事件源,而FF用target获取事件源

    (3) 添加,去除事件 
    IE:element.attachEvent(“onclick”, function) element.detachEvent(“onclick”, function) 
    FF:element.addEventListener(“click”, function, true) element.removeEventListener(“click”, function, true)

    (4) 获取标签的自定义属性 
    IE:div1.value或div1[“value”] 
    FF:可用div1.getAttribute(“value”) 
    如现在有一个效果,有显示用户头像、用户昵称、用户其他信息;当用户鼠标移到头像上时,会弹出用户的所有信息;如果是你,你会如何实现这个功能,请用代码实现?
    (略)
    提示:先写个div将用户信息放入,默认隐藏,当使用:hover样式显示这个div
    用正则表达式,写出由字母开头,其余由数字、字母、下划线组成的6~30的字符串?
    2{1}[\w]{5,29}$
    列举浏览器对象模型BOM里常用的至少4个对象,并列举window对象的常用方法至少5个 (10分)
    对象:Window document location screen history navigator
    方法:Alert() confirm() prompt() open() close()
    在Javascript中什么是伪数组?如何将伪数组转化为标准数组?
    答案:
    伪数组(类数组):无法直接调用数组方法或期望length属性有什么特殊的行为,但仍可以对真正数组遍历方法来遍历它们。典型的是函数的argument参数,还有像调用getElementsByTagName,document.childNodes之类的,它们都返回NodeList对象都属于伪数组。可以使用Array.prototype.slice.call(fakeArray)将数组转化为真正的Array对象。
    写一个函数可以计算 sum(5,0,-5);输出0; sum(1,2,3,4);输出10;
    function sum() {
    var result = 0;
    var arr = arguments;
    for (var i = 0; i < arr.length; i++) {
    var num = arguments[i];
    if (typeof num==‘number’) {
    result += num;
    };
    };
    return result;
    }
    《正则》写出正确的正则表达式匹配固话号,区号3-4位,第一位为0,中横线,7-8位数字,中横线,3-4位分机号格式的固话号
    3\d{2,3}-\d{7,8}-\d{3,4}$
    《算法》 一下A,B可任选一题作答,两题全答加分
    A:农场买了一只羊,第一年是小羊,第二年底生一只,第三年不生,第四年底再生一只,第五年死掉。
    B:写出代码对下列数组去重并从大到小排列{5,2,3,6,8,6,5,4,7,1,9}
    function fn(arr){
    for (var i = 0; i < arr.length-1; i++) {
    for (var j = 0; j < arr.length-1-i; j++) {
    if(arr[j]<arr[j+1]){
    var temp = arr[j];
    arr[j]=arr[j+1];
    arr[j+1]=temp;
    }

        }
    
    }
    for (i = 0; i < arr.length; i++) {
        var c=arr[i];
        for (var s = i+1; s < arr.length; s++) {
            if(arr[s]==c){
                //debugger;
                arr.splice(s,1);
                s--;
            }
    
        }
    }
    
    return arr;
    

    }
    console.log(fn([5,2,3,6,8,6,5,4,7,1,9]).toString());

    请写一个正则表达式:要求最短6位数,最长20位,阿拉伯数和英文字母(不区分大小写)组成
    ^(?=.\d)(?=.[a-z])(?=.*[A-Z])[a-zA-Z\d]{6,20}$
    统计1到400亿之间的自然数中含有多少个1?比如1-21中,有1、10、11、21这四个自然数有5个1
    删除与某个字符相邻且相同的字符,比如fdaffdaaklfjklja字符串处理之后成为“fdafdaklfjklja”
    请写出三种以上的Firefox有但,InternetExplorer没有的属性或者函数
    请写出一个程序,在页面加载完成后动态创建一个form表单,并在里面添加一个input对象并给它任意赋值后义post方式提交到:http://127.0.0.1/save.php
    window.οnlοad=function(){
    var form=document.createElement(“form”);
    form.setAttribute(“method”, “post”);
    form.setAttribute(“action”, “http://127.0.0.1/save.php”);
    var input=document.createElement(“input”);
    form.appendChild(input);
    document.body.appendChild(form);
    input.value=“cxc”;
    form.submit();//提交表单
    }

    用JavaScript实现冒泡排序。数据为23、45、18、37、92、13、24
    //升序算法
    function sort(arr){
    for (var i = 0; i <arr.length; i++) {
    for (var j = 0; j <arr.length-i; j++) {
    if(arr[j]>arr[j+1]){
    var c=arr[j];//交换两个变量的位置
    arr[j]=arr[j+1];
    arr[j+1]=c;
    }
    };
    };
    return arr.toString();
    }
    console.log(sort([23,45,18,37,92,13,24]));

    前端代码优化的方法
    var User = {
    count = 1,
    getCount:function(){
    return this.count;
    }
    }
    console.log(User.getCount());
    var func = User.getCount;
    console.log(func());
    1 undefined(因为是window对象执行了func函数);
    下列JavaScript代码执行后,依次alert的结果是

    (function test(){
    var a=b=5;
    alert(typeof a);
    alert(typeof b);
    })();
    alert(typeof a);
    alert(typeof b);
    答案:number
    number
    undefined
    number
    下列JavaScript代码执行后,iNum的值是
    var iNum = 0;
    for(var i = 1; i< 10; i++){
    if(i % 5 == 0){
    continue;
    }
    iNum++;
    }
    答案:8
    输出结果是多少?
    1) var a;
    var b = a * 0;
    if (b == b) {
    console.log(b * 2 + “2” - 0 + 4);
    } else {
    console.log(!b * 2 + “2” - 0 + 4);
    }
    答案:26
    2)

    答案:6
    3) var t = 10;
    function test(t){
    var t = t++;
    }test(t);
    console.log(t);
    答案:10
    4) var t = 10;
    function test(test){
    var t = test++;
    }test(t);
    console.log(t);
    答案:10
    6) var t = 10;
    function test(test){
    t = test++;
    }test(t);
    console.log(t);
    答案:10
    7) var t = 10;
    function test(test){
    t = t + test;
    console.log(t);
    var t = 3;
    }test(t);
    console.log(t);
    答案:NaN 10
    8) var a;
    var b = a / 0;
    if (b == b) {
    console.log(b * 2 + “2” - 0 + 4);
    } else {
    console.log(!b * 2 + “2” - 0 + 4);
    }
    答案:26
    9)

    答案:Infinity24

    用程序实现找到html中id名相同的元素?

    id名重复的元素
    var nodes=document.querySelectorAll("#form1>*"); for(var i=0,len=nodes.length;i

    下列JavaScript代码执行后,运行的结果是
    点击我
    var btn = document.getElementById(‘btn’);
    var handler = {
    id: ‘_eventHandler’,
    exec: function(){
    alert(this.id);
    }
    }
    btn.addEventListener(‘click’, handler.exec);
    答案:”btn”
    下列JavaScript代码执行后,依次alert的结果是
    var obj = {proto: {a:1,b:2}};
    function F(){};
    F.prototype = obj.proto;
    var f = new F();
    obj.proto.c = 3;
    obj.proto = {a:-1, b:-2};
    alert(f.a);
    alert(f.c);
    delete F.prototype[‘a’];
    alert(f.a);
    alert(obj.proto.a);
    答案:
    1
    3
    undefined
    -1

    下列JavaScript代码执行后的效果是

    • item
    • item
    • item
    • item
    • item
    var items = document.querySelectorAll('#list>li'); for(var i = 0;i < items.length; i++){ setTimeout(function(){ items[i].style.backgroundColor = '#fee'; }, 5); } 答案:报错,因为i一直等于5,items[i]获取不到元素 下列JavaScript代码执行后的li元素的数量是
    • Item
    • Item
    • Item

    var items = document.getElementsByTagName(‘li’);
    for(var i = 0; i< items.length; i++){
    if(items[i].innerHTML == ‘’){
    items[i].parentNode.removeChild(items[i]);
    }
    }
    程序中捕获异常的方法?
    window.error
    try{}catch(){}finally{}
    将字符串”{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲</td><td>{name}”中的{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲替换成10,{name}替换成Tony (使用正则表达式)
    答案:’{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲</td><td>{id}_{$name}’
    .replace(/{$id}/g,‘10’)
    .replace(/{$name}/g,‘Tony’)

    给String对象添加一个方法,传入一个string类型的参数,然后将string的每个字符间价格空格返回,例如:addSpace(“hello world”) // -> ‘h e l l o ?w o r l d’
    String.prototype.spacify = function(){
    return this.split(’’).join(’ ');
    };
    数组和字符串

    输出结果:
    答案:lashou 拉手 lashou 1,2,3 1,2,3,4 1,2,3,4
    下列控制台都输出什么
    第1题:
    function setName(){
    name=“张三”;
    }
    setName();
    console.log(name);
    答案:“张三”
    第2题:
    //考点:1、变量声明提升 2、变量搜索机制
    var a=1;
    function test(){
    console.log(a);
    var a=1;
    }
    test();
    答案:undefined
    第3题:
    var b=2;
    function test2(){
    window.b=3;
    console.log(b);
    }
    test2();
    答案:3
    第4题:
    c=5;//声明一个全局变量c
    function test3(){
    window.c=3;
    console.log©; //答案:undefined,原因:由于此时的c是一个局部变量c,并且没有被赋值
    var c;
    console.log(window.c);//答案:3,原因:这里的c就是一个全局变量c
    }
    test3();
    第5题:
    var arr = [];
    arr[0] = ‘a’;
    arr[1] = ‘b’;
    arr[10] = ‘c’;
    alert(arr.length); //答案:11
    console.log(arr[5]); //答案:undefined
    第6题:
    var a=1;
    console.log(a++); //答案:1
    console.log(++a); //答案:3
    第7题:
    console.log(null==undefined); //答案:true
    console.log(“1”==1); //答案:true,因为会将数字1先转换为字符串1
    console.log(“1”===1); //答案:false,因为数据类型不一致
    第8题:
    typeof 1; “number”
    typeof “hello”; “string”
    typeof /[0-9]/; “object”
    typeof {}; “object”
    typeof null; “object”
    typeof undefined; “undefined”
    typeof [1,2,3]; “object”
    typeof function(){}; //“function”
    第9题:
    parseInt(3.14); //3
    parseFloat(“3asdf”); //3
    parseInt(“1.23abc456”);
    parseInt(true);//“true” NaN
    第10题:
    //考点:函数声明提前
    function bar() {
    return foo;
    foo = 10;
    function foo() {}
    //var foo = 11;
    }
    alert(typeof bar());//“function”
    第11题:考点:函数声明提前
    var foo = 1;
    function bar() {
    foo = 10;
    return;
    function foo() {}
    }
    bar();
    alert(foo);//答案:1
    第12题:
    console.log(a);//是一个函数
    var a = 3;
    function a(){}
    console.log(a);3
    第13题:
    //考点:对arguments的操作
    function foo(a) {
    arguments[0] = 2;
    alert(a);//答案:2,因为:a、arguments是对实参的访问,b、通过arguments[i]可以修改指定实参的值
    }
    foo(1);
    第14题:
    function foo(a) {
    alert(arguments.length);//答案:3,因为arguments是对实参的访问
    }
    foo(1, 2, 3);
    第15题
    bar();//报错
    var foo = function bar(name) {
    console.log(“hello”+name);
    console.log(bar);
    };
    //alert(typeof bar);
    foo(“world”);//“hello”
    console.log(bar);//undefined
    console.log(foo.toString());
    bar();//报错

    第16题:以下执行会有什么输出
    function test(){
    console.log(“test函数”);
    }
    setTimeout(function(){
    console.log(“定时器回调函数”);
    }, 0)
    test();
    结果:
    test函数
    定时器回调函数

    三、HTML5 CSS3
    CSS3有哪些新特性?

    1. CSS3实现圆角(border-radius),阴影(box-shadow),
    2. 对文字加特效(text-shadow、),线性渐变(gradient),旋转(transform)
      3.transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);// 旋转,缩放,定位,倾斜
    3. 增加了更多的CSS选择器 多背景 rgba
    4. 在CSS3中唯一引入的伪元素是 ::selection.
    5. 媒体查询,多栏布局
    6. border-image
      html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?
      新特性:
    7. 拖拽释放(Drag and drop) API
    8. 语义化更好的内容标签(header,nav,footer,aside,article,section)
    9. 音频、视频API(audio,video)
    10. 画布(Canvas) API
    11. 地理(Geolocation) API
    12. 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
    13. sessionStorage 的数据在浏览器关闭后自动删除
    14. 表单控件,calendar、date、time、email、url、search
    15. 新的技术webworker, websocket, Geolocation
      移除的元素:
    16. 纯表现的元素:basefont,big,center,font, s,strike,tt,u;
    17. 对可用性产生负面影响的元素:frame,frameset,noframes;
      支持HTML5新标签:
    18. IE8/IE7/IE6支持通过 document.createElement 方法产生的标签,可以利用这一特性让这些浏览器支持 HTML5 新标签,浏览器支持新标签后,还需要添加标签默认的样式(当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架):

    如何区分:
    DOCTYPE声明新增的结构元素、功能元素
    本地存储(Local Storage )和cookies(储存在用户本地终端上的数据)之间的区别是什么?
    Cookies:服务器和客户端都可以访问;大小只有4KB左右;有有效期,过期后将会删除;
    本地存储:只有本地浏览器端可访问数据,服务器不能访问本地存储直到故意通过POST或者GET的通道发送到服务器;每个域5MB;没有过期数据,它将保留知道用户从浏览器清除或者使用Javascript代码移除
    如何实现浏览器内多个标签页之间的通信?
    调用 localstorge、cookies 等本地存储方式
    你如何对网站的文件和资源进行优化?
    文件合并
    文件最小化/文件压缩
    使用CDN托管
    缓存的使用
    什么是响应式设计?
    它是关于网页制作的过程中让不同的设备有不同的尺寸和不同的功能。响应式设计是让所有的人能在这些设备上让网站运行正常
    新的 HTML5 文档类型和字符集是?
    答:HTML5文档类型:<!doctype html>
    HTML5使用的编码
    HTML5 Canvas 元素有什么用?
    答:Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作。
    HTML5 存储类型有什么区别?
    答:Media API、Text Track API、Application Cache API、User Interaction、Data Transfer API、Command API、Constraint Validation API、History API
    用H5+CSS3解决下导航栏最后一项掉下来的问题
    CSS3新增伪类有那些?
    p:first-of-type 选择属于其父元素的首个

    元素的每个

    元素。
    p:last-of-type 选择属于其父元素的最后

    元素的每个

    元素。
    p:only-of-type 选择属于其父元素唯一的

    元素的每个

    元素。
    p:only-child 选择属于其父元素的唯一子元素的每个

    元素。
    p:nth-child(2) 选择属于其父元素的第二个子元素的每个

    元素。
    :enabled、:disabled 控制表单控件的禁用状态。
    :checked,单选框或复选框被选中。
    请用CSS实现:一个矩形内容,有投影,有圆角,hover状态慢慢变透明。
    css属性的熟练程度和实践经验
    描述下CSS3里实现元素动画的方法
    动画相关属性的熟悉程度
    html5\CSS3有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?
    HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,地理定位等功能的增加。

    • 绘画 canvas 元素
      用于媒介回放的 video 和 audio 元素
      本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
      sessionStorage 的数据在浏览器关闭后自动删除
      语意化更好的内容元素,比如 article、footer、header、nav、section
      表单控件,calendar、date、time、email、url、search
      CSS3实现圆角,阴影,对文字加特效,增加了更多的CSS选择器 多背景 rgba
      新的技术webworker, websockt, Geolocation
      移除的元素
      纯表现的元素:basefont,big,center,font, s,strike,tt,u;
      对可用性产生负面影响的元素:frame,frameset,noframes;
    • 是IE8/IE7/IE6支持通过document.createElement方法产生的标签,
      可以利用这一特性让这些浏览器支持HTML5新标签,
      浏览器支持新标签后,还需要添加标签默认的样式:
    • 当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架

    你怎么来实现页面设计图,你认为前端应该如何高质量完成工作? 一个满屏 品 字布局 如何设计?

    • 首先划分成头部、body、脚部;。。。。。
    • 实现效果图是最基本的工作,精确到2px;
      与设计师,产品经理的沟通和项目的参与
      做好的页面结构,页面重构和用户体验
      处理hack,兼容、写出优美的代码格式
      针对服务器的优化、拥抱 HTML5。
      你能描述一下渐进增强和优雅降级之间的不同吗?
      渐进增强 progressive enhancement:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
      优雅降级 graceful degradation:一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
        区别:优雅降级是从复杂的现状开始,并试图减少用户体验的供给,而渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带。 
        “优雅降级”观点
        “优雅降级”观点认为应该针对那些最高级、最完善的浏览器来设计网站。而将那些被认为“过时”或有功能缺失的浏览器下的测试工作安排在开发周期的最后阶段,并把测试对象限定为主流浏览器(如 IE、Mozilla 等)的前一个版本。
        在这种设计范例下,旧版的浏览器被认为仅能提供“简陋却无妨 (poor, but passable)” 的浏览体验。你可以做一些小的调整来适应某个特定的浏览器。但由于它们并非我们所关注的焦点,因此除了修复较大的错误之外,其它的差异将被直接忽略。
        “渐进增强”观点
        “渐进增强”观点则认为应关注于内容本身。
        内容是我们建立网站的诱因。有的网站展示它,有的则收集它,有的寻求,有的操作,还有的网站甚至会包含以上的种种,但相同点是它们全都涉及到内容。这使得“渐进增强”成为一种更为合理的设计范例。这也是它立即被 Yahoo! 所采纳并用以构建其“分级式浏览器支持 (Graded Browser Support)”策略的原因所在。
       
        那么问题了。现在产品经理看到IE6,7,8网页效果相对高版本现代浏览器少了很多圆角,阴影(CSS3),要求兼容(使用图片背景,放弃CSS3),你会如何说服他?
      为什么利用多个域名来存储网站资源会更有效?
      CDN缓存更方便 
      突破浏览器并发限制 
      节约cookie带宽 
      节约主域名的连接数,优化页面响应速度 
      防止不必要的安全问题
      请谈一下你对网页标准和标准制定机构重要性的理解。
        (无标准答案)网页标准和标准制定机构都是为了能让web发展的更‘健康’,开发者遵循统一的标准,降低开发难度,开发成本,SEO也会更好做,也不会因为滥用代码导致各种BUG、安全问题,最终提高网站易用性。
       
      请描述一下cookies,sessionStorage和localStorage的区别?  
        sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。而localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
      web storage和cookie的区别
      Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。
      除此之外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie。但是Cookie也是不可以或缺的:Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生。
      知道css有个content属性吗?有什么作用?有什么应用?
      知道。css的content属性专门应用在 before/after 伪元素上,用来插入生成内容。最常见的应用是利用伪类清除浮动。
      //一种常见利用伪类清除浮动的代码
      .clearfix:after {
      content:"."; //这里利用到了content属性
      display:block;
      height:0;
      visibility:hidden;
      clear:both; }
      .clearfix {
      *zoom:1;
      }
      after伪元素通过 content 在元素的后面生成了内容为一个点的块级素,再利用clear:both清除浮动。
        那么问题继续还有,知道css计数器(序列数字字符自动递增)吗?如何通过css content属性实现css计数器?
      答案:css计数器是通过设置counter-reset 、counter-increment 两个属性 、及 counter()/counters()一个方法配合after / before 伪类实现。 
      如何在 HTML5 页面中嵌入音频?
      HTML 5 包含嵌入音频文件的标准方式,支持的格式包括 MP3、Wav 和 Ogg:
       
         
         Your browser does’nt support audio embedding feature. 

      如何在 HTML5 页面中嵌入视频?
      和音频一样,HTML5 定义了嵌入视频的标准方法,支持的格式包括:MP4、WebM 和 Ogg:
       
         
         Your browser does’nt support video embedding feature. 
       
      HTML5 引入什么新的表单属性?
      Datalist datetime output keygen date month week time number range emailurl
      CSS3新增伪类有那些?
      p:first-of-type 选择属于其父元素的首个

      元素的每个

      元素。
      p:last-of-type 选择属于其父元素的最后

      元素的每个

      元素。
      p:only-of-type 选择属于其父元素唯一的

      元素的每个

      元素。
      p:only-child 选择属于其父元素的唯一子元素的每个

      元素。
      p:nth-child(2) 选择属于其父元素的第二个子元素的每个

      元素。
      :enabled、:disabled 控制表单控件的禁用状态。
      :checked,单选框或复选框被选中。
      (写)描述一段语义的html代码吧。
      (HTML5中新增加的很多标签(如:

    文字包裹在元素中,用以反映内容。例如:
    段落包含在

    元素中。
    顺序表包含在

    1. 元素中。
      从其他来源引用的大型文字块包含在
      元素中。
      HTML 元素不能用作语义用途以外的其他目的。例如:

    包含标题,但并非用于放大文本。
    包含大段引述,但并非用于文本缩进。 空白段落元素 (

    ) 并非用于跳行。 文本并不直接包含任何样式信息。例如: 不使用 或
    等格式标记。 类或 ID 中不引用颜色或位置。 cookie在浏览器和服务器间来回传递。 sessionStorage和localStorage区别 sessionStorage和localStorage的存储空间更大; sessionStorage和localStorage有更多丰富易用的接口; sessionStorage和localStorage各自独立的存储空间; html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5? * HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。 * 绘画 canvas 用于媒介回放的 video 和 audio 元素 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失; sessionStorage 的数据在浏览器关闭后自动删除 语意化更好的内容元素,比如 article、footer、header、nav、section 表单控件,calendar、date、time、email、url、search 新的技术webworker, websockt, Geolocation * 移除的元素 纯表现的元素:basefont,big,center,font, s,strike,tt,u; 对可用性产生负面影响的元素:frame,frameset,noframes; 支持HTML5新标签: * IE8/IE7/IE6支持通过document.createElement方法产生的标签, 可以利用这一特性让这些浏览器支持HTML5新标签, 浏览器支持新标签后,还需要添加标签默认的样式: * 当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架 如何区分: DOCTYPE声明\新增的结构元素\功能元素 语义化的理解? 用正确的标签做正确的事情! html语义化就是让页面的内容结构化,便于对浏览器、搜索引擎解析; 在没有样式CCS情况下也以一种文档格式显示,并且是容易阅读的。 搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于 SEO。 使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。 HTML5的离线储存? localStorage 长期存储数据,浏览器关闭后数据不丢失; sessionStorage 数据在浏览器关闭后自动删除。 写出HTML5的文档声明方式   HTML5和CSS3的新标签     
    HTML5: nav, footer, header, section, hgroup, video, time, canvas, audio...
    

    CSS3: RGBA, opacity, text-shadow, box-shadow, border-radius, border-image, 
    border-color, transform…;
    自己对标签语义化的理解
        在我看来,语义化就是比如说一个段落, 那么我们就应该用

    标签来修饰,标题就应该用 <h?>标签等。符合文档语义的标签。
    四、移动web开发
    1、移动端常用类库及优缺点
    知识面宽度,多多益善
    2、Zepto库和JQ区别
    Zepto相对jQuery更加轻量,主要用在移动端,jQuery也有对应的jQuerymobile移动端框架
    五、Ajax
    1、Ajax 是什么? 如何创建一个Ajax?
    Ajax并不算是一种新的技术,全称是asychronous javascript and xml,可以说是已有技术的组合,主要用来实现客户端与服务器端的异步通信效果,实现页面的局部刷新,早期的浏览器并不能原生支持ajax,可以使用隐藏帧(iframe)方式变相实现异步效果,后来的浏览器提供了对ajax的原生支持
    使用ajax原生方式发送请求主要通过XMLHttpRequest(标准浏览器)、ActiveXObject(IE浏览器)对象实现异步通信效果
    基本步骤:
    var xhr =null;//创建对象
    if(window.XMLHttpRequest){
    xhr = new XMLHttpRequest();
    }else{
    xhr = new ActiveXObject(“Microsoft.XMLHTTP”);
    }
    xhr.open(“方式”,”地址”,”标志位”);//初始化请求
    xhr.setRequestHeader(“”,””);//设置http头信息
    xhr.onreadystatechange =function(){}//指定回调函数
    xhr.send();//发送请求
    js框架(jQuery/EXTJS等)提供的ajax API对原生的ajax进行了封装,熟悉了基础理论,再学习别的框架就会得心应手,好多都是换汤不换药的内容
    2、同步和异步的区别?
    同步:阻塞的
    -张三叫李四去吃饭,李四一直忙得不停,张三一直等着,直到李四忙完两个人一块去吃饭
    =浏览器向服务器请求数据,服务器比较忙,浏览器一直等着(页面白屏),直到服务器返回数据,浏览器才能显示页面
    异步:非阻塞的
    -张三叫李四去吃饭,李四在忙,张三说了一声然后自己就去吃饭了,李四忙完后自己去吃
    =浏览器向服务器请求数据,服务器比较忙,浏览器可以自如的干原来的事情(显示页面),服务器返回数据的时候通知浏览器一声,浏览器把返回的数据再渲染到页面,局部更新
    3、如何解决跨域问题?
    理解跨域的概念:协议、域名、端口都相同才同域,否则都是跨域
    出于安全考虑,服务器不允许ajax跨域获取数据,但是可以跨域获取文件内容,所以基于这一点,可以动态创建script标签,使用标签的src属性访问js文件的形式获取js脚本,并且这个js脚本中的内容是函数调用,该函数调用的参数是服务器返回的数据,为了获取这里的参数数据,需要事先在页面中定义回调函数,在回调函数中处理服务器返回的数据,这就是解决跨域问题的主流解决方案
    4、页面编码和被请求的资源编码如果不一致如何处理?
    对于ajax请求传递的参数,如果是get请求方式,参数如果传递中文,在有些浏览器会乱码,不同的浏览器对参数编码的处理方式不同,所以对于get请求的参数需要使用 encodeURIComponent函数对参数进行编码处理,后台开发语言都有相应的解码api。对于post请求不需要进行编码
    5、简述ajax 的过程。

    1. 创建XMLHttpRequest对象,也就是创建一个异步调用对象

    2. 创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息

    3. 设置响应HTTP请求状态变化的函数

    4. 发送HTTP请求

    5. 获取异步调用返回的数据

    6. 使用JavaScript和DOM实现局部刷新
      6、阐述一下异步加载。

    7. 异步加载的方案: 动态插入 script 标签

    8. 通过 ajax 去获取 js 代码,然后通过 eval 执行

    9. script 标签上添加 defer 或者 async 属性

    10. 创建并插入 iframe,让它异步执行 js
      7、请解释一下 JavaScript 的同源策略。
      同源策略是客户端脚本(尤其是Javascript)的重要的安全度量标准。它最早出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。所谓同源指的是:协议,域名,端口相同,同源策略是一种安全协议,指一段脚本只能读取来自同一来源的窗口和文档的属性。
      8、GET和POST的区别,何时使用POST?
      GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符,有的浏览器是8000个字符
      POST:一般用于修改服务器上的资源,对所发送的信息没有限制
      在以下情况中,请使用 POST 请求:

    11. 无法使用缓存文件(更新服务器上的文件或数据库)

    12. 向服务器发送大量数据(POST 没有数据量限制)

    13. 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
      9、ajax 是什么?ajax 的交互模型?同步和异步的区别?如何解决跨域问题?

    14. 通过异步模式,提升了用户体验

    15. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用

    16. Ajax在客户端运行,承担了一部分本来由服务器承担的工作,减少了大用户量下的服务器负载。
      10、 Ajax的最大的特点是什么。
      Ajax可以实现异步通信效果,实现页面局部刷新,带来更好的用户体验;按需获取数据,节约带宽资源;
      11、ajax的缺点
      1、ajax不支持浏览器back按钮。
      2、安全问题 AJAX暴露了与服务器交互的细节。
      3、对搜索引擎的支持比较弱。
      4、破坏了程序的异常机制。
      12、ajax请求的时候get 和post方式的区别
      get一般用来进行查询操作,url地址有长度限制,请求的参数都暴露在url地址当中,如果传递中文参数,需要自己进行编码操作,安全性较低。
      post请求方式主要用来提交数据,没有数据长度的限制,提交的数据内容存在于http请求体中,数据不会暴漏在url地址中。
      13、解释jsonp的原理,以及为什么不是真正的ajax
        Jsonp并不是一种数据格式,而json是一种数据格式,jsonp是用来解决跨域获取数据的一种解决方案,具体是通过动态创建script标签,然后通过标签的src属性获取js文件中的js脚本,该脚本的内容是一个函数调用,参数就是服务器返回的数据,为了处理这些返回的数据,需要事先在页面定义好回调函数,本质上使用的并不是ajax技术
      14、什么是Ajax和JSON,它们的优缺点。
      Ajax是全称是asynchronous JavaScript andXML,即异步JavaScript和xml,用于在Web页面中实现异步数据交互,实现页面局部刷新。
      优点:可以使得页面不重载全部内容的情况下加载局部内容,降低数据传输量,避免用户不断刷新或者跳转页面,提高用户体验
      缺点:对搜索引擎不友好;要实现ajax下的前后退功能成本较大;可能造成请求数的增加跨域问题限制;
      JSON是一种轻量级的数据交换格式,ECMA的一个子集
      优点:轻量级、易于人的阅读和编写,便于机器(JavaScript)解析,支持复合数据类型(数组、对象、字符串、数字)
      15、http常见的状态码有那些?分别代表是什么意思?
      200 - 请求成功
      301 - 资源(网页等)被永久转移到其它URL
      404 - 请求的资源(网页等)不存在
      500 - 内部服务器错误
      16、一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
      分为4个步骤:

    17. 当发送一个 URL 请求时,不管这个 URL 是 Web 页面的 URL 还是 Web 页面上每个资源的 URL,浏览器都会开启一个线程来处理这个请求,同时在远程 DNS 服务器上启动一个 DNS 查询。这能使浏览器获得请求对应的 IP 地址。

    18. 浏览器与远程 Web 服务器通过 TCP 三次握手协商来建立一个 TCP/IP 连接。该握手包括一个同步报文,一个同步-应答报文和一个应答报文,这三个报文在 浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,而后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。

    19. 一旦 TCP/IP 连接建立,浏览器会通过该连接向远程服务器发送 HTTP 的 GET 请求。远程服务器找到资源并使用 HTTP 响应返回该资源,值为 200 的 HTTP 响应状态表示一个正确的响应。

    20. 此时,Web 服务器提供资源服务,客户端开始下载资源。
      17、ajax请求的时候get 和post方式的区别
      get一般用来进行查询操作,url地址有长度限制,请求的参数都暴露在url地址当中,如果传递中文参数,需要自己进行编码操作,安全性较低。
      post请求方式主要用来提交数据,没有数据长度的限制,提交的数据内容存在于http请求体中,数据不会暴漏在url地址中。
      18、ajax请求时,如何解释json数据
      使用eval() 或者JSON.parse() 鉴于安全性考虑,推荐使用JSON.parse()更靠谱,对数据的安全性更好。
      19、.javascript的本地对象,内置对象和宿主对象
      本地对象为独立于宿主环境的ECMAScript提供的对象,包括Array Object RegExp等可以new实例化的对象
      内置对象为Gload,Math 等不可以实例化的(他们也是本地对象,内置对象是本地对象的一个子集)
      宿主对象为所有的非本地对象,所有的BOM和DOM对象都是宿主对象,如浏览器自带的document,window 等对象
      20、为什么利用多个域名来存储网站资源会更有效?
      确保用户在不同地区能用最快的速度打开网站,其中某个域名崩溃用户也能通过其他郁闷访问网站,并且不同的资源放到不同的服务器上有利于减轻单台服务器的压力。
      21、请说出三种减低页面加载时间的方法
      1、压缩css、js文件
      2、合并js、css文件,减少http请求
      3、外部js、css文件放在最底下
      4、减少dom操作,尽可能用变量替代不必要的dom操作
      22、HTTP状态码都有那些。
      200 OK //客户端请求成功
      400 Bad Request //客户端请求有语法错误,不能被服务器所理解
      403 Forbidden //服务器收到请求,但是拒绝提供服务
      404 Not Found //请求资源不存在,输入了错误的URL
      500 Internal Server Error //服务器发生不可预期的错误
      503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
      六、JS高级
      1、JQuery一个对象可以同时绑定多个事件,这是如何实现的?
      jQuery可以给一个对象同时绑定多个事件,低层实现方式是使用addEventListner或attachEvent兼容不同的浏览器实现事件的绑定,这样可以给同一个对象注册多个事件。
      2、知道什么是webkit么? 知道怎么用浏览器的各种工具来调试和debug代码么?
      Webkit是浏览器引擎,包括html渲染和js解析功能,手机浏览器的主流内核,与之相对应的引擎有Gecko(Mozilla Firefox 等使用)和Trident(也称MSHTML,IE 使用)。
      对于浏览器的调试工具要熟练使用,主要是页面结构分析,后台请求信息查看,js调试工具使用,熟练使用这些工具可以快速提高解决问题的效率
      3、如何测试前端代码? 知道BDD, TDD, Unit Test么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit…)?
      了解BDD行为驱动开发与TDD测试驱动开发已经单元测试相关概念,
      4、前端templating(Mustache, underscore, handlebars)是干嘛的, 怎么用?
      Web 模板引擎是为了使用户界面与业务数据(内容)分离而产生的,
      Mustache 是一个 logic-less (轻逻辑)模板解析引擎,它的优势在于可以应用在 Javascript、PHP、Python、Perl 等多种编程语言中。
      Underscore封装了常用的JavaScript对象操作方法,用于提高开发效率。
      Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板。
      5、简述一下 Handlebars 的基本用法?
      没有用过的话说出它是干什么的即可
      6、简述一下 Handlerbars 的对模板的基本处理流程, 如何编译的?如何缓存的?
      学习技术不仅要会用,还有熟悉它的实现机制,这样在开发中遇到问题时才能更好的解决
      7、用js实现千位分隔符?
      原生js的熟练度,实践经验,实现思路
      8、检测浏览器版本版本有哪些方式?
      IE与标准浏览器判断,IE不同版本的判断,userAgent var ie = /@cc_on !@/false;
      9、我们给一个dom同时绑定两个点击事件,一个用捕获,一个用冒泡,你来说下会执行几次事件,然后会先执行冒泡还是捕获
      对两种事件模型的理解
      10、实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制
      考察点1:对于基本数据类型和引用数据类型在内存中存放的是值还是指针这一区别是否清楚
      考察点2:是否知道如何判断一个变量是什么类型的
      考察点3:递归算法的设计
      // 方法一:
      Object.prototype.clone = function(){
         var o = this.constructor === Array ? [] : {};
         for(var e in this){
           o[e] = typeof this[e] === “object” ? this[e].clone() : this[e];
         }
         return o;
      }
      //方法二:
         /**
           * 克隆一个对象
           * @param Obj
           * @returns
           */
          function clone(Obj) {  
              var buf;  
              if (Obj instanceof Array) {  
                  buf = [];//创建一个空的数组
                  var i = Obj.length;  
                  while (i–) {  
                      buf[i] = clone(Obj[i]);  
                  }  
                  return buf;   
              }else if (Obj instanceof Object){  
                  buf = {};//创建一个空对象
                  for (var k in Obj) { //为这个对象添加新的属性
                      buf[k] = clone(Obj[k]);  
                  }  
                  return buf;  
              }else{ //普通变量直接赋值
                  return Obj;  
              }  
          }
      11、如何消除一个数组里面重复的元素?

      var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];
              function deRepeat(){
                  var newArr=[];
                  var obj={};
                  var index=0;
                  var l=arr.length;
                  for(var i=0;i<l;i++){
                      if(obj[arr[i]]==undefined)
                        {
                          obj[arr[i]]=1;
                          newArr[index++]=arr[i];
                        }
                      else if(obj[arr[i]]==1)
                        continue;
                  }
                  return newArr;
              }
              var newArr2=deRepeat(arr);
              alert(newArr2); //输出1,2,3,4,5,6,9,25
      12、小贤是一条可爱的小狗(Dog),它的叫声很好听(wow),每次看到主人的时候就会乖乖叫一声(yelp)。从这段描述可以得到以下对象:

      function Dog() {
            this.wow = function() {
                     alert(’Wow’);
            }
            this.yelp = function() {
                    this.wow();
            }
      }
      小芒和小贤一样,原来也是一条可爱的小狗,可是突然有一天疯了(MadDog),一看到人就会每隔半秒叫一声(wow)地不停叫唤(yelp)。请根据描述,按示例的形式用代码来实。(继承,原型,setInterval)

      function MadDog() {
          this.yelp = function() {
                var self = this;         
                setInterval(function() {
                      self.wow();     
                }, 500);
            }
      }
      MadDog.prototype = new Dog();        
      //for test
      var dog = new Dog();
      dog.yelp();
      var madDog = new MadDog();
      madDog.yelp();
      13、下面这个ul,如何点击每一列的时候alert其index?(闭包)

      • 这是第一条
      • 这是第二条
      • 这是第三条
      • // 方法一: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++) {     lis[i].index=i;     lis[i].οnclick=function(){         alert(this.index);     }; } //方法二: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++){     lis[i].index=i;     lis[i].οnclick=(function(a){         return function() {             alert(a);         }     })(i); } 14、编写一个JavaScript函数,输入指定类型的选择器(仅需支持id,class,tagName三种简单CSS选择器,无需兼容组合选择器)可以返回匹配的DOM节点,需考虑浏览器兼容性和性能。 /*** @param selector {String} 传入的CSS选择器。* @return {Array}*/ var query = function(selector) { var reg = /^(#)?(\.)?(\w+)$/img; var regResult = reg.exec(selector); var result = []; //如果是id选择器 if(regResult[1]) { if(regResult[3]) { if(typeof document.querySelector === "function") { result.push(document.querySelector(regResult[3]));     }else {       result.push(document.getElementById(regResult[3]));     }    }    }    //如果是class选择器    else if(regResult[2]) {     if(regResult[3]) {        if(typeof document.getElementsByClassName === 'function') {          var doms = document.getElementsByClassName(regResult[3]);          if(doms) {            result = converToArray(doms);          }        }      //如果不支持getElementsByClassName函数      else {        var allDoms = document.getElementsByTagName("*") ;        for(var i = 0, len = allDoms.length; i < len; i++) {          if(allDoms[i].className.search(new RegExp(regResult[2])) > -1) {            result.push(allDoms[i]);          }        }      }   } }   //如果是标签选择器   else if(regResult[3]) {     var doms = document.getElementsByTagName(regResult[3].toLowerCase());     if(doms) {       result = converToArray(doms);     }   }   return result;   }   function converToArray(nodes){     var array = null;             try{              array = Array.prototype.slice.call(nodes,0);//针对非IE浏览器             }catch(ex){      array = new Array();             for( var i = 0 ,len = nodes.length; i < len ; i++ ) {       array.push(nodes[i])             }   }        return array; } 15、请评价以下代码并给出改进意见。 if(window.addEventListener){     var addListener = function(el,type,listener,useCapture){         el.addEventListener(type,listener,useCapture);   }; } else if(document.all){     addListener = function(el,type,listener){         el.attachEvent("on"+type,function(){           listener.apply(el);       });    }  }  不应该在if和else语句中声明addListener函数,应该先声明;  不需要使用window.addEventListener或document.all来进行检测浏览器,应该使用能力检测;  由于attachEvent在IE中有this指向问题,所以调用它时需要处理一下 改进如下: function addEvent(elem, type, handler){   if(elem.addEventListener){     elem.addEventListener(type, handler, false);   }else if(elem.attachEvent){     elem['temp' + type + handler] = handler;     elem[type + handler] = function(){     elem['temp' + type + handler].apply(elem);   };   elem.attachEvent('on' + type, elem[type + handler]);    }else{   elem['on' + type] = handler;   } } 16、给String对象添加一个方法,传入一个string类型的参数,然后将string的每个字符间价格空格返回,例如: addSpace(“hello world”) // -> ‘h e l l o  w o r l d’
        String.prototype.spacify = function(){
        

        return this.split(’’).join(’ ‘);
            };
        接着上述问题答案提问,1)直接在对象的原型上添加方法是否安全?尤其是在Object对象上。(这个我没能答出?希望知道的说一下。) 2)函数声明与函数表达式的区别?
        答案:在js中,解析器在向执行环境中加载数据时,对函数声明和函数表达式并非是一视同仁的,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问),至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解析执行。
        17、定义一个log方法,让它可以代理console.log的方法。
        可行的方法一:
        function log(msg) {
            console.log(msg);
        }
        log(“hello world!”) // hello world!
        如果要传入多个参数呢?显然上面的方法不能满足要求,所以更好的方法是:
        function log(){
            console.log.apply(console, arguments);
        };
        到此,追问apply和call方法的异同。
        对于apply和call两者在作用上是相同的,即是调用一个对象的一个方法,以另一个对象替换当前对象。将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
        但两者在参数上有区别的。对于第一个参数意义都一样,但对第二个参数: apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。 如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3]) 。
        18、在Javascript中什么是伪数组?如何将伪数组转化为标准数组?
        伪数组(类数组):无法直接调用数组方法或期望length属性有什么特殊的行为,但仍可以对真正数组遍历方法来遍历它们。典型的是函数的argument参数,还有像调用getElementsByTagName,document.childNodes之类的,它们都返回NodeList对象都属于伪数组。可以使用Array.prototype.slice.call(fakeArray)将数组转化为真正的Array对象。
        假设接第八题题干,我们要给每个log方法添加一个”(app)”前缀,比如’hello world!’ ->’(app)hello world!’。方法如下:
        function log(){
              var args = Array.prototype.slice.call(arguments);  //为了使用unshift数组方法,将argument转化为真正的数组
              args.unshift(’(app)’);
              console.log.apply(console, args);
            };
        19、对作用域上下文和this的理解,看下列代码:
        var User = {
          count: 1,
          getCount: function() {
            return this.count;
          }
        };
        console.log(User.getCount());  // what?
        var func = User.getCount;
        console.log(func());  // what?
        问两处console输出什么?为什么?
        答案是1和undefined。
        func是在winodw的上下文中被执行的,所以会访问不到count属性。
        继续追问,那么如何确保Uesr总是能访问到func的上下文,即正确返回1。正确的方法是使用Function.prototype.bind。兼容各个浏览器完整代码如下:
        Function.prototype.bind = Function.prototype.bind || function(context){
           var self = this;
           return function(){
              return self.apply(context, arguments);
           };
        }
        var func = User.getCount.bind(User);
        console.log(func());
        20、原生JS的window.onload与Jquery的$(document).ready(function(){})有什么不同?如何用原生JS实现Jq的ready方法?
        window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行。
        $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕。
        /*
         * 传递函数给whenReady()
         * 当文档解析完毕且为操作准备就绪时,函数作为document的方法调用
         */
        var whenReady = (function() {               //这个函数返回whenReady()函数
            var funcs = [];             //当获得事件时,要运行的函数
            var ready = false;          //当触发事件处理程序时,切换为true
            //当文档就绪时,调用事件处理程序
            function handler(e) {
                if(ready) return;       //确保事件处理程序只完整运行一次
                //如果发生onreadystatechange事件,但其状态不是complete的话,那么文档尚未准备好
                if(e.type === ‘onreadystatechange’ && document.readyState !== ‘complete’) {
                    return;
                }
                //运行所有注册函数
                //注意每次都要计算funcs.length
                //以防这些函数的调用可能会导致注册更多的函数
                for(var i=0; i<funcs.length; i++) {
                    funcs[i].call(document);
                }
                //事件处理函数完整执行,切换ready状态, 并移除所有函数
                ready = true;
                funcs = null;
            }
            //为接收到的任何事件注册处理程序
            if(document.addEventListener) {
                document.addEventListener(‘DOMContentLoaded’, handler, false);
                document.addEventListener(‘readystatechange’, handler, false);            //IE9+
                window.addEventListener(‘load’, handler, false);
            }else if(document.attachEvent) {
                document.attachEvent(‘onreadystatechange’, handler);
                window.attachEvent(‘onload’, handler);
            }
            //返回whenReady()函数
            return function whenReady(fn) {
                if(ready) { fn.call(document); }
                else { funcs.push(fn); }
            }
        })();
        如果上述代码十分难懂,下面这个简化版:
        function ready(fn){
            if(document.addEventListener) {//标准浏览器
                document.addEventListener(‘DOMContentLoaded’, function() {
                    //注销事件, 避免反复触发
                    document.removeEventListener(‘DOMContentLoaded’,arguments.callee, false);
                    fn();//执行函数
                }, false);
            }else if(document.attachEvent) {//IE
                document.attachEvent(‘onreadystatechange’, function() {
                    if(document.readyState == ‘complete’) {
                        document.detachEvent(‘onreadystatechange’, arguments.callee);
                        fn();//函数执行
                    }
                });
            }
        };
        21、(设计题)想实现一个对页面某个节点的拖曳?如何做?(使用原生JS)
        回答出概念即可,下面是几个要点
        1.给需要拖拽的节点绑定mousedown, mousemove, mouseup事件
        2.mousedown事件触发后,开始拖拽
        3.mousemove时,需要通过event.clientX和clientY获取拖拽位置,并实时更新位置
        4.mouseup时,拖拽结束
        5.需要注意浏览器边界的情况
        22、请实现如下功能

        function setcookie(name,value,days){  //给cookie增加一个时间变量
          var exp = new Date();
          exp.setTime(exp.getTime() + days2460601000); //设置过期时间为days天
          document.cookie = name + “=”+ escape (value) + “;expires=” + exp.toGMTString();
        }
        function getCookie(name){
          var result = “”;
          var myCookie = “”+document.cookie+";";
          var searchName = “+name+”=";
          var startOfCookie = myCookie.indexOf(searchName);
          var endOfCookie;
          if(satrtOfCookie != -1){
            startOfcookie += searchName.length;
            endOfCookie = myCookie.indexOf(";",startOfCookie);
            result = (myCookie.substring(startOfCookie,endOfCookie));
          }
          return result;
        }
        (function(){
          var oTips = document.getElementById(‘tips’);//假设tips的id为tips
          var page = {
          check: function(){//检查tips的cookie是否存在并且允许显示
            var tips = getCookie(‘tips’);
            if(!tips || tips == ‘show’) return true;//tips的cookie不存在
            if(tips == “never_show_again”) return false;
          },
          hideTip: function(bNever){
            if(bNever) setcookie(‘tips’, ‘never_show_again’, 365);
            oTips.style.display = “none”;//隐藏
          },
          showTip: function(){
          oTips.style.display = “inline”;//显示,假设tips为行级元素
          },
          init: function(){
            var _this = this;
            if(this.check()){
            _this.showTip();
            setcookie(‘tips’, ‘show’, 1);
          }
          oTips.onclick = function(){
            _this.hideTip(true);
          };
          }
          };
          page.init();
        })();
        23、说出以下函数的作用是?空白区域应该填写什么?
        //define
        (function(window){
            function fn(str){
                this.str=str;
            }
         
            fn.prototype.format = function(){
                var arg = _;
                return this.str.replace(
        ,function(a,b){
                     return arg[b]||"";
              });
            }
            window.fn = fn;
        })(window);
         
        //use
        (function(){
            var t = new fn(’

        {1}{2}

        ’);
            console.log(t.format(‘ http://www.alibaba.com’,‘Alibaba’,‘Welcome’));
        })();
        答案:访函数的作用是使用format函数将函数的参数替换掉{0}这样的内容,返回一个格式化后的结果:
        第一个空是:arguments
        第二个空是:/{(\d+)}/ig
        24、Javascript作用链域?
        理解变量和函数的访问范围和生命周期,全局作用域与局部作用域的区别,JavaScript中没有块作用域,函数的嵌套形成不同层次的作用域,嵌套的层次形成链式形式,通过作用域链查找属性的规则需要深入理解。
        25、谈谈This对象的理解。
        理解不同形式的函数调用方式下的this指向,理解事件函数、定时函数中的this指向,函数的调用形式决定了this的指向。
        26、eval是做什么的?
        它的功能是把对应的字符串解析成JS代码并运行;应该避免使用eval,不安全,非常耗性能(2个步骤,一次解析成js语句,一次执行)

        27、关于事件,IE与火狐的事件机制有什么区别? 如何阻止冒泡?
        [1].在IE中,事件对象是作为一个全局变量来保存和维护的.所有的浏览器事件,不管是用户触发的,还是其他事件,都会更新window.event对象.所以在代码中,只要调用window.event就可以获取事件对象, 再event.srcElement就可以取得触发事件的元素进行进一步处理.
        [2].在FireFox中,事件对象却不是全局对象,一般情况下,是现场发生,现场使用,FireFox把事件对象自动传给事件处理程序.
        关于事件的兼容性处理要熟练掌握,事件对象具体哪些属性存在兼容性问题,IE与标准事件模型事件冒泡与事件捕获的支持要理解
        28、什么是闭包(closure),为什么要用它?
        简单的理解是函数的嵌套形成闭包,闭包包括函数本身已经它的外部作用域
        使用闭包可以形成独立的空间,延长变量的生命周期,报存中间状态值
        29、javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?
        意思是使用严格模式,使用严格模式,一些不规范的语法将不再支持
        30、如何判断一个对象是否属于某个类?
        Instanceof constructor
        31、new操作符具体干了什么呢?
        1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
        2、属性和方法被加入到 this 引用的对象中。
        3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。
        32、用原生JavaScript的实现过什么功能吗?
        主要考察原生js的实践经验
        33、Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?
        HasOwnProperty
        34、对JSON的了解?
        轻量级数据交互格式,可以形成复杂的嵌套格式,解析非常方便
        35、js延迟加载的方式有哪些?
        方案一:

        Object.hasOwnProperty( ) 检查属性是否被继承
        Object.isPrototypeOf( ) 一个对象是否是另一个对象的原型
        Object.propertyIsEnumerable( ) 是否可以通过for/in循环看到属性
        Object.toLocaleString( ) 返回对象的本地字符串表示
        Object.toString( ) 定义一个对象的字符串表示
        Object.valueOf( ) 指定对象的原始值
        47、JS 怎么实现一个类。怎么实例化这个类
        严格来讲js中并没有类的概念,不过js中的函数可以作为构造函数来使用,通过new来实例化,其实函数本身也是一个对象。
        48、JavaScript中的作用域与变量声明提升?
        理解JavaScript的预解析机制,js的运行主要分两个阶段:js的预解析和运行,预解析阶段所有的变量声明和函数定义都会提前,但是变量的赋值不会提前
        49、如何编写高性能的Javascript?
        使用 DocumentFragment 优化多次 append
        通过模板元素 clone ,替代 createElement
        使用一次 innerHTML 赋值代替构建 dom 元素
        使用 firstChild 和 nextSibling 代替 childNodes 遍历 dom 元素
        使用 Array 做为 StringBuffer ,代替字符串拼接的操作
        将循环控制量保存到局部变量
        顺序无关的遍历时,用 while 替代 for
        将条件分支,按可能性顺序从高到低排列
        在同一条件子的多( >2 )条件分支时,使用 switch 优于 if
        使用三目运算符替代条件分支
        需要不断执行的时候,优先考虑使用 setInterval
        50、那些操作会造成内存泄漏?
        闭包,循环
        51、javascript对象的几种创建方式?

        1. 工厂模式
        2. 构造函数模式
        3. 原型模式
        4. 混合构造函数和原型模式
        5. 动态原型模式
        6. 寄生构造函数模式
        7. 稳妥构造函数模式
          52、javascript继承的 6 种方法?
        8. 原型链继承
        9. 借用构造函数继承
        10. 组合继承(原型+借用构造)
        11. 原型式继承
        12. 寄生式继承
        13. 寄生组合式继承
          53、eval是做什么的?
        14. 它的功能是把对应的字符串解析成JS代码并运行
        15. 应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)
          54、JavaScript 原型,原型链 ? 有什么特点?
        16. 原型对象也是普通的对象,是对象一个自带隐式的 proto 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为 null 的话,我们就称之为原型链
        17. 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链
          55、事件、IE与火狐的事件机制有什么区别? 如何阻止冒泡?
        18. 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为
        19. 事件处理机制:IE是事件冒泡、firefox同时支持两种事件模型,也就是:捕获型事件和冒泡型事件
        20. ev.stopPropagation();
          注意旧ie的方法:ev.cancelBubble = true;
          56、简述一下Sass、Less,且说明区别?
          他们是动态的样式语言,是CSS预处理器,CSS上的一种抽象层。他们是一种特殊的语法/语言而编译成CSS。
          变量符不一样,less是@,而Sass是KaTeX parse error: Can't use function '\.' in math mode at position 1437: …[a-zA-Z0-9_-]+(\̲.̲[a-zA-Z0-9_-]+)…/;
          67、简述一下你对web性能优化的方案?
          1、尽量减少 HTTP 请求
          2、使用浏览器缓存
          3、使用压缩组件
          4、图片、JS的预载入
          5、将脚本放在底部
          6、将样式文件放在页面顶部
          7、使用外部的JS和CSS
          8、精简代码
          68、在JS中有哪些会被隐式转换为false
          Undefined、null、关键字false、NaN、零、空字符串
          69、定时器setInterval有一个有名函数fn1,setInterval(fn1,500)与setInterval(fn1(),500)有什么区别?
          第一个是重复执行每500毫秒执行一次,后面一个只执行一次。
          70、外部JS文件出现中文字符,会出现什么问题,怎么解决?
          会出现乱码,加charset=”GB2312”;
          71、谈谈浏览器的内核,并且说一下什么是内核?
          Trident (['traɪd(ə)nt])–IE,Gecko (['gekəʊ])–Firefox, Presto (['prestəʊ])–opera,webkit—谷歌和Safari
          浏览器内核又可以分成两部分:渲染引擎和 JS 引擎。它负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入 CSS 等),以及计算网页的显示方式,然后会输出至显示器或打印机。JS 引擎则是解析 Javascript 语言,执行 javascript 语言来实现网页的动态效果。
          72、JavaScript原型,原型链 ? 有什么特点?
        • 原型对象也是普通的对象,是对象一个自带隐式的 proto 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为null的话,我们就称之为原型链。
        • 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链。
        • JavaScript的数据对象有那些属性值?
            writable:这个属性的值是否可以改。
            configurable:这个属性的配置是否可以删除,修改。
            enumerable:这个属性是否能在for…in循环中遍历出来或在Object.keys中列举出来。
            value:属性值。
        • 当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的话,就会查找他的Prototype对象是否有这个属性。
          function clone(proto) {
            function Dummy() { }
            Dummy.prototype = proto;
            Dummy.prototype.constructor = Dummy;
            return new Dummy(); //等价于Object.create(Person);
          }
          function object(old) {
          function F() {};
          F.prototype = old;
          return new F();
          }
          var newObj = object(oldObject);
          73、写一个通用的事件侦听器函数
          `// event(事件)工具集,来源:https://github.com/markyun
          markyun.Event = {
          // 页面加载完成后
          readyEvent : function(fn) {
          if (fn==null) {
          fn=document;
          }
          var oldonload = window.onload;
          if (typeof window.onload != ‘function’) {
          window.onload = fn;
          } else {
          window.onload = function() {
          oldonload();
          fn();
          };
          }
          },
          // 视能力分别使用dom0||dom2||IE方式 来绑定事件
          // 参数: 操作的元素,事件名称 ,事件处理程序
          addEvent : function(element, type, handler) {
          if (element.addEventListener) {
          //事件类型、需要执行的函数、是否捕捉
          element.addEventListener(type, handler, false);
          } else if (element.attachEvent) {
          element.attachEvent(‘on’ + type, function() {
          handler.call(element);
          });
          } else {
          element[‘on’ + type] = handler;
          }
          },
          // 移除事件
          removeEvent : function(element, type, handler) {
          if (element.removeEnentListener) {
          element.removeEnentListener(type, handler, false);
          } else if (element.datachEvent) {
          element.detachEvent(‘on’ + type, handler);
          } else {
          element[‘on’ + type] = null;
          }
          },
          // 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获)
          stopPropagation : function(ev) {
          if (ev.stopPropagation) {
          ev.stopPropagation();
          } else {
          ev.cancelBubble = true;
          }
          },
          // 取消事件的默认行为
          preventDefault : function(event) {
          if (event.preventDefault) {
          event.preventDefault();
          } else {
          event.returnValue = false;
          }
          },
          // 获取事件目标
          getTarget : function(event) {
          return event.target || event.srcElement;
          },
          // 获取event对象的引用,取到事件的所有信息,确保随时能使用event;
          getEvent : function(e) {
          var ev = e || window.event;
          if (!ev) {
          var c = this.getEvent.caller;
          while © {
          ev = c.arguments[0];
          if (ev && Event == ev.constructor) {
          break;
          }
          c = c.caller;
          }
          }
          return ev;
          }
          };
          74、事件、IE与火狐的事件机制有什么区别? 如何阻止冒泡?
        1. 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为。
        2. 事件处理机制:IE是事件冒泡、火狐是 事件捕获;
        3. ev.stopPropagation();
          75、什么是闭包(closure),为什么要用?
          执行say667()后,say667()闭包内部变量会存在,而闭包内部函数的内部变量不会存在.使得Javascript的垃圾回收机制GC不会收回say667()所占用的资源,因为say667()的内部函数的执行需要依赖say667()中的变量。这是对闭包作用的非常直白的描述.
          function say667() {
          // Local variable that ends up within closure
          var num = 666;
          var sayAlert = function() { alert(num); }
          num++;
          return sayAlert;
          }
          var sayAlert = say667();
          sayAlert()//执行结果应该弹出的667
          76、如何判断一个对象是否属于某个类?
          使用instanceof (待完善)
          if(a instanceof Person){
          alert(‘yes’);
          }
          77、new操作符具体干了什么呢?
          1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
          2、属性和方法被加入到 this 引用的对象中。
          3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。
          var obj = {};
          obj.proto = Base.prototype;
          Base.call(obj);
          78、JSON 的了解
          JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小
          {‘age’:‘12’, ‘name’:‘back’}
          79、js延迟加载的方式有哪些
          defer和async、动态创建DOM方式(用得最多)、按需异步载入js
          80、模块化怎么做?
          立即执行函数,不暴露私有成员
          var module1 = (function(){
              var _count = 0;
              var m1 = function(){
                //…
              };
              var m2 = function(){
                //…
              };
              return {
                m1 : m1,
                m2 : m2
              };
            })();
          81、异步加载的方式
          (1) defer,只支持IE
          (2) async:
          (3) 创建script,插入到DOM中,加载完毕后callBack
          documen.write和 innerHTML的区别
          document.write只能重绘整个页面
          innerHTML可以重绘页面的一部分
          82、告诉我答案是多少?
          (function(x){
          delete x;
          alert(x);
          })(1+5);
          函数参数无法delete删除,delete只能删除通过for in访问的属性。
          当然,删除失败也不会报错,所以代码运行会弹出“1”。
          83、JS中的call()和apply()方法的区别?
          例子中用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);
          注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
          function add(a,b){
          alert(a+b);
          }
          function sub(a,b){
          alert(a-b);
          }
          add.call(sub,3,1);
          84、Jquery与jQuery UI 有啥区别?
          *jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。
          *jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。
          提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等
          85、jquery 中如何将数组转化为json字符串,然后再转化回来?
          jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展:
          $.fn.stringifyArray = function(array) {
          return JSON.stringify(array)
          }
          $.fn.parseArray = function(array) {
          return JSON.parse(array)
          }
          然后调用:
          ( &quot; &quot; ) . s t r i n g i f y A r r a y ( a r r a y ) 86 、 J a v a S c r i p t 中 的 作 用 域 与 变 量 声 明 提 升 ? 其 他 部 分 ( H T T P 、 正 则 、 优 化 、 重 构 、 响 应 式 、 移 动 端 、 团 队 协 作 、 S E O 、 U E D 、 职 业 生 涯 ) ∗ 基 于 C l a s s 的 选 择 性 的 性 能 相 对 于 I d 选 择 器 开 销 很 大 , 因 为 需 遍 历 所 有 D O M 元 素 。 ∗ 频 繁 操 作 的 D O M , 先 缓 存 起 来 再 操 作 。 用 J q u e r y 的 链 式 调 用 更 好 。 比 如 : v a r s t r = (&quot;&quot;).stringifyArray(array) 86、JavaScript中的作用域与变量声明提升? 其他部分 (HTTP、正则、优化、重构、响应式、移动端、团队协作、SEO、UED、职业生涯) *基于Class的选择性的性能相对于Id选择器开销很大,因为需遍历所有DOM元素。 *频繁操作的DOM,先缓存起来再操作。用Jquery的链式调用更好。 比如:var str= ("").stringifyArray(array)86JavaScriptHTTPSEOUEDClassIdDOMDOMJqueryvarstr=(“a”).attr(“href”);
          *for (var i = size; i < arr.length; i++) {}
          for 循环每一次循环都查找了数组 (arr) 的.length 属性,在开始循环的时候设置一个变量来存储这个数字,可以让循环跑得更快:
          for (var i = size, length = arr.length; i < length; i++) {}
          87、前端开发的优化问题(看雅虎14条性能优化原则)。
          (1) 减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器。
          (2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
          (3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。
          (4) 当需要设置的样式很多时设置className而不是直接操作style。
          (5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
          (6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。
          (7) 图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳。
          (8) 避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢。
          88、http状态码有那些?分别代表是什么意思?
          100-199 用于指定客户端应相应的某些动作。
          200-299 用于表示请求成功。
          300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
          400-499 用于指出客户端的错误。
          400 语义有误,当前请求无法被服务器理解。
          401 当前请求需要用户验证
          403 服务器已经理解请求,但是拒绝执行它。
          500-599 用于支持服务器错误。
          503 – 服务不可用
          89、一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好)
          要熟悉前后端的通信流程,最好把动态网站的背后细节也介绍一遍
          七、流行框架
          1、JQuery的源码看过吗?能不能简单概况一下它的实现原理?
          考察学习知识的态度,是否仅仅是停留在使用层面,要知其然知其所以然
          2、jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this?
          this执行init构造函数自身,其实就是jQuery实例对象,返回this是为了实现jQuery的链式操作
          3、jquery中如何将数组转化为json字符串,然后再转化回来?
          . p a r s e J S O N ( ′ &quot; n a m e &quot; : &quot; J o h n &quot; ′ ) ; 4 、 j Q u e r y 的 属 性 拷 贝 ( e x t e n d ) 的 实 现 原 理 是 什 么 , 如 何 实 现 深 拷 贝 ? 递 归 赋 值 5 、 j q u e r y . e x t e n d 与 j q u e r y . f n . e x t e n d 的 区 别 ? J q u e r y . e x t e n d 用 来 扩 展 j Q u e r y 对 象 本 身 ; j q u e r y . f n . e x t e n d 用 来 扩 展 j Q u e r y 实 例 6 、 谈 一 下 J q u e r y 中 的 b i n d ( ) , l i v e ( ) , d e l e g a t e ( ) , o n ( ) 的 区 别 ? 7 、 J Q u e r y 一 个 对 象 可 以 同 时 绑 定 多 个 事 件 , 这 是 如 何 实 现 的 ? 可 以 同 时 绑 定 多 个 事 件 , 低 层 实 现 原 理 是 使 用 a d d E v e n t L i s t n e r 与 a t t a c h E v e n t 兼 容 处 理 做 事 件 注 册 10 、 J q u e r y 与 j Q u e r y U I 有 啥 区 别 ? j Q u e r y 是 操 作 d o m 的 框 架 , j Q u e r y U I 是 基 于 j Q u e r y 做 的 一 个 U I 组 件 库 11 、 j Q u e r y 和 Z e p t o 的 区 别 ? 各 自 的 使 用 场 景 ? j Q u e r y 主 要 用 于 p c 端 , 当 然 有 对 应 的 j Q u e r y m o b i l e 用 于 移 动 端 , z e p t o 比 j Q u e r y 更 加 小 巧 , 主 要 用 于 移 动 端 12 、 针 对 j Q u e r y 的 优 化 方 法 ? 优 先 使 用 I D 选 择 器 在 c l a s s 前 使 用 t a g ( 标 签 名 ) 给 选 择 器 一 个 上 下 文 慎 用 . l i v e ( ) 方 法 ( 应 该 说 尽 量 不 要 使 用 ) 使 用 d a t a ( ) 方 法 存 储 临 时 变 量 13 、 Z e p t o 的 点 透 问 题 如 何 解 决 ? 点 透 主 要 是 由 于 两 个 d i v 重 合 , 例 如 : 一 个 d i v 调 用 s h o w ( ) , 一 个 d i v 调 用 h i d e ( ) ; 这 个 时 候 当 点 击 上 面 的 d i v 的 时 候 就 会 影 响 到 下 面 的 那 个 d i v ; 解 决 办 法 主 要 有 2 种 : 1. g i t h u b 上 有 一 个 叫 做 f a s t c l i c k 的 库 , 它 也 能 规 避 移 动 设 备 上 c l i c k 事 件 的 延 迟 响 应 , h t t p s : / / g i t h u b . c o m / f t l a b s / f a s t c l i c k 将 它 用 s c r i p t 标 签 引 入 页 面 ( 该 库 支 持 A M D , 于 是 你 也 可 以 按 照 A M D 规 范 , 用 诸 如 r e q u i r e . j s 的 模 块 加 载 器 引 入 ) , 并 且 在 d o m r e a d y 时 初 始 化 在 b o d y 上 , 2. 根 据 分 析 , 如 果 不 引 入 其 它 类 库 , 也 不 想 自 己 按 照 上 述 f a s t c l c i k 的 思 路 再 开 发 一 套 东 西 , 需 要 1. 一 个 优 先 于 下 面 的 “ d i v C l i c k U n d e r ” 捕 获 的 事 件 ; 2. 并 且 通 过 这 个 事 件 阻 止 掉 默 认 行 为 ( 下 面 的 “ d i v C l i c k U n d e r ” 对 c l i c k 事 件 的 捕 获 , 在 i o s 的 s a f a r i , c l i c k 的 捕 获 被 认 为 和 滚 屏 、 点 击 输 入 框 弹 起 键 盘 等 一 样 , 是 一 种 浏 览 器 默 认 行 为 , 即 可 以 被 e v e n t . p r e v e n t D e f a u l t ( ) 阻 止 的 行 为 ) 。 14 、 知 道 各 种 J S 框 架 ( A n g u l a r , B a c k b o n e , E m b e r , R e a c t , M e t e o r , K n o c k o u t . . . ) 么 ? 能 讲 出 他 们 各 自 的 优 点 和 缺 点 么 ? 知 识 面 的 宽 度 , 流 行 框 架 要 多 多 熟 悉 15 、 U n d e r s c o r e 对 哪 些 J S 原 生 对 象 进 行 了 扩 展 以 及 提 供 了 哪 些 好 用 的 函 数 方 法 ? U n d e r s c o r e 的 熟 悉 程 度 16 、 使 用 过 a n g u l a r 吗 ? a n g u l a r 中 的 过 滤 器 是 干 什 么 用 的 在 表 达 式 中 转 换 数 据 &lt; p &gt; 姓 名 为   l a s t N a m e ∣ u p p e r c a s e &lt; / p &gt; c u r r e n c y , 是 什 么 过 滤 器 — — 格 式 化 数 字 为 货 币 格 式 , 单 位 是 .parseJSON(&#x27;{&quot;name&quot;:&quot;John&quot;}&#x27;); 4、jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝? 递归赋值 5、jquery.extend 与 jquery.fn.extend的区别? Jquery.extend用来扩展jQuery对象本身;jquery.fn.extend用来扩展jQuery实例 6、谈一下Jquery中的bind(),live(),delegate(),on()的区别? 7、JQuery一个对象可以同时绑定多个事件,这是如何实现的? 可以同时绑定多个事件,低层实现原理是使用addEventListner与attachEvent兼容处理做事件注册 10、Jquery与jQuery UI有啥区别? jQuery是操作dom的框架,jQueryUI是基于jQuery做的一个UI组件库 11、jQuery和Zepto的区别?各自的使用场景? jQuery主要用于pc端,当然有对应的jQuerymobile用于移动端,zepto比jQuery更加小巧,主要用于移动端 12、针对 jQuery 的优化方法? 优先使用ID选择器 在class前使用tag(标签名) 给选择器一个上下文 慎用 .live()方法(应该说尽量不要使用) 使用data()方法存储临时变量 13、Zepto的点透问题如何解决? 点透主要是由于两个div重合,例如:一个div调用show(),一个div调用hide();这个时候当点击上面的div的时候就会影响到下面的那个div; 解决办法主要有2种: 1.github上有一个叫做fastclick的库,它也能规避移动设备上click事件的延迟响应,https://github.com/ftlabs/fastclick 将它用script标签引入页面(该库支持AMD,于是你也可以按照AMD规范,用诸如require.js的模块加载器引入),并且在dom ready时初始化在body上, 2.根据分析,如果不引入其它类库,也不想自己按照上述fastclcik的思路再开发一套东西,需要1.一个优先于下面的“divClickUnder”捕获的事件;2.并且通过这个事件阻止掉默认行为(下面的“divClickUnder”对click事件的捕获,在ios的safari,click的捕获被认为和滚屏、点击输入框弹起键盘等一样,是一种浏览器默认行为,即可以被event.preventDefault()阻止的行为)。 14、知道各种JS框架(Angular, Backbone, Ember, React, Meteor, Knockout...)么? 能讲出他们各自的优点和缺点么? 知识面的宽度,流行框架要多多熟悉 15、Underscore 对哪些 JS 原生对象进行了扩展以及提供了哪些好用的函数方法? Underscore的熟悉程度 16、使用过angular吗?angular中的过滤器是干什么用的 在表达式中转换数据&lt;p&gt;姓名为 {{ lastName | uppercase }}&lt;/p&gt; currency,是什么过滤器——格式化数字为货币格式,单位是 .parseJSON("name":"John");4jQuery(extend)5jquery.extendjquery.fn.extendJquery.extendjQueryjquery.fn.extendjQuery6Jquerybind(),live(),delegate(),on()7JQuery使addEventListnerattachEvent10JqueryjQueryUIjQuerydomjQueryUIjQueryUI11jQueryZepto使jQuerypcjQuerymobilezeptojQuery12jQuery使IDclass使tag().live()使使data()13Zeptodivdivshow()divhide()divdiv21.githubfastclickclickhttps://github.com/ftlabs/fastclickscriptAMDAMDrequire.jsdomreadybody2.fastclcik西1.divClickUnder2.divClickUnderclickiossafariclickevent.preventDefault()14JS(Angular,Backbone,Ember,React,Meteor,Knockout...)??15UnderscoreJSUnderscore16使angularangular<p> lastNameuppercase</p>currency符。

        八、移动APP开发
        1、移动端最小触控区域是多大?
        移动端的点击事件的有延迟,时间是多久,为什么会有? 怎么解决这个延时?(click 有 300ms 延迟,为了实现safari的双击事件的设计,浏览器要知道你是不是要双击操作。)
        九、NodeJs
        64.对Node的优点和缺点提出了自己的看法:
        *(优点)因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,
        因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。
        此外,与Node代理服务器交互的客户端代码是由javascript语言编写的,
        因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。
        *(缺点)Node是一个相对新的开源项目,所以不太稳定,它总是一直在变,
        而且缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子。
        65.需求:实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案?
        至少给出自己的思路(url-hash,可以使用已有的一些框架history.js等)
        66.Node.js的适用场景?
        1)、实时应用:如在线聊天,实时通知推送等等(如socket.io
        2)、分布式应用:通过高效的并行I/O使用已有的数据
        3)、工具类应用:海量的工具,小到前端压缩部署(如grunt),大到桌面图形界面应用程序
        4)、游戏类应用:游戏领域对实时和并发有很高的要求(如网易的pomelo框架)
        5)、利用稳定接口提升Web渲染能力
        6)、前后端编程语言环境统一:前端开发人员可以非常快速地切入到服务器端的开发(如著名的纯Javascript全栈式MEAN架构)
        67.(如果会用node)知道route, middleware, cluster, nodemon, pm2, server-side rendering么?
        Nodejs相关概念的理解程度
        68.解释一下 Backbone 的 MVC 实现方式?
        流行的MVC架构模式
        69.什么是“前端路由”?什么时候适合使用“前端路由”? “前端路由”有哪些优点和缺点?
        熟悉前后端通信相关知识
        70.对Node的优点和缺点提出了自己的看法?
        优点:

        1. 因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。
        2. 与Node代理服务器交互的客户端代码是由javascript语言编写的,因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。
          缺点:
        3. Node是一个相对新的开源项目,所以不太稳定,它总是一直在变。
        4. 缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子(第三方库现在已经很丰富了,所以这个缺点可以说不存在了)。

        十、前端概括性问题
        71.常使用的库有哪些?常用的前端开发工具?开发过什么应用或组件?
        使用率较高的框架有jQuery、YUI、Prototype、Dojo、Ext.js、Mootools等。尤其是jQuery,超过91%。
        轻量级框架有Modernizr、underscore.js、backbone.js、Raphael.js等。(理解这些框架的功能、性能、设计原理)
        前端开发工具:Sublime Text 、Eclipse、Notepad、Firebug、HttpWatch、Yslow。
        开发过的插件:城市选择插件,汽车型号选择插件、幻灯片插件。弹出层。(写过开源程序,加载器,js引擎更好)
        72.对BFC规范的理解?
        Formatting Context:指页面中的一个渲染区域,并且拥有一套渲染规则,他决定了其子元素如何定位,以及与其他元素的相互关系和作用。
        73.99%的网站都需要被重构是那本书上写的?
        网站重构:应用web标准进行设计(第2版)
        74.WEB应用从服务器主动推送Data到客户端有那些方式?
        html5 websoket
        WebSocket通过Flash
        XHR长时间连接
        XHR Multipart Streaming
        不可见的Iframe

      展开全文
    21. js面试题

      千次阅读 多人点赞 2019-04-09 19:42:32
      缓存 Layout 属性值,如:var left = elem.offsetLeft; 这样,多次使用 left 只产生一次回流 尽量避免用 table 布局(table 元素一旦触发回流就会导致 table 里所有的其它元素回流) 避免使用 css 表达式...

      JavaScript 的组成

      JavaScript 由以下三部分组成:

      • ECMAScript(核心):JavaScript 语言基础
      • DOM(文档对象模型):规定了访问 HTML 和 XML 的接口
      • BOM(浏览器对象模型):提供了浏览器窗口之间进行交互的对象和方法

      JS 的基本数据类型和引用数据类型

      • 基本数据类型:undefined、null、boolean、number、string、symbol
      • 引用数据类型:object、array、function

      检测浏览器版本版本有哪些方式?

      • 根据 navigator.userAgent // UA.toLowerCase().indexOf(‘chrome’)
      • 根据 window 对象的成员 // ‘ActiveXObject’ in window

      介绍 JS 有哪些内置对象?

      • 数据封装类对象:Object、Array、Boolean、Number、String
      • 其他对象:Function、Arguments、Math、Date、RegExp、Error
      • ES6 新增对象:Symbol、Map、Set、Promises、Proxy、Reflect

      说几条写 JavaScript 的基本规范?

      • 代码缩进,建议使用“四个空格”缩进
      • 代码段使用花括号{}包裹
      • 语句结束使用分号;
      • 变量和函数在使用前进行声明
      • 以大写字母开头命名构造函数,全大写命名常量
      • 规范定义 JSON 对象,补全双引号
      • 用{}和[]声明对象和数组

      如何编写高性能的 JavaScript?

      • 遵循严格模式:“use strict”;
      • 将 js 脚本放在页面底部,加快渲染页面
      • 将 js 脚本将脚本成组打包,减少请求
      • 使用非阻塞方式下载 js 脚本
      • 尽量使用局部变量来保存全局变量
      • 尽量减少使用闭包
      • 使用 window 对象属性方法时,省略 window
      • 尽量减少对象成员嵌套
      • 缓存 DOM 节点的访问
      • 通过避免使用 eval() 和 Function() 构造器
      • 给 setTimeout() 和 setInterval() 传递函数而不是字符串作为参数
      • 尽量使用直接量创建对象和数组
      • 最小化重绘(repaint)和回流(reflow)

      DOM 元素 e 的 e.getAttribute(propName)和 e.propName 有什么区别和联系

      • e.getAttribute(),是标准 DOM 操作文档元素属性的方法,具有通用性可在任意文档上使用,返回元素在源文件中设置的属性
      • e.propName 通常是在 HTML 文档中访问特定元素的特性,浏览器解析元素后生成对应对象(如 a 标签生成 HTMLAnchorElement),这些对象的特性会根据特定规则结合属性设置得到,对于没有对应特性的属性,只能使用 getAttribute 进行访问
      • e.getAttribute()返回值是源文件中设置的值,类型是字符串或者 null(有的实现返回"")
      • e.propName 返回值可能是字符串、布尔值、对象、undefined 等
      • 大部分 attribute 与 property 是一一对应关系,修改其中一个会影响另一个,如 id,title 等属性
      • 一些布尔属性<input hidden/>的检测设置需要 hasAttribute 和 removeAttribute 来完成,或者设置对应 property
      • <a href="../index.html">link</a>中 href 属性,转换成 property 的时候需要通过转换得到完整 URL
      • 一些 attribute 和 property 不是一一对应如:form 控件中<input value="hello"/>对应的是 defaultValue,修改或设置 value property 修改的是控件当前值,setAttribute 修改 value 属性不会改变 value property

      offsetWidth/offsetHeight,clientWidth/clientHeight 与 scrollWidth/scrollHeight 的区别

      • offsetWidth/offsetHeight 返回值包含 content + padding + border,效果与 e.getBoundingClientRect()相同
      • clientWidth/clientHeight 返回值只包含 content + padding,如果有滚动条,也不包含滚动条
      • scrollWidth/scrollHeight 返回值包含 content + padding + 溢出内容的尺寸

      描述浏览器的渲染过程,DOM 树和渲染树的区别?

      浏览器的渲染过程:

      • 解析 HTML 构建 DOM(DOM 树),并行请求 css/image/js
      • CSS 文件下载完成,开始构建 CSSOM(CSS 树)
      • CSSOM 构建结束后,和 DOM 一起生成 Render Tree(渲染树)
      • 布局(Layout):计算出每个节点在屏幕中的位置
      • 显示(Painting):通过显卡把页面画到屏幕上

      DOM 树 和 渲染树 的区别:

      • DOM 树与 HTML 标签一一对应,包括 head 和隐藏元素
      • 渲染树不包括 head 和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的 css 属性

      重绘和回流(重排)的区别和关系?

      • 重绘:当渲染树中的元素外观(如:颜色)发生改变,不影响布局时,产生重绘
      • 回流:当渲染树中的元素的布局(如:尺寸、位置、隐藏/状态状态)发生改变时,产生重绘回流
      • 注意:JS 获取 Layout 属性值(如:offsetLeft、scrollTop、getComputedStyle 等)也会引起回流。因为浏览器需要通过回流计算最新值
      • 回流必将引起重绘,而重绘不一定会引起回流

      如何最小化重绘(repaint)和回流(reflow)?

      • 需要要对元素进行复杂的操作时,可以先隐藏(display:“none”),操作完成后再显示
      • 需要创建多个 DOM 节点时,使用 DocumentFragment 创建完后一次性的加入 document
      • 缓存 Layout 属性值,如:var left = elem.offsetLeft; 这样,多次使用 left 只产生一次回流
      • 尽量避免用 table 布局(table 元素一旦触发回流就会导致 table 里所有的其它元素回流)
      • 避免使用 css 表达式(expression),因为每次调用都会重新计算值(包括加载页面)
      • 尽量使用 css 属性简写,如:用 border 代替 border-width, border-style, border-color
        批量修改元素样式:elem.className 和 elem.style.cssText 代替 elem.style.xxx

      script 的位置是否会影响首屏显示时间?

      • 在解析 HTML 生成 DOM 过程中,js 文件的下载是并行的,不需要 DOM 处理到 script 节点。因此,script 的位置不影响首屏显示的开始时间。
      • 浏览器解析 HTML 是自上而下的线性过程,script 作为 HTML 的一部分同样遵循这个原则
      • 因此,script 会延迟 DomContentLoad,只显示其上部分首屏内容,从而影响首屏显示的完成时间

      解释 JavaScript 中的作用域与变量声明提升?

      JavaScript 作用域:

      • 在 Java、C 等语言中,作用域为 for 语句、if 语句或{}内的一块区域,称为作用域;
      • 而在 JavaScript 中,作用域为 function(){}内的区域,称为函数作用域。

      JavaScript 变量声明提升:

      • 在 JavaScript 中,函数声明与变量声明经常被 JavaScript 引擎隐式地提升到当前作用域的顶部。
      • 声明语句中的赋值部分并不会被提升,只有名称被提升
      • 函数声明的优先级高于变量,如果变量名跟函数名相同且未赋值,则函数声明会覆盖变量声明
      • 如果函数有多个同名参数,那么最后一个参数(即使没有定义)会覆盖前面的同名参数

      介绍 JavaScript 的原型,原型链?有什么特点?

      原型:

      • JavaScript 的所有对象中都包含了一个 [proto] 内部属性,这个属性所对应的就是该对象的原型
      • JavaScript 的函数对象,除了原型 [proto] 之外,还预置了 prototype 属性
      • 当函数对象作为构造函数创建实例时,该 prototype 属性值将被作为实例对象的原型 [proto]。

      原型链:

      • 当一个对象调用的属性/方法自身不存在时,就会去自己 [proto] 关联的前辈 prototype 对象上去找
      • 如果没找到,就会去该 prototype 原型 [proto] 关联的前辈 prototype 去找。依次类推,直到找到属性/方法或 undefined 为止。从而形成了所谓的“原型链”

      原型特点:

      • JavaScript 对象是通过引用来传递的,当修改原型时,与之相关的对象也会继承这一改变

      JavaScript 有几种类型的值?,你能画一下他们的内存图吗

      • 原始数据类型(Undefined,Null,Boolean,Number、String)-- 栈
      • 引用数据类型(对象、数组和函数)-- 堆
      • 两种类型的区别是:存储位置不同:
      • 原始数据类型是直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据;
      • 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;
      • 引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。
      • 当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

      JavaScript 如何实现一个类,怎么实例化这个类?

      1. 构造函数法(this + prototype) – 用 new 关键字 生成实例对象
        • 缺点:用到了 this 和 prototype,编写复杂,可读性差
        function Mobile(name, price){
           this.name = name;
           this.price = price;
         }
         Mobile.prototype.sell = function(){
            alert(this.name + ",售价 $" + this.price);
         }
         var iPhone7 = new Mobile("iPhone7", 1000);
         iPhone7.sell();
      
      1. Object.create 法 – 用 Object.create() 生成实例对象
        • 缺点:不能实现私有属性和私有方法,实例对象之间也不能共享数据
       var Person = {
           firstname: "Mark",
           lastname: "Yun",
           age: 25,
           introduce: function(){
               alert('I am ' + Person.firstname + ' ' + Person.lastname);
           }
       };
      
       var person = Object.create(Person);
       person.introduce();
      
       // Object.create 要求 IE9+,低版本浏览器可以自行部署:
       if (!Object.create) {
          Object.create = function (o) {
          function F() {}
          F.prototype = o;
          return new F();
        };
       }
      
      1. 极简主义法(消除 this 和 prototype) – 调用 createNew() 得到实例对象
        • 优点:容易理解,结构清晰优雅,符合传统的"面向对象编程"的构造
       var Cat = {
         age: 3, // 共享数据 -- 定义在类对象内,createNew() 外
         createNew: function () {
           var cat = {};
           // var cat = Animal.createNew(); // 继承 Animal 类
           cat.name = "小咪";
           var sound = "喵喵喵"; // 私有属性--定义在 createNew() 内,输出对象外
           cat.makeSound = function () {
             alert(sound);  // 暴露私有属性
           };
           cat.changeAge = function(num){
             Cat.age = num; // 修改共享数据
           };
           return cat; // 输出对象
         }
       };
      
       var cat = Cat.createNew();
       cat.makeSound();
      
      1. ES6 语法糖 class – 用 new 关键字 生成实例对象
           class Point {
             constructor(x, y) {
               this.x = x;
               this.y = y;
             }
             toString() {
               return '(' + this.x + ', ' + this.y + ')';
             }
           }
      
        var point = new Point(2, 3);
      

      Javascript 如何实现继承?

      1. 构造函数绑定:使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上
      function Cat(name,color){
        Animal.apply(this, arguments);
        this.name = name;
        this.color = color;
      }
      
      1. 实例继承:将子对象的 prototype 指向父对象的一个实例
      Cat.prototype = new Animal();
      Cat.prototype.constructor = Cat;
      
      1. 拷贝继承:如果把父对象的所有属性和方法,拷贝进子对象
      function extend(Child, Parent) {
         var p = Parent.prototype;
         var c = Child.prototype;
         for (var i in p) {
            c[i] = p[i];
         }
         c.uber = p;
      }
      
      1. 原型继承:将子对象的 prototype 指向父对象的 prototype
      function extend(Child, Parent) {
          var F = function(){};
           F.prototype = Parent.prototype;
           Child.prototype = new F();
           Child.prototype.constructor = Child;
           Child.uber = Parent.prototype;
      }
      
      1. ES6 语法糖 extends:class ColorPoint extends Point {}
      class ColorPoint extends Point {
          constructor(x, y, color) {
              super(x, y); // 调用父类的constructor(x, y)
              this.color = color;
          }
          toString() {
              return this.color + ' ' + super.toString(); // 调用父类的toString()
          }
      }
      

      js 继承方式及其优缺点

      原型链继承的缺点

      • 一是字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。

      借用构造函数(类式继承)

      • 借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。所以我们需要原型链+借用构造函数的模式,这种模式称为组合继承

      组合式继承

      • 组合式继承是比较常用的一种继承方法,其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性。

      javascript 创建对象的几种方式?

      javascript 创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用 JSON;但写法有很多种,也能混合使用

      1. 对象字面量的方式
      person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
      
      1. 用 function 来模拟无参的构造函数
       function Person(){}
          var person=new Person();//定义一个function,如果使用new"实例化",该function可以看作是一个Class
              person.name="Mark";
              person.age="25";
              person.work=function(){
              alert(person.name+" hello...");
          }
      person.work();
      
      1. 用 function 来模拟参构造函数来实现(用 this 关键字定义构造的上下文属性)
      function Pet(name,age,hobby){
          this.name=name;//this作用域:当前对象
          this.age=age;
          this.hobby=hobby;
          this.eat=function(){
              alert("我叫"+this.name+",我喜欢"+this.hobby+",是个程序员");
          }
      }
      var maidou =new Pet("麦兜",25,"coding");//实例化、创建对象
      maidou.eat();//调用eat方法
      
      1. 用工厂方式来创建(内置对象)
      var wcDog =new Object();
           wcDog.name="旺财";
           wcDog.age=3;
      wcDog.work=function(){
          alert("我是"+wcDog.name+",汪汪汪......");
      }
      wcDog.work();
      
      1. 用原型方式来创建
      function Dog(){
      
          }
      Dog.prototype.name="旺财";
      Dog.prototype.eat=function(){
          alert(this.name+"是个吃货");
      }
      var wangcai =new Dog();
      wangcai.eat();
      
      1. 用混合方式来创建
      function Car(name,price){
          this.name=name;
          this.price=price;
      }
          Car.prototype.sell=function(){
          alert("我是"+this.name+",我现在卖"+this.price+"万元");
          }
      var camry =new Car("凯美瑞",27);
      camry.sell();
      

      Javascript 作用链域?

      • 全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节
      • 如果当前作用域没有找到属性或方法,会向上层作用域查找,直至全局函数,这种形式就是作用域链

      谈谈 this 对象的理解

      • this 总是指向函数的直接调用者
      • 如果有 new 关键字,this 指向 new 出来的实例对象
      • 在事件中,this 指向触发这个事件的对象
      • IE 下 attachEvent 中的 this 总是指向全局对象 Window

      eval 是做什么的?

      eval 的功能是把对应的字符串解析成 JS 代码并运行

      • 应该避免使用 eval,不安全,非常耗性能(先解析成 js 语句,再执行)
      • 由 JSON 字符串转换为 JSON 对象的时候可以用 eval(’(’+ str +’)’);

      什么是 Window 对象? 什么是 Document 对象?

      • Window 对象表示当前浏览器的窗口,是 JavaScript 的顶级对象。
      • 我们创建的所有对象、函数、变量都是 Window 对象的成员。
      • Window 对象的方法和属性是在全局范围内有效的。
      • Document 对象是 HTML 文档的根节点与所有其他节点(元素节点,文本节点,属性节点, 注释节点)
      • Document 对象使我们可以通过脚本对 HTML 页面中的所有元素进行访问
      • Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问

      介绍 DOM 的发展

      • DOM:文档对象模型(Document Object Model),定义了访问 HTML 和 XML 文档的标准,与编程语言及平台无关
      • DOM0:提供了查询和操作 Web 文档的内容 API。未形成标准,实现混乱。如:document.forms[‘login’]
      • DOM1:W3C 提出标准化的 DOM,简化了对文档中任意部分的访问和操作。如:JavaScript 中的 Document 对象
      • DOM2:原来 DOM 基础上扩充了鼠标事件等细分模块,增加了对 CSS 的支持。如:getComputedStyle(elem, pseudo)
      • DOM3:增加了 XPath 模块和加载与保存(Load and Save)模块。如:XPathEvaluator

      介绍 DOM0,DOM2,DOM3 事件处理方式区别

      DOM0 级事件处理方式:

      • btn.onclick = func;
      • btn.onclick = null;

      DOM2 级事件处理方式:

      • btn.addEventListener(‘click’, func, false);
      • btn.removeEventListener(‘click’, func, false);
      • btn.attachEvent(“onclick”, func);
      • btn.detachEvent(“onclick”, func);

      DOM3 级事件处理方式:

      • eventUtil.addListener(input, “textInput”, func);
      • eventUtil 是自定义对象,textInput 是 DOM3 级事件

      事件的三个阶段

      捕获、目标、冒泡

      介绍事件“捕获”和“冒泡”执行顺序和事件的执行次数?

      按照 W3C 标准的事件:首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段

      事件执行次数(DOM2-addEventListener):元素上绑定事件的个数

      • 注意 1:前提是事件被确实触发
      • 注意 2:事件绑定几次就算几个事件,即使类型和功能完全一样也不会“覆盖”

      事件执行顺序:判断的关键是否目标元素

      • 非目标元素:根据 W3C 的标准执行:捕获->目标元素->冒泡(不依据事件绑定顺序)
      • 目标元素:依据事件绑定顺序:先绑定的事件先执行(不依据捕获冒泡标准)
      • 最终顺序:父元素捕获->目标元素事件 1->目标元素事件 2->子元素捕获->子元素冒泡->父元素冒泡
      • 注意:子元素事件执行前提 事件确实“落”到子元素布局区域上,而不是简单的具有嵌套关系

      在一个 DOM 上同时绑定两个点击事件:一个用捕获,一个用冒泡。事件会执行几次,先执行冒泡还是捕获?

      • 该 DOM 上的事件如果被触发,会执行两次(执行次数等于绑定次数)
      • 如果该 DOM 是目标元素,则按事件绑定顺序执行,不区分冒泡/捕获
      • 如果该 DOM 是处于事件流中的非目标元素,则先执行捕获,后执行冒泡

      事件的代理/委托

      事件委托是指将事件绑定目标元素的到父元素上,利用冒泡机制触发该事件

      优点:

      • 可以减少事件注册,节省大量内存占用
      • 可以将事件应用于动态添加的子元素上

      缺点: 使用不当会造成事件在不应该触发时触发

      示例:

      ulEl.addEventListener('click', function(e){
          var target = event.target || event.srcElement;
          if(!!target && target.nodeName.toUpperCase() === "LI"){
              console.log(target.innerHTML);
          }
      }, false);
      

      IE 与火狐的事件机制有什么区别? 如何阻止冒泡?

      IE 只事件冒泡,不支持事件捕获;火狐同时支持件冒泡和事件捕获。

      阻止冒泡:

      • 取消默认操作: w3c 的方法是 e.preventDefault(),IE 则是使用 e.returnValue = false;
      • return false javascript 的 return false 只会阻止默认行为,而是用 jQuery 的话则既阻止默认行为又防止对象冒泡。
      • 阻止冒泡 w3c 的方法是 e.stopPropagation(),IE 则是使用 e.cancelBubble = true
      [js] view plaincopy
      function stopHandler(event)
      
          window.event?window.event.cancelBubble=true:event.stopPropagation();
      
      }
      

      参考链接:浅谈 javascript 事件取消和阻止冒泡-开源中国 2015

      IE 的事件处理和 W3C 的事件处理有哪些区别?(必考)

      绑定事件

      • W3C: targetEl.addEventListener(‘click’, handler, false);
      • IE: targetEl.attachEvent(‘onclick’, handler);

      删除事件

      • W3C: targetEl.removeEventListener(‘click’, handler, false);
      • IE: targetEl.detachEvent(event, handler);

      事件对象

      • W3C: var e = arguments.callee.caller.arguments[0]
      • IE: window.event

      事件目标

      • W3C: e.target
      • IE: window.event.srcElement

      阻止事件默认行为

      • W3C: e.preventDefault()
      • IE: window.event.returnValue = false’

      阻止事件传播

      • W3C: e.stopPropagation()
      • IE: window.event.cancelBubble = true

      W3C 事件的 target 与 currentTarget 的区别?

      • target 只会出现在事件流的目标阶段
      • currentTarget 可能出现在事件流的任何阶段
      • 当事件流处在目标阶段时,二者的指向相同
      • 当事件流处于捕获或冒泡阶段时:currentTarget 指向当前事件活动的对象(一般为父级)

      如何派发事件(dispatchEvent)?(如何进行事件广播?)

      • W3C: 使用 dispatchEvent 方法
      • IE: 使用 fireEvent 方法
      var fireEvent = function(element, event){
          if (document.createEventObject){
              var mockEvent = document.createEventObject();
              return element.fireEvent('on' + event, mockEvent)
          }else{
              var mockEvent = document.createEvent('HTMLEvents');
              mockEvent.initEvent(event, true, true);
              return !element.dispatchEvent(mockEvent);
          }
      }
      

      什么是函数节流?介绍一下应用场景和原理?

      • 函数节流(throttle)是指阻止一个函数在很短时间间隔内连续调用。 只有当上一次函数执行后达到规定的时间间隔,才能进行下一次调用。 但要保证一个累计最小调用间隔(否则拖拽类的节流都将无连续效果)
      • 函数节流用于 onresize, onscroll 等短时间内会多次触发的事件
      • 函数节流的原理:使用定时器做时间节流。 当触发一个事件时,先用 setTimout 让这个事件延迟一小段时间再执行。 如果在这个时间间隔内又触发了事件,就 clearTimeout 原来的定时器, 再 setTimeout 一个新的定时器重复以上流程。

      函数节流简单实现:

      function throttle(method, context) {
           clearTimeout(methor.tId);
           method.tId = setTimeout(function(){
               method.call(context);
           }100); // 两次调用至少间隔 100ms
      }
      // 调用
      window.onresize = function(){
          throttle(myFunc, window);
      }
      

      区分什么是“客户区坐标”、“页面坐标”、“屏幕坐标”?

      • 客户区坐标:鼠标指针在可视区中的水平坐标(clientX)和垂直坐标(clientY)
      • 页面坐标:鼠标指针在页面布局中的水平坐标(pageX)和垂直坐标(pageY)
      • 屏幕坐标:设备物理屏幕的水平坐标(screenX)和垂直坐标(screenY)

      如何获得一个 DOM 元素的绝对位置?

      • elem.offsetLeft:返回元素相对于其定位父级左侧的距离
      • elem.offsetTop:返回元素相对于其定位父级顶部的距离
      • elem.getBoundingClientRect():返回一个 DOMRect 对象,包含一组描述边框的只读属性,单位像素

      分析 [‘1’, ‘2’, ‘3’].map(parseInt) 答案是多少?(常考)

      答案:[1, NaN, NaN]

      parseInt(string, radix) 第 2 个参数 radix 表示进制。省略 radix 或 radix = 0,则数字将以十进制解析

      map 每次为 parseInt 传 3 个参数(elem, index, array),其中 index 为数组索引

      因此,map 遍历 [“1”, “2”, “3”],相应 parseInt 接收参数如下

      parseInt('1', 0);  // 1
      parseInt('2', 1);  // NaN
      parseInt('3', 2);  // NaN
      

      所以,parseInt 参数 radix 不合法,导致返回值为 NaN

      new 操作符具体干了什么?

      • 创建实例对象,this 变量引用该对象,同时还继承了构造函数的原型
      • 属性和方法被加入到 this 引用的对象中
      • 新创建的对象由 this 所引用,并且最后隐式的返回 this

      用原生 JavaScript 的实现过什么功能吗?

      封装选择器、调用第三方 API、设置和获取样式(自由回答)

      解释一下这段代码的意思吗?

        [].forEach.call($$("*"), function(el){
            el.style.outline = "1px solid #" + (~~(Math.random()*(1<<24))).toString(16);
        })
      

      解释:获取页面所有的元素,遍历这些元素,为它们添加 1 像素随机颜色的轮廓(outline)

      • ( s e l ) / / (sel) // (sel)//函数被许多现代浏览器命令行支持,等价于 document.querySelectorAll(sel)
      • [].forEach.call(NodeLists) // 使用 call 函数将数组遍历函数 forEach 应到节点元素列表
      • el.style.outline = “1px solid #333” // 样式 outline 位于盒模型之外,不影响元素布局位置
      • (1<<24) // parseInt(“ffffff”, 16) == 16777215 == 2^24 - 1 // 1<<24 == 2^24 == 16777216
      • Math.random()*(1<<24) // 表示一个位于 0 到 16777216 之间的随机浮点数
      • ~~Math.random()*(1<<24) // ~~ 作用相当于 parseInt 取整
      • (~~(Math.random()*(1<<24))).toString(16) // 转换为一个十六进制-

      JavaScript 实现异步编程的方法?

      • 回调函数
      • 事件监听
      • 发布/订阅
      • Promises 对象
      • Async 函数[ES7]

      web 开发中会话跟踪的方法有哪些

      • cookie
      • session
      • url 重写
      • 隐藏 input
      • ip 地址

      什么是闭包(closure),为什么要用它?

      闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域

      闭包的特性:

      • 函数内再嵌套函数
      • 内部函数可以引用外层的参数和变量
      • 参数和变量不会被垃圾回收机制回收

      javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?

      use strict 是一种 ECMAscript 5 添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,使 JS 编码更加规范化的模式,消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为

      如何判断一个对象是否属于某个类?

      // 使用instanceof (待完善)
         if(a instanceof Person){
             alert('yes');
         }
      

      js 延迟加载的方式有哪些?

      defer 和 async、动态创建 DOM 方式(用得最多)、按需异步载入 js

      defer 和 async

      defer 并行加载 js 文件,会按照页面上 script 标签的顺序执行 async 并行加载 js 文件,下载完成立即执行,不会按照页面上 script 标签的顺序执行

      Ajax 是什么? 如何创建一个 Ajax?

      ajax 的全称:Asynchronous Javascript And XML

      异步传输+js+xml

      所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,等到有了结果它自己会根据设定进行后续操作,与此同时,页面是不会发生整页刷新的,提高了用户体验

      • 创建 XMLHttpRequest 对象,也就是创建一个异步调用对象
      • 建一个新的 HTTP 请求,并指定该 HTTP 请求的方法、URL 及验证信息
      • 设置响应 HTTP 请求状态变化的函数
      • 发送 HTTP 请求
      • 获取异步调用返回的数据
      • 用 JavaScript 和 DOM 实现局部刷新

      同步和异步的区别?

      • 同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作
      • 异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容

      documen.write 和 innerHTML 的区别

      • document.write 只能重绘整个页面
      • innerHTML 可以重绘页面的一部分

      DOM 操作——怎样添加、移除、移动、复制、创建和查找节点?

      创建新节点

      • createDocumentFragment() //创建一个 DOM 片段
      • createElement() //创建一个具体的元素
      • createTextNode() //创建一个文本节点

      添加、移除、替换、插入

      • appendChild()
      • removeChild()
      • replaceChild()
      • insertBefore() //在已有的子节点前插入一个新的子节点

      查找

      • getElementsByTagName() //通过标签名称
      • getElementsByName() // 通过元素的 Name 属性的值(IE 容错能力较强,会得到一个数组,其中包括 id 等于 name 值的) * getElementById() //通过元素 Id,唯一性

      那些操作会造成内存泄漏?

      • 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在
      • 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收
      • setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏
      • 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

      渐进增强和优雅降级

      • 渐进增强 :针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
      • 优雅降级 :一开始就构建完整的功能,然后再针对低版本浏览器进行兼容

      Javascript 垃圾回收方法

      标记清除(mark and sweep)

      • 这是 JavaScript 最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”
      • 垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了

      引用计数(reference counting)

      • 在低版本 IE 中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加 1,如果该变量的值变成了另外一个,则这个值得引用次数减 1,当这个值的引用次数变为 0 的时 候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为 0 的值占用的空间

      参考链接 内存管理-MDN

      用过哪些设计模式?

      1. 工厂模式:
      • 主要好处就是可以消除对象间的耦合,通过使用工程方法而不是 new 关键字。将所有实例化的代码集中在一个位置防止代码重复
      • 工厂模式解决了重复实例化的问题 ,但还有一个问题,那就是识别问题,因为根本无法 搞清楚他们到底是哪个对象的实例
      function createObject(name,age,profession){
          //集中实例化的函数
          var obj = new Object();
          obj.name = name;
          obj.age = age;
          obj.profession = profession;
          obj.move = function () {
              return this.name + ' at ' + this.age + ' engaged in ' + this.profession;
          };
          return obj;
      }
      var test1 = createObject('trigkit4',22,'programmer');//第一个实例var test2 = createObject('mike',25,'engineer');//第二个实例
      
      1. 构造函数模式
      • 使用构造函数的方法 ,即解决了重复实例化的问题 ,又解决了对象识别的问题,该模式与工厂模式的不同之处在于
      • 构造函数方法没有显示的创建对象 (new Object());
      • 直接将属性和方法赋值给 this 对象;
      • 没有 renturn 语句

      说说你对闭包的理解

      使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在 js 中,函数即闭包,只有函数才会产生作用域的概念

      闭包有三个特性:

      • 函数嵌套函数
      • 函数内部可以引用外部的参数和变量
      • 参数和变量不会被垃圾回收机制回收

      请解释一下 JavaScript 的同源策略

      • 概念:同源策略是客户端脚本(尤其是 Javascript)的重要的安全度量标准。它最早出自 Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。这里的同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议
      • 指一段脚本只能读取来自同一来源的窗口和文档的属性

      为什么要有同源限制?

      我们举例说明:比如一个黑客程序,他利用 Iframe 把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,他的页面就可以通过 Javascript 读取到你的表单中 input 中的内容,这样用户名,密码就轻松到手了。]

      缺点: 现在网站的 JS 都会进行压缩,一些文件用了严格模式,而另一些没有。这时这些本来是严格模式的文件,被 merge 后,这个串就到了文件的中间,不仅没有指示严格模式,反而在压缩后浪费了字节

      实现一个函数 clone,可以对 JavaScript 中的 5 种主要的数据类型(包括 Number、String、Object、Array、Boolean)进行值复制(常考)

      function deepClone(obj) {
          if (!isObject(obj)) {
              throw new Error('obj 不是一个对象!')
          }
      
          let isArray = Array.isArray(obj)
          let cloneObj = isArray ? [] : {}
          for (let key in obj) {
              cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
          }
      
          return cloneObj
      }
      

      注意:for…in 法不支持拷贝 func、date、reg 和 err

      // 代理法
      function deepClone(obj) {
          if (!isObject(obj)) {
              throw new Error('obj 不是一个对象!')
          }
      
          let isArray = Array.isArray(obj)
          let cloneObj = isArray ? [...obj] : { ...obj }
          Reflect.ownKeys(cloneObj).forEach(key => {
              cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
          })
      
          return cloneObj
      }
      

      说说严格模式的限制

      • 严格模式主要有以下限制:
      • 变量必须声明后再使用
      • 函数的参数不能有同名属性,否则报错
      • 不能使用 with 语句
      • 不能对只读属性赋值,否则报错
      • 不能使用前缀 0 表示八进制数,否则报错
      • 不能删除不可删除的属性,否则报错
      • 不能删除变量 delete prop,会报错,只能删除属性 delete global[prop]
      • eval 不会在它的外层作用域引入变量
      • eval 和 arguments 不能被重新赋值
      • arguments 不会自动反映函数参数的变化
      • 不能使用 arguments.callee
      • 不能使用 arguments.caller
      • 禁止 this 指向全局对象
      • 不能使用 fn.caller 和 fn.arguments 获取函数调用的堆栈
      • 增加了保留字(比如 protected、static 和 interface)

      如何删除一个 cookie

      将时间设为当前时间往前一点

      var date = new Date();
      date.setDate(date.getDate() - 1);//真正的删除
      

      setDate()方法用于设置一个月的某一天

      expires 的设置

        document.cookie = 'user='+ encodeURIComponent('name')  + ';expires = ' + new Date(0)
      

      编写一个方法 求一个字符串的字节长度

      假设:一个英文字符占用一个字节,一个中文字符占用两个字节

      function GetBytes(str){
      
              var len = str.length;
      
              var bytes = len;
      
              for(var i=0; i<len; i++){
      
                  if (str.charCodeAt(i) > 255) bytes++;
      
              }
      
              return bytes;
      
          }
      
      alert(GetBytes("你好,as"));
      

      请解释什么是事件代理

      事件代理(Event Delegation),又称之为事件委托。是 JavaScript 中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是 DOM 元素的事件冒泡。使用事件代理的好处是可以提高性能

      attribute 和 property 的区别是什么?

      • attribute 是 dom 元素在文档中作为 html 标签拥有的属性;
      • property 就是 dom 元素在 js 中作为对象拥有的属性。
      • 对于 html 的标准属性来说,attribute 和 property 是同步的,是会自动更新的
      • 但是对于自定义的属性来说,他们是不同步的

      页面编码和被请求的资源编码如果不一致如何处理?

      • 后端响应头设置 charset
      • 前端页面<meta>设置 charset

      <script> 放在 </body> 之前和之后有什么区别?浏览器会如何解析它们?

      按照 HTML 标准,在结束后出现<script>或任何元素的开始标签,都是解析错误
      虽然不符合 HTML 标准,但浏览器会自动容错,使实际效果与写在</body>之前没有区别
      浏览器的容错机制会忽略<script>之前的,视作<script>仍在 body 体内。省略</body></html>闭合标签符合 HTML 标准,服务器可以利用这一标准

      <script> 放在 </head> 中会有什么问题?

      在浏览器渲染页面之前,它需要通过解析HTML标记然后构建DOM树。在这个过程中,如果解析器遇到了一个脚本(script),它就会停下来,并且执行这个脚本,然后才会继续解析HTML。如果遇到了一个引用外部资源的脚本(script),它就必须停下来等待这个脚本资源的下载,而这个行为会导致一个或者多个的网络往返,并且会延迟页面的首次渲染时间。

      还有一点是需要我们注意的,那就是外部引入的脚本(script)会阻塞浏览器的并行下载,HTTP/1.1规范表明,浏览器在每个主机下并行下载的组件不超过两个(也就是说,浏览器一次只能够同时从同一个服务器加载两个脚本);如果你网站的图片是通过多个服务器提供的,那么按道理来说,你的网站可以一次并行下载多张图片。但是,当我们网站在加载脚本的时候;浏览器不会再启动任何其它的下载,即使这些组件来自不同的服务器。

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

      • 设置<script>属性 async=“async” (一旦脚本可用,则会异步执行)
      • 动态创建 script DOM:document.createElement(‘script’);
      • XmlHttpRequest 脚本注入
      • 异步加载库 LABjs
      • 模块加载器 Sea.js

      JavaScript 中,调用函数有哪几种方式?

      • 方法调用模式 Foo.foo(arg1, arg2);
      • 函数调用模式 foo(arg1, arg2);
      • 构造器调用模式 (new Foo())(arg1, arg2);
      • call/applay 调用模式 Foo.foo.call(that, arg1, arg2);
      • bind 调用模式 Foo.foo.bind(that)(arg1, arg2)();

      简单实现 Function.bind 函数?

        if (!Function.prototype.bind) {
          Function.prototype.bind = function(that) {
            var func = this, args = arguments;
            return function() {
              return func.apply(that, Array.prototype.slice.call(args, 1));
            }
          }
        }
        // 只支持 bind 阶段的默认参数:
        func.bind(that, arg1, arg2)();
      
        // 不支持以下调用阶段传入的参数:
        func.bind(that)(arg1, arg2);
      

      列举一下 JavaScript 数组和对象有哪些原生方法

      • 数组:
        • arr.concat(arr1, arr2, arrn);
        • arr.join(",");
        • arr.sort(func);
        • arr.pop();
        • arr.push(e1, e2, en);
        • arr.shift();
        • unshift(e1, e2, en);
        • arr.reverse();
        • arr.slice(start, end);
        • arr.splice(index, count, e1, e2, en);
        • arr.indexOf(el);
        • arr.includes(el); // ES6
      • 对象:
        • object.hasOwnProperty(prop);
        • object.propertyIsEnumerable(prop);
        • object.valueOf();
        • object.toString();
        • object.toLocaleString();
        • Class.prototype.isPropertyOf(object);

      Array.slice() 与 Array.splice() 的区别?

      • slice – “读取”数组指定的元素,不会对原数组进行修改

        • 语法:arr.slice(start, end)
        • start 指定选取开始位置(含)
        • end 指定选取结束位置(不含)
      • splice

        • “操作”数组指定的元素,会修改原数组,返回被删除的元素
        • 语法:arr.splice(index, count, [insert Elements])
        • index 是操作的起始位置
        • count = 0 插入元素,count > 0 删除元素
        • [insert Elements] 向数组新插入的元素

      JavaScript 对象生命周期的理解?

      • 当创建一个对象时,JavaScript 会自动为该对象分配适当的内存
      • 垃圾回收器定期扫描对象,并计算引用了该对象的其他对象的数量
      • 如果被引用数量为 0,或惟一引用是循环的,那么该对象的内存即可回收

      哪些操作会造成内存泄漏?

      • JavaScript 内存泄露指对象在不需要使用它时仍然存在,导致占用的内存不能使用或回收
      • 未使用 var 声明的全局变量
      • 闭包函数(Closures)
      • 循环引用(两个对象相互引用)
      • 控制台日志(console.log)
      • 移除存在绑定事件的 DOM 元素(IE)

      在 javascript 中,1 与 Number(1)有什么区别 [易混淆]

      var a = Number(1) // 1
      var b = new Number(1)  // Number {[[PrimitiveValue]]: 1}
      typeof (a) // number
      typeof (b) // object
      a == b // true
      
      • var a = 1 是一个常量,而 Number(1)是一个函数
      • new Number(1)返回的是一个对象
      • a==b 为 true 是因为所以在求值过程中,总是会强制转为原始数据类型而非对象,例如下面的代码:
      typeof 123 // "number"
      typeof new Number(123) // "object"
      123 instanceof Number // false
      (new Number(123)) instanceof Number // true
      123 === new Number(123) // false
      

      参考地址:面试题:在 javascript 中,1 与 Number(1)有什么区别

      console.log(!!(new Boolean(false))输出什么 [易混淆]

      true

      布尔的包装对象 Boolean 的对象实例,对象只有在 null 与 undefined 时,才会认定为布尔的 false 值,布尔包装对象本身是个对象,对象->布尔 都是 true,所以 new Boolean(false)其实是布尔的 true,看下面这段代码:

      if(new Boolean(false)){
          alert('true!!');
      }
      

      只有使用了 valueOf 后才是真正的转换布尔值,与上面包装对象与原始资料转换说明的相同:

      !!(new Boolean(false))  //true
      (new Boolean(false)).valueOf() //false
      

      为什么 JS 是单线程,而不是多线程 [常考]

      • 单线程是指 JavaScript 在执行的时候,有且只有一个主线程来处理所有的任务。
      • 目的是为了实现与浏览器交互。
      • 我们设想一下,如果 JavaScript 是多线程的,现在我们在浏览器中同时操作一个 DOM,一个线程要求浏览器在这个 DOM 中添加节点,而另一个线程却要求浏览器删掉这个 DOM 节点,那这个时候浏览器就会很郁闷,他不知道应该以哪个线程为准。所以为了避免此类现象的发生,降低复杂度,JavaScript 选择只用一个主线程来执行代码,以此来保证程序执行的一致性。

      浏览器中的 Event Loop

      浏览器中的Eventloop

      • 主线程运行的时候会生成堆(heap)和栈(stack);
      • js 从上到下解析方法,将其中的同步任务按照执行顺序排列到执行栈中;
      • 当程序调用外部的 API 时,比如 ajax、setTimeout 等,会将此类异步任务挂起,继续执行执行栈中的任务,等异步任务返回结果后,再按照执行顺序排列到事件队列中;
      • 主线程先将执行栈中的同步任务清空,然后检查事件队列中是否有任务,如果有,就将第一个事件对应的回调推到执行栈中执行,若在执行过程中遇到异步任务,则继续将这个异步任务排列到事件队列中。
      • 主线程每次将执行栈清空后,就去事件队列中检查是否有任务,如果有,就每次取出一个推到执行栈中执行,这个过程是循环往复的… …,这个过程被称为“Event Loop 事件循环”

      参考地址:Event Loop 这个循环你晓得么?(附 GIF 详解)-饿了么前端

      展开全文
    22. TensorFlow入门

      千次阅读 多人点赞 2019-04-23 10:09:29
      TensorFlow入门 参考资料: TensorFlow中文社区教程 TENSORFLOW从入门到精通之——TENSORFLOW基本操作 TensorFlow升级到1.0版本的问题 Tensorflow save&restore遇到问题及解决应对 NotFoundError: Key Variable...

      TensorFlow入门

      参考资料:

      说明:以下代码示例基于Python3.7和TensorFlow1.13.1

      简介

      TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。

      什么是数据流图(Data Flow Graph)?

      数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点”一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。

      为什么Tensorflow要使用图模型?图模型有什么优势呢?

      首先,图模型的最大好处是节约系统开销,提高资源的利用率,可以更加高效的进行运算。因为我们在图的执行阶段,只需要运行我们需要的op,这样就大大的提高了资源的利用率;其次,这种结构有利于我们提取中间某些节点的结果,方便以后利用中间的节点去进行其它运算;还有就是这种结构对分布式运算更加友好,运算的过程可以分配给多个CPU或是GPU同时进行,提高运算效率;最后,因为图模型把运算分解成了很多个子环节,所以这种结构也让我们的求导变得更加方便。

      在Anaconda中查找tensorflow,勾选安装即可安装TensorFlow成功。

      基本用法

      使用 TensorFlow, 你必须明白 TensorFlow:

      • 使用图 (graph) 来表示计算任务.
      • 在被称之为 会话 (Session) 的上下文 (context) 中执行图.
      • 使用 tensor 表示数据.
      • 通过 变量 (Variable) 维护状态.
      • 使用 feed 和 fetch 可以为任意的操作(arbitrary operation)赋值或者从其中获取数据.

      综述

      TensorFlow 是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor, 执行计算, 产生 0 个或多个 Tensor. 每个 Tensor 是一个类型化的多维数组. 例如,你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels].

      一个 TensorFlow 图_描述_了计算的过程. 为了进行计算, 图必须在 会话 里被启动.
      会话 将图的 op 分发到诸如 CPU 或 GPU 之类的 设备 上, 同时提供执行 op 的方法.
      这些方法执行后, 将产生的 tensor 返回. 在 Python 语言中, 返回的 tensor 是
      numpy ndarray 对象.

      CPU和GPU之间的区别是什么?

      CPU和GPU是嵌入式和电子系统的基本设备,但它们都可以用于不同的目的。CPU是用于根据操作(例如算术,逻辑,控制和输入 - 输出)执行程序给出的指令的微处理器。相反,GPU最初被设计为在计算机游戏中渲染图像。CPU强调低延迟,而在GPU中,重要性是高吞吐量。

      比较的项目CPUGPU
      代表中央处理器图形处理单元
      专注于低延迟高吞吐量
      擅长处理串行指令处理并行指令
      包含更少的强大核心很多较弱的核心
      特征无序和推测执行的控制逻辑。架构可以容忍内存延迟
      速度有效可以高于CPU的
      内存消耗

      CPU的定义

      **CPU(中央处理器)**是一种主要充当每个嵌入式系统的大脑的设备。它由用于临时存储数据和执行计算的ALU(算术逻辑单元)和执行指令排序和分支的CU(控制单元)组成。它还与计算机的其他单元(例如存储器,输入和输出)交互,用于执行来自存储器的指令,这是接口也是CPU的关键部分的原因。I / O接口有时包含在控制单元中。

      它提供地址、数据和控制信号,同时接收在系统总线的帮助下处理的指令、数据、状态信号和中断。系统总线是一组各种总线,例如地址、控制和数据总线。与GPU不同,CPU为快速缓存分配更多硬件单元,而计算则分配的少。

      GPU的定义

      **GPU(图形处理单元)**是专门用于计算图形显示设计的处理器。它通常与CPU结合用于与CPU共享RAM,这对于大多数计算任务都是有益的。它是高端图形密集处理所必需的。独立GPU单元包含自己的RAM,称为VRAM,用于视频RAM。先进的GPU系统与多核CPU协同工作。起初,图形单元是由英特尔和IBM在20世纪80年代引入的。这些卡具有简单的功能,如区域填充,简单图像的更改,形状绘制等。

      现代图形能够执行研究和分析任务,由于其极端的并行处理,通常超过CPU。在GPU中,几个处理单元被剥离在一起,其中不存在高速缓存一致性。

      计算图

      TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op 的执行步骤被描述成一个图. 在执行阶段, 使用会话执行图中的 op.

      例如, 通常在构建阶段创建一个图来表示和训练神经网络, 然后在执行阶段反复执行图中的训练 op.

      TensorFlow 支持 C, C++, Python 编程语言. 目前, TensorFlow 的 Python库更加易用, 它提供了大量的辅助函数来简化构建图的工作, 这些函数尚未被 C 和 C++ 库支持.

      三种语言的会话库 (session libraries) 是一致的.

      构建图

      构建图的第一步, 是创建源 op (source op). 源 op 不需要任何输入, 例如 常量 (Constant). 源 op 的输出被传递给其它 op 做运算.

      Python 库中, op 构造器的返回值代表被构造出的 op 的输出, 这些返回值可以传递给其它 op 构造器作为输入.

      TensorFlow Python 库有一个_默认图 (default graph)_, op 构造器可以为其增加节点. 这个默认图对许多程序来说已经足够用了.

      import tensorflow as tf
      
      # 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点
      # 加到默认图中.
      #
      # 构造器的返回值代表该常量 op 的返回值.
      matrix1 = tf.constant([[3., 3.]])
      
      # 创建另外一个常量 op, 产生一个 2x1 矩阵.
      matrix2 = tf.constant([[2.],[2.]])
      
      # 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
      # 返回值 'product' 代表矩阵乘法的结果.
      product = tf.matmul(matrix1, matrix2)
      

      默认图现在有三个节点, 两个 constant() op, 和一个matmul() op. 为了真正进行矩阵相乘运算, 并得到矩阵乘法的结果, 你必须在会话里启动这个图.

      在一个会话中启动图

      构造阶段完成后, 才能启动图. 启动图的第一步是创建一个 Session 对象, 如果无任何创建参数, 会话构造器将启动默认图.

      # 启动默认图.
      sess = tf.Session()
      
      # 调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数. 
      # 上面提到, 'product' 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回
      # 矩阵乘法 op 的输出.
      #
      # 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的.
      # 
      # 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.
      #
      # 返回值 'result' 是一个 numpy `ndarray` 对象.
      result = sess.run(product)
      print(result)
      # ==> [[ 12.]]
      
      # 任务完成, 关闭会话.
      sess.close()
      

      Session 对象在使用完后需要关闭以释放资源. 除了显式调用 close 外, 也可以使用 “with” 代码块来自动完成关闭动作.

      with tf.Session() as sess:
        result = sess.run([product])
        print result
      

      在实现上, TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU或 GPU). 一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测. 如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作.如果你的系统里有多个 GPU, 那么 ID 最小的 GPU 会默认使用。

      指定设备

      如果你想要手动指派设备, 你可以用 with tf.device 创建一个设备环境, 这个环境下的 operation 都统一运行在环境指定的设备上.

      # 新建一个graph.
      with tf.device('/cpu:0'):
        a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
        b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
      c = tf.matmul(a, b)
      # 新建session with log_device_placement并设置为True.
      sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True))
      # 运行这个op.
      print sess.run(c)
      

      如果你指定的设备不存在, 你会收到 InvalidArgumentError 错误提示。为了避免出现你指定的设备不存在这种情况, 你可以在创建的 session 里把参数 allow_soft_placement 设置为 True, 这样 tensorFlow 会自动选择一个存在并且支持的设备来运行 operation.

      Tensor

      TensorFlow 程序使用 tensor 数据结构来代表所有的数据, 计算图中, 操作间传递的数据都是 tensor.

      你可以把 TensorFlow tensor 看作是一个 n 维的数组或列表. 其中零维张量表示的是一个标量,也就是一个数;一维张量表示的是一个向量,也可以看作是一个一维数组;二维张量表示的是一个矩阵;同理,N维张量也就是N维矩阵。

      # 导入tensorflow模块
      import tensorflow as tf
      
      a = tf.constant([[2.0, 3.0]], name = "a")
      b = tf.constant([[1.0], [4.0]], name = "b")
      result = tf.matmul(a, b, name = "mul")
      print(result)
      
      # 输出
      # Tensor("mul_3:0", shape=(1, 1), dtype=float32)
      

      上述程序的输出结果表明:构建图的运算过程输出的结果是一个Tensor,且其主要由三个属性构成:Name、Shape和Type。Name代表的是张量的名字,也是张量的唯一标识符,我们可以在每个op上添加name属性来对节点进行命名,Name的值表示的是该张量来自于第几个输出结果(编号从0开始),上例中的“mul_3:0”说明是第一个结果的输出。Shape代表的是张量的维度,上例中shape的输出结果(1,1)说明该张量result是一个二维数组,且每个维度数组的长度是1。最后一个属性表示的是张量的类型,每个张量都会有唯一的类型,常见的张量类型如下图所示。

      常用的张量类型

      我们需要注意的是要保证参与运算的张量类型相一致,否则会出现类型不匹配的错误。如下面程序所示,当参与运算的张量类型不同时,Tensorflow会报类型不匹配的错误:

      import tensorflow as tf
      m1 = tf.constant([5, 1])
      m2 = tf.constant([2.0, 4.0])
      result = tf.add(m1, m2)
      
      TypeError: Input 'y' of 'Add' Op has type float32 that does not match type int32 of argument 'x'.
      

      正如程序的报错所示:m1是int32的数据类型,而m2是float32的数据类型,两者的数据类型不匹配,所以发生了错误。所以我们在实际编程时,一定注意参与运算的张量数据类型要相同。

      变量

      变量Variables维护图执行过程中的状态信息.

      下面的例子演示了如何使用变量实现一个简单的计数器.

      # 创建一个变量, 初始化为标量 0.
      state = tf.Variable(0, name="counter")
      
      # 创建一个 op, 其作用是使 state 增加 1
      one = tf.constant(1)
      new_value = tf.add(state, one)
      update = tf.assign(state, new_value)
      
      # 启动图后, 变量必须先经过`初始化` (init) op 初始化,
      # 首先必须增加一个`初始化` op 到图中.
      init_op = tf.global_variables_initializer()
      
      # 启动图, 运行 op
      with tf.Session() as sess:
        # 运行 'init' op
        sess.run(init_op)
        # 打印 'state' 的初始值
        print(sess.run(state))
        # 运行 op, 更新 'state', 并打印 'state'
        for _ in range(3):
          sess.run(update)
          print(sess.run(state))
      
      # 输出:
      
      # 0
      # 1
      # 2
      # 3
      

      代码中 assign() 操作是图所描绘的表达式的一部分, 正如 add() 操作一样. 所以在调用 run() 执行表达式之前, 它并不会真正执行赋值操作.

      通常会将一个统计模型中的参数表示为一组变量. 例如, 你可以将一个神经网络的权重作为某个变量存储在一个 tensor 中. 在训练过程中, 通过重复运行训练图, 更新这个 tensor.

      变量的初始化

      当我们完成了变量的创建,接下来,我们要对变量进行初始化。变量在使用前一定要进行初始化,且变量的初始化必须在模型的其它操作运行之前完成。通常,变量的初始化有三种方式,如下所示:

      # 创建两个变量, 初始化为标量 0.
      W = tf.Variable(0, name="W")
      b = tf.Variable(0, name="b")
      
      # 初始化全部变量
      init = tf.global_variables_initializer()
      with tf.Session() as sess:
        sess.run(init)
      
      # 初始化变量的子集
      init_subset = tf.variables_initializer([W, b], name = "init_subset")
      with tf.Session() as sess:
        sess.run(init_subset)
      
      # 初始化单个变量
      init_var = tf.Variable(tf.zeros([2,5]))
      with tf.Session() as sess:
        sess.run(init_var.initializer)
      

      上述程序说明了初始化变量的三种方式:初始化全部变量、初始化变量的子集以及初始化单个变量。首先,global_variables_initializer()方法是不管全局有多少个变量,全部进行初始化,是最简单也是最常用的一种方式;variables_initializer()是初始化变量的子集,相比于全部初始化化的方式更加节约内存;Variable()是初始化单个变量,函数的参数便是要初始化的变量内容。通过上述的三种方式,我们便可以实现变量的初始化,放心的使用变量了。

      但有时一个变量的初始化依赖于其他变量的初始化,为了确保初始化顺序不会错,可以使用initialized_value()来获取初始化变量的值。你应该使用tf.Variable.initialized_value()而不是变量本身来初始化另一个变量,其值取决于此变量的值。

      # Initialize 'v' with a random tensor.
      v = tf.Variable(tf.truncated_normal([10, 40]))
      # Use `initialized_value` to guarantee that `v` has been
      # initialized before its value is used to initialize `w`.
      # The random values are picked only once.
      w = tf.Variable(v.initialized_value() * 2.0)
      

      变量的保存和恢复

      我们经常在训练模型后,希望保存训练的结果,以便下次再使用或是方便日后查看,这时就用到了Tensorflow变量的保存。变量的保存是通过tf.train.Saver()方法创建一个Saver管理器,来保存计算图模型中的所有变量。具体代码如下:

      var1 = tf.Variable([1,3], name="v1")
      var2 = tf.Variable([2,4], name="v2")
      # 初始化全部变量
      init = tf.global_variables_initializer()
      # 调用Saver()存储器方法
      saver = tf.train.Saver()
      # 启动图
      with tf.Session() as sess:
        sess.run(init)
        # 设置存储路径
        save_path = saver.save(sess, "test/save.ckpt")  
      

      我们要注意,我们的存储文件save.ckpt是一个二进制文件,Saver存储器提供了向该二进制文件保存变量和恢复变量的方法。保存变量的方法就是程序中的save()方法,保存的内容是从变量名到tensor值的映射关系。完成该存储操作后,会在对应目录下生成如下图所示的文件:

      保存变量生成的相应文件

      Saver提供了一个内置的计数器自动为checkpoint文件编号。这就支持训练模型在任意步骤多次保存。此外,还可以通过global_step参数自行对保存文件进行编号,例如:global_step=2,则保存变量的文件夹为model.ckpt-2。

      那如何才能恢复变量呢?首先,我们要知道一定要用和保存变量相同的Saver对象来恢复变量。其次,不需要事先对变量进行初始化。具体代码如下所示:

      # 保存后模型恢复出来用于测试报错:NotFoundError: Key Variable_1 not found in checkpoint
      # 原因:如果模型训练完保存后直接加载,相当于变量在前后定义了两次,
      # 第一次创建的变量name="v1",加载时创建的变量虽然name="v1",
      # 但是实际上name会变成"v1_1"(v1_n-1),
      # 我们在保存的checkpoint中搜索的就是v1_n-1,因为搜索不到所以会报错,提示
      # Key v1_1 not found in checkpoint
      # 解决方法:
      # (1)保存模型后,restart kernel后,再加载测试,就不会出错。
      # (2)在加载过程中,定义 name 相同的变量前面加 tf.reset_default_graph() 
      # 清除默认图的堆栈,并设置全局图为默认图;
      
      # 清除默认图的堆栈
      tf.reset_default_graph() 
      
      var1 = tf.Variable([0,0], name="v1")
      var2 = tf.Variable([0,0], name="v2")
      # 调用Saver()存储器方法
      saver = tf.train.Saver()
      # 读取checkpoint文件
      module_file = tf.train.latest_checkpoint("test/")
      print(module_file)
      # 启动图
      with tf.Session() as sess:
        saver.restore(sess, module_file)
        # 打印变量的值
        # evel()方法用于在session中计算并返回变量的值, 不传参数的话,则使用的是默认的session  
        print(var1.eval())
        print(var2.eval())
      
      # 输出
      # test/save.ckpt
      # INFO:tensorflow:Restoring parameters from test/save.ckpt
      # [1 3]
      # [2 4]  
      

      本程序示例中,我们要注意:变量的获取是通过restore()方法,该方法有两个参数,分别是session和获取变量文件的位置。我们还可以通过latest_checkpoint()方法,获取到该目录下最近一次保存的模型。

      变量作用域

      在深度学习中,你可能需要用到大量的变量集,而且这些变量集可能在多处都要用到。例如,训练模型时,训练参数如权重(weights)、偏置(biases)等已经定下来,要拿到验证集去验证,我们自然希望这些参数是同一组。以往写简单的程序,可能使用全局限量就可以了,但在深度学习中,这显然是不行的,一方面不便管理,另外这样一来代码的封装性受到极大影响。因此,TensorFlow提供了一种变量管理方法:变量作用域机制,以此解决上面出现的问题。

      变量作用域机制在TensorFlow中主要由两部分组成:

      • tf.get_variable(<name>, <shape>, <initializer>):
        通过所给的名字创建或是返回一个变量.
      • tf.variable_scope(<scope_name>): 通过 tf.get_variable()为变量名指定命名空间.

      方法 tf.get_variable() 用来获取或创建一个变量,而不是直接调用tf.Variable.它采用的不是像tf.Variable这样直接获取值来初始化的方法.它的特殊之处在于,他还会搜索是否有同名的变量。一个初始化就是一个方法,创建其形状并且为这个形状提供一个张量.这里有一些在TensorFlow中使用的初始化变量:

      • tf.constant_initializer(value) 初始化一切所提供的值,
      • tf.random_uniform_initializer(a, b)从a到b均匀初始化,
      • tf.random_normal_initializer(mean, stddev) 用所给平均值和标准差初始化均匀分布.

      创建变量作用域用法如下:

      with tf.variable_scope("foo"):
          with tf.variable_scope("bar"):
              v = tf.get_variable("v", [1])
              assert v.name == "foo/bar/v:0"
      

      方法tf.variable_scope(scope_name),它会管理在名为scope_name的域(scope)下传递给tf.get_variable的所有变量名(组成了一个变量空间),根据规则确定这些变量是否进行复用。这个方法最重要的参数是reuse,有None,tf.AUTO_REUSE与True三个选项。具体用法如下:

      1. reuse的默认选项是None,此时会继承父scope的reuse标志。

      2. 自动复用(设置reuse为tf.AUTO_REUSE),如果变量存在则复用,不存在则创建。这是最安全的用法,在使用新推出的EagerMode时reuse将被强制为tf.AUTO_REUSE选项。用法如下:

        def foo():
          with tf.variable_scope("foo", reuse=tf.AUTO_REUSE):
            v = tf.get_variable("v", [1])
          return v
        
        v1 = foo()  # Creates v.
        v2 = foo()  # Gets the same, existing v.
        assert v1 == v2
        
      3. 复用(设置reuse=True):

        with tf.variable_scope("foo"):
          v = tf.get_variable("v", [1])
        with tf.variable_scope("foo", reuse=True):
          v1 = tf.get_variable("v", [1])
        assert v1 == v
        
      4. 捕获某一域并设置复用(scope.reuse_variables()):

        with tf.variable_scope("foo") as scope:
          v = tf.get_variable("v", [1])
          scope.reuse_variables()
          v1 = tf.get_variable("v", [1])
        assert v1 == v
        

        1)非复用的scope下再次定义已存在的变量;或2)定义了复用但无法找到已定义的变量,TensorFlow都会抛出错误,具体如下:

        with tf.variable_scope("foo"):
            v = tf.get_variable("v", [1])
            v1 = tf.get_variable("v", [1])
            #  Raises ValueError("... v already exists ...").
        
        with tf.variable_scope("foo", reuse=True):
            v = tf.get_variable("v", [1])
            #  Raises ValueError("... v does not exists ...").
        

      Fetch

      为了取回操作的输出内容, 可以在使用 Session 对象的 run() 调用 执行图时, 传入一些 tensor, 这些 tensor 会帮助你取回结果. 在之前的例子里, 我们只取回了单个节点 state, 但是你也可以取回多个tensor:

      input1 = tf.constant(3.0)
      input2 = tf.constant(2.0)
      input3 = tf.constant(5.0)
      intermed = tf.add(input2, input3)
      mul = tf.multiply(input1, intermed)
      
      with tf.Session() as sess:
        result = sess.run([mul, intermed])
        print(result)
      
      # 输出:
      # [21.0, 7.0]
      

      需要获取的多个 tensor 值,在 op 的一次运行中一起获得(而不是逐个去获取 tensor)。

      Feed

      上述示例在计算图中引入了 tensor, 以常量或变量的形式存储. TensorFlow 还提供了 feed 机制, 该机制可以临时替代图中的任意操作中的 tensor, 可以对图中任何操作提交补丁, 直接插入一个 tensor.

      feed 使用一个 tensor 值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run() 调用的参数.

      feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 “feed” 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符.

      placeholder是一个数据初始化的容器,它与变量最大的不同在于placeholder定义的是一个模板,这样我们就可以session运行阶段,利用feed_dict的字典结构给placeholder填充具体的内容,而无需每次都提前定义好变量的值,大大提高了代码的利用率。

      input1 = tf.placeholder(tf.float32)
      input2 = tf.placeholder(tf.float32)
      output = tf.multiply(input1, input2)
      
      with tf.Session() as sess:
        print(sess.run([output], feed_dict={input1:[7.], input2:[2.]}))
      
      # 输出:
      # [array([ 14.], dtype=float32)]
      

      如果没有正确提供 feed, placeholder() 操作将会产生错误.

      TensorBoard

      1. Tensorboard简介

      对大部分人而言,深度神经网络就像一个黑盒子,其内部的组织、结构、以及其训练过程很难理清楚,这给深度神经网络原理的理解和工程化带来了很大的挑战。为了解决这个问题,tensorboard应运而生。Tensorboard是tensorflow内置的一个可视化工具,它通过将tensorflow程序输出的日志文件的信息可视化使得tensorflow程序的理解、调试和优化更加简单高效。Tensorboard的可视化依赖于tensorflow程序运行输出的日志文件,因而tensorboard和tensorflow程序在不同的进程中运行。

      那如何启动tensorboard呢?下面代码定义了一个简单的用于实现向量加法的计算图。

      import tensorflow as tf  
      # 定义一个计算图,实现两个向量的减法操作  
      # 定义两个输入,a为常量,b为变量  
      a=tf.constant([10.0, 20.0, 40.0], name='a')  
      b=tf.Variable(tf.random_uniform([3]), name='b')  
      output=tf.add_n([a,b], name='add')  
      # 生成一个具有写权限的日志文件操作对象,将当前命名空间的计算图写进日志中  
      writer=tf.summary.FileWriter('/path/to/logs', tf.get_default_graph())  
      writer.close()
      

      在上面程序的8、9行中,创建一个writer,将tensorboard summary写入文件夹/path/to/logs,然后运行上面的程序,在程序定义的日志文件夹/path/to/logs目录下,生成了一个新的日志文件events.out.tfevents.1524711020.bdi-172,如下图1所示。当然,这里的日志文件夹也可以由读者自行指定,但是要确保文件夹存在。如果使用的tensorboard版本比较低,那么直接运行上面的代码可能会报错,此时,可以尝试将第8行代码改为file_writer=tf.train.SummaryWriter(‘/path/to/logs’, sess.graph)

      图1 日志目录下生成的events文件路径

      接着运行如图2所示命令tensorboard --logdir /path/to/logs来启动服务。

      图2 linux下启动tensorboard服务的命令

      注意,当系统报错,找不到tensorboard命令时,则需要使用绝对路径调用tensorboard,例如下面的命令形式:

      python tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory

      图3 tensorflow向量相加程序的计算图的可视化结果

      启动tensorboard服务后,在本地浏览器中输入http://188.88.88.88:6006,会看到如上图3所示的界面。注意,由于本节程序是在Linux服务器上运行的,所以需要输入该服务器完整的IP地址(http://188.88.88.88:6006指本实验所使用的服务器IP地址,实际操作时需要修改成实际使用的服务器IP),若tensorflow程序是在本机上运行,则需将上述IP地址http://188.88.88.88:6006替换成localhost。

      根据上述内容描述,tensorboard的启动过程可以概括为以下几步:

      1.创建writer,写日志文件
      writer=tf.summary.FileWriter('/path/to/logs', tf.get_default_graph())
      2.保存日志文件
      writer.close()
      3.运行可视化命令,启动服务
      tensorboard --logdir /path/to/logs

      4.打开可视化界面

      通过浏览器打开服务器访问端口http://xxx.xxx.xxx.xxx:6006

      注意:tensorboard兼容Google浏览器或Firefox浏览器,对其他浏览器的兼容性较差,可能会提示bug或出现其他性能上的问题。

      图4 tensorboard各栏目的默认界面

      在这里使用tensorboard1.13.1,较以往版本有很多不同。首先从界面上,此版本的tensorboard导航栏中只显示有内容的栏目,如GRAPHS,其他没有相关数据的子栏目都隐藏在INACTIVE栏目中,点击这些子栏目则会显示一条如图4所示的提示信息,指示使用者如何序列化相关数据。除此之外,在栏目的数量上也有增加,新增了DISTRIBUTIONS、PROJECTOR、TEXT、PR CURVES、PROFILE五个栏目。

      Tensorboard的可视化功能很丰富。SCALARS栏目展示各标量在训练过程中的变化趋势,如accuracy、cross entropy、learning_rate、网络各层的bias和weights等标量。如果输入数据中存在图片、视频,那么在IMAGES栏目和AUDIO栏目下可以看到对应格式的输入数据。在GRAPHS栏目中可以看到整个模型计算图结构。在HISTOGRAM栏目中可以看到各变量(如:activations、gradients,weights 等变量)随着训练轮数的数值分布,横轴上越靠前就是越新的轮数的结果。DISTRIBUTIONS和HISTOGRAM是两种不同形式的直方图,通过这些直方图可以看到数据整体的状况。PROJECTOR栏目中默认使用PCA分析方法,将高维数据投影到3D空间,从而显示数据之间的关系。

      2. Tensorflow数据流图

      从tensorboard中我们可以获取更多,远远不止图3所展示的。这一小节将从计算图结构和结点信息两方面详细介绍如何理解tensorboard中的计算图,以及从计算图中我们能获取哪些信息。

      2.1 Tensorflow的计算图结构

      如上图3展示的是一个简单的计算图,图结构中主要包含了以下几种元素:

      : Namespace,表示命名空间

      :OpNode,操作结点

      :Constant,常量

      :Dataflow edge,数据流向边,显示两个操作之间的tensor流程

      :Control dependency edge,控制依赖边

      :Reference edge,参考边

      除此之外,还有Unconnected series、Connected series、Summary等元素。

      断线节点序列
      :彼此之间不连接的有限个节点序列。这个结构上的简化法叫做序列折叠(series collapsing)。 序列基序(Sequential motifs)是拥有相同结构并且其名称结尾的数字不同的节点,它们被折叠进一个单独的节点块(stack)中。对长序列网络来说,序列折叠极大地简化了视图,对于已层叠的节点,双击会展开序列。

      相连节点序列
      :彼此之间相连的有限个节点序列

      摘要节点:摘要节点

      引用边:引用边,表示出度操作节点可以使入度tensor发生变化。

      这些元素构成的计算图能够让我们对输入数据的流向,各个操作之间的关系等有一个清晰的认识。

      图5 初始的计算图结构

      如上图5,是一个简单的两层全连接神经网络的计算图。仅仅从图5,我们很难快速了解该神经网络的主体数据流关系,因为太多的细节信息堆积在了一起。这还只是一个两层的简单神经网络,如果是多层的深度神经网络,其标量的声明,常量、变量的初始化都会产生新的计算结点,这么多的结点在一个页面上,那其对应的计算图的复杂性,排列的混乱性难以想象。所以我们需要对计算图进行整理,避免主要的计算节点淹没在大量的信息量较小的节点中,让我们能够更好的快速抓住主要信息。通过定义子命名空间,可以达到整理节点、让可视化效果更加清晰的目的。

      图6 整理后的计算图结构

      如上图6,就是通过定义子命名空间整理结点后的效果。该计算图只显示了最顶层的各命名空间之间的数据流关系,其细节信息被隐藏起来了,这样便于把握主要信息。

      图7为加入子命名空间后的部分代码截图。代码中,将输入数据都放在了input命名空间中,还使用了perdition、moving_averages、loss、train等命名空间去整理对应的操作过程。

      图7 用命名空间整理计算图的代码截图

      图8 手动将节点从主图中移除

      除此之外,我们还可以通过手动将不重要的节点从主图中移除来简化计算图,如上图8,右键点击想要移除的节点,会出现“Remove from main graph”按钮,点击该按钮,就可以移除对应节点了。

      2.2 结点的信息

      Tensorboard除了可以展示整体的计算图结构之外,还可以展示很多细节信息,如结点的基本信息、运行时间、运行时消耗的内存、各结点的运行设备(GPU或者CPU)等。

      2.2.1 基本信息

      前面的部分介绍了如何将计算图的细节信息隐藏起来,但是有的时候,我们需要查看部分重要命名空间下的节点信息,那这些细节信息如何查看呢?对于节点信息,双击图8中的任意一个命名空间,就会展开对应命名空间的细节图(再次双击就可以收起细节图)。

      图9 展开input命名空间节点信息图

      上图9是input命名空间的展开图,展开图中包含了两个操作节点(x_input和y_input)。除了了解具体包含的操作节点以及其他元素外,我们还可以获取粒度更小的信息。

      图10 input命名空间的放大的细节图

      图11 命名空间的节点信息

      图12 计算节点的基本信息

      上图10所示为图9中input命名空间展开图的放大图。观察图10,我们可以了解到输入数据x、y的维度,图中x的向量维度为784维,y为10维,?表示样本数量。本节演示中使用的是mnist数据集,mnist数据集是一个针对图片的10分类任务,输入向量维度是784,这说明可以通过计算图上这些信息,来校验输入数据是否正确。通过左键单击命名空间或者操作节点,屏幕的右上角会显示对应的具体信息。

      如上图11中,右上角绿色框标注的部分为命名空间layer2的具体信息。如上图12中,右上角绿色框标注的部分为节点x_input的具体信息。

      2.2.2 其他信息

      除了节点的基本信息之外,tensorboard还可以展示每个节点运行时消耗的时间、空间、运行的机器(GPU或者CPU)等信息。本小节将详细讲解如何使用tensorboard展示这些信息。这些信息有助于快速获取时间、空间复杂度较大的节点,从而指导后面的程序优化。

      将2.1节中图7所展示的代码的session部分改成如下所示的程序,就可以将程序运行过程中不同迭代轮数中tensorflow各节点消耗的时间和空间等信息写入日志文件中,然后通过读取日志文件将这些信息用tensorboard展示出来。

      #创建writer对象  
      writer=tf.summary.FileWriter("/path/to/metadata_logs",tf.get_default_graph())  
      with tf.Session() as sess:  
          tf.global_variables_initializer().run()  
          for i in range(TRAINING_STEPS):  
              x_batch, y_batch=mnist.train.next_batch(BATCH_SIZE)  
              if i%1000==0:  
                  #这里通过trace_level参数配置运行时需要记录的信息,  
                  # tf.RunOptions.FULL_TRACE代表所有的信息  
                  run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)  
                  #运行时记录运行信息的proto,pb是用来序列化数据的  
                  run_metadata = tf.RunMetadata()  
                  #将配置信息和记录运行信息的proto传入运行的过程,从而记录运行时每一个节点的时间、空间开销信息  
                  _, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x: x_batch, y_: y_batch}, options=run_options, run_metadata=run_metadata)  
                  #将节点在运行时的信息写入日志文件  
                  writer.add_run_metadata(run_metadata, 'step %03d' % i)  
              else:  
                  _, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x: xs, y_: ys})  
          writer.close()
      

      运行上面的程序,生成日志文件存储在/path/to/metadata_logs/目录下,启动tensorboard服务,读取日志文件信息,将每一个节点在不同迭代轮数消耗的时间、空间等信息展示出来。

      图13 选择迭代轮数对应记录页面

      如上图13所示,在浏览器中打开可视化界面,进入GRAPHS子栏目,点击Session runs选框,会出现一个下拉菜单,这个菜单中展示了所有日志文件中记录的运行数据所对应的迭代轮数。任意选择一个迭代轮数,页面右边的区域会显示对应的运行数据。

      图14 第9000轮迭代时不同计算节点消耗时间的可视化效果图

      图15 第9000轮迭代时不同计算节点占有存储的可视化效果图

      如上图14所示,选择了第9000轮的运行数据,然后选择Color栏目下的Compute time选项,GRAPHS栏目下就会显示tensorflow程序每个计算节点的运行时间。图中使用颜色的深浅来表示运行时间的长短,颜色深浅对应的具体运行时间可以从页面左侧的颜色条看出。由图14可知,train命名空间运行时所消耗的时间最长,Variable命名空间所消耗的时间比较短,无色表示不消耗时间。

      如上图15展示了tensorflow各个节点所占用的空间大小。与衡量运行时所消耗的时间方法类似,使用颜色的深浅来标识所占用内存的大小。颜色条上的数字说明,占用的最大空间为677MB,最小空间为0B。train命名空间占用的存储空间最大。

      除了时间和空间指标,tensorboard还可以展示各节点的运行设备(GPU还是CPU)、XLA Cluster、TPU Compatibility等,这些全部都在Color栏目下作为选项供选择。这些指标都是将节点染色,通过不同颜色以及颜色深浅来标识结果的。如下图16,是TPU Compatibility展示图。

      图16 第9000轮迭代时不同计算节点的TPU Compatibility效果展示图

      3. Tensorflow监控指标可视化

      除了GRAPHS栏目外,tensorboard还有IMAGES、AUDIO、SCALARS、HISTOGRAMS、DISTRIBUTIONS、FROJECTOR、TEXT、PR CURVES、PROFILE九个栏目,本小节将详细介绍这些子栏目各自的特点和用法。

      3.1 IMAGES

      图像仪表盘,可以显示通过tf.summary.image()函数来保存的png图片文件。

      # 指定图片的数据源为输入数据x,展示的相对位置为[-1,28,28,1]
      image_shape=tf.reshape(x, [-1, 28, 28,1])  
      # 将input命名空间下的图片放到summary中,一次展示10张  
      tf.summary.image('input', image_shape, 10) 
      

      如上面代码,将输入数据中的png图片放到summary中,准备后面写入日志文件。运行程序,生成日志文件,然后在tensorboard的IMAGES栏目下就会出现如下图17所示的内容(实验用的是mnist数据集)。仪表盘设置为每行对应不同的标签,每列对应一个运行。图像仪表盘仅支持png图片格式,可以使用它将自定义生成的可视化图像(例如matplotlib散点图)嵌入到tensorboard中。该仪表盘始终显示每个标签的最新图像。

      图17 tensorboard中的IMAGES栏目内容展开界面

      3.2 AUDIO

      音频仪表盘,可嵌入音频的小部件,用于播放通过tf.summary.audio()函数保存的音频。

      tf.summary.audio('audio', audio, sampling_frequency)
      

      audio是一个三维或者二维tensor,含义是[音频数, 每个音频的帧数, 每个音频的通道数]或者[音频数, 每个音频的帧数]。

      sampling_frequency是音频的采样率。

      仪表盘设置为每行对应不同的标签,每列对应一个运行。该仪表盘始终嵌入每个标签的最新音频。

      3.3 SCALARS

      Tensorboard 的标量仪表盘,统计tensorflow中的标量(如:学习率、模型的总损失)随着迭代轮数的变化情况。如下图18所示,SCALARS栏目显示通过函数tf.summary.scalar()记录的数据的变化趋势。如下所示代码可添加到程序中,用于记录学习率的变化情况。

      # 在learning_rate附近添加,用于记录learning_rate  
      tf.summary.scalar('learning_rate', learning_rate)  
      

      Scalars栏目能进行的交互操作有:

      • 点击每个图表左下角的蓝色小图标将展开图表
      • 拖动图表上的矩形区域将放大
      • 双击图表将缩小
      • 鼠标悬停在图表上会产生十字线,数据值记录在左侧的运行选择器中。

      图18 tensorboard中的SCALARS栏目内容展开界面

      此外,读者可通过在仪表盘左侧的输入框中,编写正则表达式来创建新文件夹,从而组织标签。

      3.4 HISTOGRAMS

      Tensorboard的张量仪表盘,统计tensorflow中的张量随着迭代轮数的变化情况。它用于展示通过tf.summary.histogram记录的数据的变化趋势。如下代码所示:

      tf.summary.histogram(weights, 'weights')

      上述代码将神经网络中某一层的权重weight加入到日志文件中,运行程序生成日志后,启动tensorboard就可以在HISTOGRAMS栏目下看到对应的展开图像,如下图19所示。每个图表显示数据的时间“切片”,其中每个切片是给定步骤处张量的直方图。它依据的是最古老的时间步原理,当前最近的时间步在最前面。通过将直方图模式从“偏移”更改为“叠加”,如果是透视图就将其旋转,以便每个直方图切片都呈现为一条相互重叠的线。

      图19 tensorboard中的HISTOGRAMS栏目内容展开界面

      3.5 DISTRIBUTIONS

      Tensorboard的张量仪表盘,相较于HISTOGRAMS,用另一种直方图展示从tf.summary.histogram()函数记录的数据的规律。它显示了一些分发的高级统计信息。

      如下图20所示,图表上的每条线表示数据分布的百分位数,例如,底线显示最小值随时间的变化趋势,中间的线显示中值变化的方式。从上至下看时,各行具有以下含义:[最大值,93%,84%,69%,50%,31%,16%,7%,最小值]。这些百分位数也可以看作标准偏差的正态分布:[最大值,μ+1.5σ,μ+σ,μ+0.5σ,μ,μ-0.5σ,μ-σ,μ-1.5σ,最小值],使得从内侧读到外侧的着色区域分别具有宽度[σ,2σ,3σ]。

      图20 tensorboard中的DISTRIBUTIONS栏目内容展开界面

      3.6 PROJECTOR

      嵌入式投影仪表盘,全称Embedding Projector,是一个交互式的可视化工具,通过数据可视化来分析高维数据。例如,读者可在模型运行过程中,将高维向量输入,通过embedding projector投影到3D空间,即可查看该高维向量的形式,并执行相关的校验操作。Embedding projector的建立主要分为以下几个步骤:

      1)建立embedding tensor

      #1. 建立 embeddings  
      embedding_var = tf.Variable(batch_xs, name="mnist_embedding")  
      summary_writer = tf.summary.FileWriter(LOG_DIR) 
      

      2)建立embedding projector 并配置

      config = projector.ProjectorConfig()  
      embedding = config.embeddings.add()  
      embedding.tensor_name = embedding_var.name  
      embedding.metadata_path = path_for_mnist_metadata   #'metadata.tsv'  
      embedding.sprite.image_path = path_for_mnist_sprites  #'mnistdigits.png'  
      embedding.sprite.single_image_dim.extend([28,28])  
      projector.visualize_embeddings(summary_writer, config)
      

      3)将高维变量保存到日志目录下的checkpoint文件中

      sess = tf.InteractiveSession()  
      sess.run(tf.global_variables_initializer())  
      saver = tf.train.Saver()  
      saver.save(sess, os.path.join(LOG_DIR, "model.ckpt"), 1) 
      

      4)将metadata与embedding联系起来,将 vector 转换为 images,反转灰度,创建并保存 sprite image

      to_visualise = batch_xs  
      to_visualise = vector_to_matrix_mnist(to_visualise)  
      to_visualise = invert_grayscale(to_visualise)  
      sprite_image = create_sprite_image(to_visualise)  
      plt.imsave(path_for_mnist_sprites,sprite_image,cmap='gray') 
      

      5)运行程序,生成日志文件,启动服务,tensorboard中的PROJECTOR栏将展示投影后的数据的动态图,如下图21所示。

      图21 tensorboard中的PROJECTOR栏目内容展开界面

      Embedding Projector从模型运行过程中保存的checkpoint文件中读取数据,默认使用主成分分析法(PCA)将高维数据投影到3D空间中,也可以设置选择另外一种投影方法,T-SNE。除此之外,也可以使用其他元数据进行配置,如词汇文件或sprite图片。

      3.7 TEXT

      文本仪表盘,显示通过tf.summary.text()函数保存的文本片段,包括超链接、列表和表格在内的Markdown功能均支持。

      3.8 PR CURVES

      PR CURVES仪表盘显示的是随时间变化的PR曲线,其中precision为横坐标,recall为纵坐标。如下代码创建了一个用于记录PR曲线的summary。

      # labels为输入的y, predition为预测的y值  
      # num_thresholds为多分类的类别数量  
      tensorboard.summary.pr_curve(name='foo',  
                           predictions=predictions,  
                           labels=labels,  
                           num_thresholds=11)  
      

      图22 tensorboard中的PR CURVES栏目内容展开界面

      上图22为tensorboard上PR CURVES栏目在有内容时的首页,没有内容时就隐藏在INACTIVE栏目下。

      训练模型时,经常需要在查准率和查全率之间权衡,PR曲线能够帮助我们找到这个权衡点。每条曲线都对应一个二分类问题,所以,针对多分类问题,每一个类都会生成一条对应的PR曲线。

      3.9 PROFILE

      Tensorboard的配置文件仪表盘,该仪表盘上包含了一套TPU工具,可以帮助我们了解,调试,优化tensorflow程序,使其在TPU上更好的运行。

      但并不是所有人都可以使用该仪表盘,只有在Google Cloud TPU上有访问权限的人才能使用配置文件仪表盘上的工具。而且,该仪表盘与其他仪表盘一样,都需要在模型运行时捕获相关变量的跟踪信息,存入日志,方可用于展示。

      在PROFILE仪表盘的首页上,显示的是程序在TPU上运行的工作负载性能,它主要分为五个部分:Performance Summary、Step-time Graph、Top 10 Tensorflow operations executed on TPU、Run Environment和Recommendation for Next Step。如下图23所示:

      图23 tensorboard中的PROFILE栏目内容展开界面

      其中,Performance Summary包括以下四项:

      1)所有采样步骤的平均步长时间

      2)主机空闲时间百分比

      3)TPU空闲时间百分比

      4)TPU矩阵单元的利用率

      Run Environment(运行环境)包括以下五方面:

      1)使用的主机数量

      2)使用的TPU类型

      3)TPU内核的数量

      4)训练批次的大小(batch size)

      5)作业信息(构建命令和运行命令)

      4. 总结

      本节主要介绍了tensorflow中一个非常重要的工具——tensorboard。Tensorboard是一个可视化工具,它能够以直方图、折线图等形式展示程序运行过程中各标量、张量随迭代轮数的变化趋势,它也可以显示高维度的向量、文本、图片和音频等形式的输入数据,用于对输入数据的校验。Tensorflow函数与tensorboard栏目的对应关系如下表所示。

      Tensorboard栏目tensorflow日志生成函数内容
      GRAPHS默认保存显示tensorflow计算图
      SCALARStf.summary.scalar显示tensorflow中的张量随迭代轮数的变化趋势
      DISTRIBUTIONStf.summary.histogram显示tensorflow中张量的直方图
      HISTOGRAMStf.summary.histogram显示tensorflow中张量的直方图(以另一种方式)
      IMAGEStf.summary.image显示tensorflow中使用的图片
      AUDIOtf.summary.audio显示tensorflow中使用的音频
      TEXTtf.summary.text显示tensor flow中使用的文本
      PROJECTOR通过读取checkpoint文件可视化高维数据

      Tensorboard的可视化功能对于tensorflow程序的训练非常重要,使用tensorboard进行调参主要分为以下几步:

      1)校验输入数据

      如果输入数据的格式是图片、音频、文本的话,可以校验一下格式是否正确。如果是处理好的低维向量的话,就不需要通过tensorboard校验。

      2)查看graph结构

      查看各个节点之间的数据流关系是否正确,再查看各个节点所消耗的时间和空间,分析程序优化的瓶颈。

      3)查看各变量的变化趋势

      在SCALAR、HISTOGRAMS、DISTRIBUTIONS等栏目下查看accuracy、weights、biases等变量的变化趋势,分析模型的性能

      4)修改code

      根据3)和4)的分析结果,优化代码。

      5)选择最优模型

      6)用Embedding Projector进一步查看error出处

      Tensorboard虽然只是tensorflow的一个附加工具,但熟练掌握tensorboard的使用,对每一个需要对tensorflow程序调优的人都非常重要,它可以显著提高调参工作的效率,帮助我们更快速地找到最优模型。

      读取数据

      1. tensorflow 的数据读取机制

      以图像数据为例,数据读取过程如下所示:

      假设我们的硬盘中有一个图片数据集0001.jpg,0002.jpg,0003.jpg……我们只需要把它们读取到内存中,然后提供给GPU或是CPU进行计算就可以了。这听起来很容易,但事实远没有那么简单。事实上,我们必须要把数据先读入后才能进行计算,假设读入用时0.1s,计算用时0.9s,那么就意味着每过1s,GPU都会有0.1s无事可做,这就大大降低了运算的效率。

      如何解决这个问题?方法就是将读入数据和计算分别放在两个线程中,将数据读入内存的一个队列,如下图所示:

      读取线程源源不断地将文件系统中的图片读入到内存队列中,而负责计算的是另一个线程,计算需要数据时,直接从内存队列中取就可以了。这样就可以解决GPU因为IO而空闲的问题!

      而在tensorflow中,为了方便管理,在内存队列前又添加了一层所谓的**“文件名队列”**。

      为什么要添加这一层文件名队列?首先得了解机器学习中的一个概念:epoch(迭代)。对于一个数据集来讲,运行一个epoch就是将这个数据集中的图片全部计算一遍。如一个数据集中有三张图片A.jpg、B.jpg、C.jpg,那么跑一个epoch就是指对A、B、C三张图片都计算了一遍。两个epoch就是指先对A、B、C各计算一遍,然后再全部计算一遍,也就是说每张图片都计算了两遍。

      tensorflow使用文件名队列+内存队列双队列的形式读入文件,可以很好地管理epoch。下面用图片的形式来说明这个机制的运行方式。还是以数据集A.jpg, B.jpg, C.jpg为例,假定我们要跑一个epoch,那么就在文件名队列中把A、B、C各放入一次,并在之后标注队列结束,如下图。

      程序运行后,内存队列首先读入A(此时A从文件名队列中出队),然后再读取B和C。

      此时,如果再尝试读入,系统由于检测到了“结束”,就会自动抛出一个异常(OutOfRange)。外部捕捉到这个异常后就可以结束程序了。这就是tensorflow中读取数据的基本机制。如果我们要跑2个epoch而不是1个epoch,那只要在文件名队列中将A、B、C依次放入两次再标记结束就可以了。

      2. TensorFlow数据读取机制对应的函数

      如何在TensorFlow中创建这两个内存?

      • 创建文件名队列 - tf.train.string_input_producer 阻塞态 + tf.train.start_queue_runners 激活态

      把输入的数据按照要求排序成一个队列。最常见的是把一堆文件名整理成一个队列。如下操作:

      filenames = [os.path.join(data_dir,'data_batch%d.bin' % i ) for i in xrange(1,6)]
      filename_queue = tf.train.string_input_producer(filenames)
      

      tf.train.string_input_producer有两个重要的参数,一个是num_epochs,它就是上文中提到的epoch数。另一个是shuffle,shuffle是指在epoch内文件顺序是否被打乱。若设置shuffle=False,如下图,每个epoch内,数据还是按照A、B、C的顺序进入文件名队列,这个顺序不会改变。如果设置shuffle=True,那么在epoch内,数据的前后顺序就会被打乱,具体如下图所示。

      **其实,仅仅应用tf.train.string_input_producer构建的文件名队列是处于阻塞态的,并没有真正的将文件名读入到相应的文件名队列内存中,如下左图所示。为了完成在文件名队列内存中构建文件名队列(也就是我们说的读入数据),我们还需要tf.train.start_queue_runners进行启动,**如下右图所示

      我们通常也把tf.train.start_queue_runners叫做‘入栈线程启动器’,使用tf.train.start_queue_runners之后,才会真正启动填充队列的线程,这时系统就不再“阻塞”。此后计算单元就可以拿到数据并进行计算,整个程序也就跑起来了。

      • 创建数据内存序列

      在tensorflow中,数据内存队列不需要自己建立,我们只需要使用reader对象从文件名队列中读取数据就可以了。所以TensorFlow高效读取数据机制中,最重要的是完成文件名队列的设计。

      3. 为什么要使用TFRecords来进行文件的读写?

      在tensorflow中数据的传入方式主要包含以下几种:

      • 供给数据(feed): 在tensorflow程序运行的每一步, 让Python代码来供给数据。
      • 从文件读取数据: 在tensorflow graph的起始, 让一个输入pipeline从文件中读取数据。
      • 预加载数据: 在tensorflow graph中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况)。

      当我们遇到数据集比较大的情况时,第一种和最后一种方法会极其占内存,效率很差。那么为什么使用TFRecords会比较快?在于其使用二进制存储文件,也就是将数据存储在一个内存块中,相比其它文件格式要快很多,特别是如果你使用hdd(Hard Disk Drive)而不是ssd(Solid State Disk),因为它涉及移动磁盘阅读器头并且需要相当长的时间。总体而言,通过使用二进制文件,可以更轻松地分发数据,使数据更好地对齐,以实现高效的读取。

      整个过程分两部分,一是使用tf.train.Example协议流将文件保存成TFRecords格式的.tfrecords文件,这里主要涉及到使用tf.python_io.TFRecordWriter(“train.tfrecords”)tf.train.Example以及tf.train.Features三个函数,第一个是生成需要对应格式的文件,后面两个函数主要是将我们要传入的数据按照一定的格式进行规范化。

      另一部分就是在训练模型时将我们生成的.tfrecords文件读入并传到模型中进行使用。这部分主要涉及到使用tf.TFRecordReader(“train.tfrecords”)tf.parse_single_example两个函数。第一个函数是将我们的二进制文件读入,第二个则是进行解析然后得到我们想要的数据。

      #### 生成train.tfrecords文件 ####
      import os
      import tensorflow as tf 
      from PIL import Image
       
      cwd = os.getcwd()
       
      ''' 数据目录
      -- img1.jpg
           img2.jpg
           img3.jpg
           ...
      -- img1.jpg
           img2.jpg
           ...
      -- ...
      '''
      writer = tf.python_io.TFRecordWriter("train.tfrecords") # 定义train.tfrecords文件
      for index, name in enumerate(classes): # 遍历每一个文件夹
          class_path = cwd + name + "/"      # 每一个文件夹的路径
          for img_name in os.listdir(class_path):  # 遍历每个文件夹中所有的图像
              img_path = class_path + img_name  # 每一张图像的路径
              img = Image.open(img_path)    # 打开图像
              img = img.resize((224, 224))  # 图像裁剪
              img_raw = img.tobytes()       # 将图像转化为bytes
       
              # 调用Example 和 Feature函数将数据格式化保存起来
              # 注意:Features 传入参数为一个字典,方便后续读取数据时的操作
              example = tf.train.Example(features=tf.train.Features(feature={
                  "label": tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),
                  'img_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw]))
              }))
              #序列化为字符串,并写入数据
              writer.write(example.SerializeToString())  
      writer.close()
      

      基本的,一个Example中包含Features,Features里包含Feature(这里没s)的字典。最后,Feature里包含有一个 FloatList,或者ByteList,或者Int64List

      就这样,我们把相关的信息都存到了一个文件中,不用单独的label文件,读取也很方便。

      # 从tfrecords文件中读取记录的迭代器
      for serialized_example in tf.python_io.tf_record_iterator("train.tfrecords"):
          example = tf.train.Example()
          example.ParseFromString(serialized_example)
       
          image = example.features.feature['image'].bytes_list.value
          label = example.features.feature['label'].int64_list.value
          # 可以做一些预处理之类的
          print(image, label)
      

      4. 使用队列读取tfrecords数据

      从TFRecords文件中读取数据, 首先需要用tf.train.string_input_producer生成一个解析队列。之后调用tf.TFRecordReader的tf.parse_single_example解析器。其原理如下图:

      解析器首先读取解析队列,返回serialized_example对象,之后调用tf.parse_single_example操作将Example协议缓冲区(protocol buffer)解析为张量。

      def read_and_decode(filename):
          # 根据文件名生成文件名队列
          filename_queue = tf.train.string_input_producer([filename])
          # 定义reader
          reader = tf.TFRecordReader()
          # 返回文件名和文件
          _, serialized_example = reader.read(filename_queue) 
          # 将协议缓冲区Protocol Buffer解析为张量tensor
          # 注意到:我们写文件就是采用了字典的方式进行存储的,所以解析的时候依然用字典进行数据提取
          features = tf.parse_single_example(serialized_example,
                                             features={
                                                 'label': tf.FixedLenFeature([], tf.int64),
                                                 'img_raw' : tf.FixedLenFeature([], tf.string),
                                             })
          # 将编码为字符串的变量重新变回来,因为写进tfrecord里用to_bytes的形式,也就是字符串
          img = tf.decode_raw(features['img_raw'], tf.uint8)
          # 检查张量形状是否对齐
          img = tf.reshape(img, [224, 224, 3])
          # 图像数据格式化为tf.float32
          img = tf.cast(img, tf.float32) * (1. / 255) - 0.5
          # 标签数据格式化为tf.int32
          label = tf.cast(features['label'], tf.int32)
       
          return img, label
      

      之后,在训练模型过程中,我们就会很方便用这些数据了,例如:

      
      # 解析tfrecords文件的数据
      img, label = read_and_decode("train.tfrecords")
       
      # 通过随机打乱张量的顺序创建batch
      # capacity = ( min_after_dequeue + (num_threads + aSmallSafetyMargin * batch_size) )
      img_batch, label_batch = tf.train.shuffle_batch(
                                 [img, label],  # 入队的张量列表
                                 batch_size=30, # 进行一次批处理的tensor数
                                 capacity=2000, # 队列中最大的元素数
                                 min_after_dequeue=1000,# 一次出列操作完成后,队列中元素的最小数量
                                 num_threads=4  #使用多个线程在tensor_list中读取文件
                                 )
      init = tf.global_variables_initializer()
       
      with tf.Session() as sess:
          sess.run(init)
          # 队列-入栈线程启动器
          threads = tf.train.start_queue_runners(sess=sess)
          for i in range(3):
              val, loss= sess.run([img_batch, label_batch])
      

      三个要点作为总结:

      • tensorflow里的graph能够记住状态,这使得TFRecordReader能够记住tfrecord的位置,并且始终能返回下一个。而这就要求我们在使用之前,必须初始化整个graph,这里使用了函数tf.global_variables_initializer()来进行初始化
      • tensorflow中的队列和普通的队列差不多,不过它里面的operation和tensor都是符号型的,在调用sess.run()时才执行
      • TFRecordReader会一直弹出队列中文件的名字,直到队列为空

      线程和队列

      在使用TensorFlow进行异步计算时,队列是一种强大的机制。

      正如TensorFlow中的其他组件一样,队列就是TensorFlow图中的节点。这是一种有状态的节点,就像变量一样:其他节点可以修改它的内容。具体来说,其他节点可以把新元素插入到队列后端(rear),也可以把队列前端(front)的元素删除。

      为了感受一下队列,让我们来看一个简单的例子。我们先创建一个“先入先出”的队列(FIFOQueue),并将其内部所有元素初始化为零。然后,我们构建一个TensorFlow图,它从队列前端取走一个元素,加上1之后,放回队列的后端。慢慢地,队列的元素的值就会增加。

      EnqueueEnqueueManyDequeue都是特殊的节点。他们需要获取队列指针,而非普通的值,如此才能修改队列内容。我们建议您将它们看作队列的方法。事实上,在Python API中,它们就是队列对象的方法(例如q.enqueue(...))。

      队列使用概述

      队列,如FIFOQueueRandomShuffleQueue,在TensorFlow的张量异步计算时都非常重要。

      例如,一个典型的输入结构:是使用一个RandomShuffleQueue来作为模型训练的输入:

      • 多个线程准备训练样本,并且把这些样本推入队列。
      • 一个训练线程执行一个训练操作,此操作会从队列中移除最小批次的样本(mini-batches)。

      TensorFlow的Session对象是可以支持多线程的,因此多个线程可以很方便地使用同一个会话(Session)并且并行地执行操作。然而,在Python程序实现这样的并行运算却并不容易。所有线程都必须能被同步终止,异常必须能被正确捕获并报告,回话终止的时候, 队列必须能被正确地关闭。

      所幸TensorFlow提供了两个类来帮助多线程的实现:tf.Coordinator
      tf.QueueRunner。从设计上这两个类必须被一起使用。Coordinator类可以用来同时停止多个工作线程并且向那个在等待所有工作线程终止的程序报告异常。QueueRunner类用来协调多个工作线程同时将多个张量推入同一个队列中。

      创建队列

      操作队列的函数主要有:

      • FIFOQueue():创建一个先入先出(FIFO)的队列

      • RandomShuffleQueue():创建一个随机出队的队列

      • enqueue_many():初始化队列中的元素

      • dequeue():出队

      • enqueue():入队

      1、FIFOQueue

      FIFOQueue是先进先出队列,主要是针对一些序列样本。如:在使用循环神经网络的时候,需要处理语音、文字、视频等序列信息的时候,我们希望处理的时候能够按照顺序进行,这时候就需要使用FIFOQueue队列。

      #先入先出队列,初始化队列,设置队列大小5
      q = tf.FIFOQueue(5,"float")
      #入队操作
      init = q.enqueue_many(([1,2,3,4,5],))
      #定义出队操作
      x = q.dequeue()
      y = x + 1
      #将出队的元素加1,然后再加入到队列中
      q_in = q.enqueue([y])
      #创建会话
      with tf.Session() as sess:
          sess.run(init)
          #执行3次q_in操作
          for i in range(3):
              sess.run(q_in)
          #获取队列的长度
          que_len = sess.run(q.size())
          #将队列中的所有元素执行出队操作
          for i in range(que_len):
              print(sess.run(q.dequeue()))
      

      2、RandomShuffleQueue

      RandomShuffleQueue是随机队列,队列在执行出队操作的时候,是以随机的顺序进行的。随机队列一般应用在我们训练模型的时候,希望可以无序的获取样本来进行训练,如:在训练图像分类模型的时候,需要输入的样本是无序的,就可以利用多线程来读取样本,将样本放到随机队列中,然后再利用主线程每次从随机队列中获取一个batch进行模型的训练。

      #初始化一个随机队列,设置队列大小为10,最小长度为2
      q = tf.RandomShuffleQueue(capacity=10,min_after_dequeue=2,dtypes="float")
      #创建会话
      with tf.Session() as sess:
          #定义10次入队操作
          for i in range(10):
              sess.run(q.enqueue(i))
          #定义8次出队操作
          for i in range(8):
              print(sess.run(q.dequeue()))
      

      注意:在使用随机队列的时候,我们设置了队列的容量为10,最小长度为2。当队列的长度已经等于队列的容量(10)再执行入队操作, 或队列的长度已经等于最小长度(2)再执行出队操作时,程序会发生阻断,即程序在执行,但是没有任何输出,如下图:

      定义了10次出队操作,当队列出队8次之后,就被阻断了。我们可以通过设置会话在运行时的等待时间来解除阻断:

      #初始化一个随机队列,设置队列大小为10,最小长度为2
      q = tf.RandomShuffleQueue(capacity=10,min_after_dequeue=2,dtypes="float")
      #创建会话
      with tf.Session() as sess:
          #定义10次入队操作
          for i in range(10):
              sess.run(q.enqueue(i))
          #设置会话运行时等待时间,等待时长为5s
          run_options = tf.RunOptions(timeout_in_ms=5000)
          #定义10次出队操作
          for i in range(10):
              try:
                  #当队列进入阻断之后,超时就抛出异常
                  print(sess.run(q.dequeue(),options=run_options))
              except tf.errors.DeadlineExceededError:
                  print("out of range")
                  #退出循环
                  break
      

      当队列出队第9次的时候,进入阻断状态时,我们可以通过DeadlineExceededError来捕获阻断信息。

      Coordinator

      Coordinator类用来帮助多个线程协同工作,多个线程同步终止。
      其主要方法有:

      • should_stop():如果线程应该停止则返回True。
      • request_stop(<exception>): 请求该线程停止。
      • join(<list of threads>):等待被指定的线程终止。

      首先创建一个Coordinator对象,然后建立一些使用Coordinator对象的线程。这些线程通常一直循环运行,一直到should_stop()返回True时停止。
      任何线程都可以决定计算什么时候应该停止。它只需要调用request_stop(),同时其他线程的should_stop()将会返回True,然后都停下来。

      # 线程体:循环执行,直到`Coordinator`收到了停止请求。
      # 如果某些条件为真,请求`Coordinator`去停止其他线程。
      def MyLoop(coord):
        while not coord.should_stop():
          ...do something...
          if ...some condition...:
            coord.request_stop()
      
      # Main code: create a coordinator.
      coord = Coordinator()
      
      # Create 10 threads that run 'MyLoop()'
      threads = [threading.Thread(target=MyLoop, args=(coord)) for i in xrange(10)]
      
      # Start the threads and wait for all of them to stop.
      for t in threads: t.start()
      coord.join(threads)
      

      QueueRunner

      QueueRunner类会创建一组线程, 这些线程可以重复的执行Enquene操作, 他们使用同一个Coordinator来处理线程同步终止。此外,一个QueueRunner会运行一个_closer thread_,当Coordinator收到异常报告时,这个_closer thread_会自动关闭队列。

      您可以使用一个queue runner,来实现上述结构。
      首先建立一个TensorFlow图表,这个图表使用队列来输入样本。增加处理样本并将样本推入队列中的操作。增加training操作来移除队列中的样本。

      example = ...ops to create one example...
      # Create a queue, and an op that enqueues examples one at a time in the queue.
      queue = tf.RandomShuffleQueue(...)
      enqueue_op = queue.enqueue(example)
      # Create a training graph that starts by dequeuing a batch of examples.
      inputs = queue.dequeue_many(batch_size)
      train_op = ...use 'inputs' to build the training part of the graph...
      

      在Python的训练程序中,创建一个QueueRunner来运行几个线程, 这几个线程处理样本,并且将样本推入队列。创建一个Coordinator,让queue runner使用Coordinator来启动这些线程,创建一个训练的循环, 并且使用Coordinator来控制QueueRunner的线程们的终止。

      # Create a queue runner that will run 4 threads in parallel to enqueue
      # examples.
      qr = tf.train.QueueRunner(queue, [enqueue_op] * 4)
      
      # Launch the graph.
      sess = tf.Session()
      # Create a coordinator, launch the queue runner threads.
      coord = tf.train.Coordinator()
      enqueue_threads = qr.create_threads(sess, coord=coord, start=True)
      # Run the training loop, controlling termination with the coordinator.
      for step in xrange(1000000):
          if coord.should_stop():
              break
          sess.run(train_op)
      # When done, ask the threads to stop.
      coord.request_stop()
      # And wait for them to actually do it.
      coord.join(threads)
      

      异常处理

      通过queue runners启动的线程不仅仅只处理推送样本到队列。他们还捕捉和处理由队列产生的异常,包括OutOfRangeError异常,这个异常是用于报告队列被关闭。
      使用Coordinator的训练程序在主循环中必须同时捕捉和报告异常。
      下面是对上面训练循环的改进版本。

      try:
          for step in xrange(1000000):
              if coord.should_stop():
                  break
              sess.run(train_op)
      except Exception, e:
         # Report exceptions to the coordinator.
         coord.request_stop(e)
      
      # Terminate as usual.  It is innocuous to request stop twice.
      coord.request_stop()
      coord.join(threads)
      
      展开全文
    23. Django框架基础教程(一):简单介绍Python Django框架

      万次阅读 多人点赞 2019-05-22 17:11:28
      response1 += var.name + " " response = response1 return HttpResponse("<p>" + response + "</p>") ③ 更新数据 from django.http import HttpResponse from TestModel.models import Test def ...

      Django框架基础(一):简单介绍Python Django框架,从零开始学Django框架

      1、Django简介

      Python下有多款不同的 Web 框架,Django是最有代表性的一种。许多成功的网站和APP都基于Django。

      Django是一个开源的Web应用框架,例如舆管家数据监测平台由Python写成。

      Django采用了MVC的软件设计模式,即模型M,视图V和控制器C。

      2、Django的特点

      • 1) 强大的数据库功能:用python的类继承,几行代码就可以拥有一个动态的数据库操作API,如果需要也能执行SQL语句。
      • 2) 自带的强大的后台功能:几行代码就让网站拥有一个强大的后台,轻松管理内容。
      • 3) 优雅的网址:用正则匹配网址,传递到对应函数。
      • 4) 模板系统:强大,易扩展的模板系统,设计简易,代码和样式分开设计,更易管理。
      • 5) 缓存系统:与memcached或其它缓存系统联用,表现更出色,加载速度更快。
      • 6) 国际化:完全支持多语言应用,允许你定义翻译的字符,轻松翻译成不同国家的语言。

      3、Django项目目录

      • 1) urls.py:网址入口,关联到对应的views.py中的一个函数(或generic类),访问网址就对应一个函数。
      • 2) views.py:处理用户发出的请求,与urls.py对应, 通过渲染templates中的网页可以将显示内容,如登陆后的用户名,用户请求的数据等输出到网页。
      • 3) models.py:与数据库操作相关,存入或读取数据时用到,用不到数据库时可以不使用。
      • 4) forms.py:表单,用户在浏览器上输入数据提交,对数据的验证工作以及输入框的生成等工作,也可以不使用。
      • 5) templates文件夹:views.py中的函数渲染templates中的html模板,得到动态内容的网页,可以用缓存来提高速度。
      • 6) admin.py:后台,可以用很少的代码就拥有一个强大的后台。
      • 7) settings.py:Django 的配置文件,如 DEBUG 的开关,静态文件的位置等。

      4、Django基本命令

      1) 新建一个项目:

      1. django-admin.py startproject project-name

      在 windows 上如果报错,尝试用 django-admin 代替 django-admin.py 。

      2) 新建一个APP:

      1. python manage.py startapp app-name

      1. django-admin.py startapp app-name

      一般一个项目有多个app, 当然通用的app也可以在多个项目中使用。

      3) 启动服务器:

      1. python manage.py runserver 0.0.0.0:8000

      1. python manage.py runserver

      前者让其它电脑可连接到服务器,监听机器上所有ip的8000端口,访问时用电脑的ip代替 127.0.0.1(8000为端口号,如果不说明,则端口号默认为8000);后者在本电脑访问服务器,访问时ip为127.0.0.1。

      5、视图与网址

      views.py:

      from django.http import HttpResponse 
      def helloWorld(request): 
       return HttpResponse("Hello world! ") 
      

      urls.py:

      from django.conf.urls import url 
      from . import view 
      urlpatterns = [ 
       url(r'^$', view.helloWorld) 
      ] 
      

      启动服务器,并在浏览器访问:127.0.0.1:8000。

      修改后的urls.py:

      from django.conf.urls import url 
      from . import view 
      urlpatterns = [ 
       url(r'^helloWorld$', view.helloWorld) 
      ] 
      

      启动服务器,并在浏览器访问:127.0.0.1:8000/helloWorld。

      url() 函数:可以接收四个参数,分别是两个必选参数regex、view 和两个可选参数kwargs、name:

      ① regex:正则表达式,与之匹配的 URL 会执行对应的第二个参数 view。

      ② view:用于执行与正则表达式匹配的 URL 请求。

      ③ kwargs:视图使用的字典类型的参数。

      ④ name:用来反向获取 URL。

      6、Django模板

      1) 实例:

      ① 在app目录中,创建 templates 目录并建立 helloWorld.html文件:

      1. <h1>{{ helloWorld }}</h1>

      ② 向Django说明模板文件的路径,修改settings.py文件,修改 TEMPLATES 中的 DIRS 为 [BASE_DIR+"/templates",]。

      ③ 修改views.py:

      from django.shortcuts import render 
      def hello(request): 
       context = {} 
       context['helloWorld'] = 'Hello World!' 
       return render(request, 'helloWorld.html', context) 
      

      render使用了一个字典 context 作为参数,context 字典中元素的键值 "helloWorld" 对应了模板中的变量 "{{ helloWorld }}"。

      ④ 启动服务器,并在浏览器访问:127.0.0.1:8000/helloWorld。

      2) Django 模板标签

      ① if/else 标签

      if/else支持嵌套,{% if %} 标签接受and、or 或not关键字来对多个变量做判断,或对变量取反。

      1. {% if condition %}
      2. ...
      3. {% endif %}

      或者:

      1. {% if condition1 %}
      2. ...
      3. {% elif condiiton2 %}
      4. ...
      5. {% else %}
      6. ...
      7. {% endif %}

      ② for 标签

      {% for %} 允许在一个序列上迭代。支持嵌套。每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。

      1. <ul>
      2. {% for person in list %}
      3. <li>{{ person.name }}</li>
      4. {% endfor %}
      5. </ul>

      给标签增加一个 reversed 使得该列表被反向迭代:

      1. {% for person in list %}
      2. ...
      3. {% endfor %}

      ③ ifequal/ifnotequal 标签

      {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签。

      1. {% ifequal person1 person2 %}
      2. <h1>YES</h1>
      3. {% endifequal %}

      ④ 注释标签

      Django 注释使用 {# #}。

      ⑤ 过滤器

      模板过滤器可以在变量被显示前修改它,过滤器使用管道字符:

      {{ name|lower }}大写转换为小写。

      一个过滤器管道的输出又可以作为下一个管道的输入:

      {{ name|first|upper }}将第一个元素转化为大写。

      有些过滤器有参数,过滤器的参数跟随冒号之后并总是以双引号包含:

      {{ name|truncatewords:"3" }}显示变量的前3个词。

      addslashes:添加反斜杠到任何反斜杠、单引号或者双引号前面。

      date:按指定的格式字符串参数格式化date或datetime对象,如{{ pub_date|date:"F j, Y" }}。

      length:返回变量的长度。

      ⑥ include 标签

      {% include %} 标签允许在模板中包含其它的模板的内容。

      1. {% include "test.html" %}

      7、Django模型

      Django 对各种数据库提供了很好的支持,Django 为数据库提供了统一的调用API,软币网小编认为可以根据业务需求选择不同的数据库。

      以MYSQL数据库为例,安装 mysql 驱动的命令:sudo pip install mysqlclient。

      1) 数据库配置

      在项目的settings.py文件中找到 DATABASES 配置项,将其信息修改为:

      DATABASES = { 
       'default': { 
       'ENGINE': 'django.db.backends.mysql', # 或者使用 mysql.connector.django 
       'NAME': 'test', 
       'USER': 'test', 
       'PASSWORD': 'test123', 
       'HOST':'localhost', 
       'PORT':'3306', 
       } 
      } 

      这里添加了中文注释,所以需要在settings.py 文件头部添加 # -*- coding: UTF-8 -*-。

      2) 定义模型

      ① 创建APP:

      Django规定,如果要使用模型,必须要创建一个app,使用以下命令创建一个app:python manage.py startapp TestModel。

      ② 修改 TestModel/models.py 文件:

      from django.db import models 
      class Test(models.Model): 
       name = models.CharField(max_length=20) 

      类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。

      ③ 在settings.py中找到INSTALLED_APPS这一项,添加:'TestModel'。

      ④ 在命令行中运行以下命令,创建数据表,表名为应用名_类名(如:TestModel_test):

      python manage.py migrate # 创建表结构 
      python manage.py makemigrations TestModel # 让Django知道模型有一些变更 
      python manage.py migrate TestModel # 创建表结构 

      3) 数据库操作

      添加database.py文件:

      from django.http import HttpResponse 
      from TestModel.models import Test 
      def database(request): 
       test = Test(name='Alice') 
       test.save() 
       return HttpResponse("<p>数据添加成功!</p>") 

      修改 urls.py:

      from django.conf.urls import * 
      from . import view,database 
      urlpatterns = [ 
       url(r'^hello$', view.hello), 
       url(r'^database$', database.database) 
      ] 

      启动服务器,并在浏览器访问:127.0.0.1:8000/database。

      ① 添加数据

      from django.http import HttpResponse 
      from TestModel.models import Test 
      def database(request): 
       test = Test(name='Alice') 
       test.save() 
       return HttpResponse("<p>数据添加成功!</p>") 

      ② 获取数据

      from django.http import HttpResponse 
      from TestModel.models import Test 
      def database(request): 
       # 初始化 
       response = "" 
       response1 = "" 
       # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM 
       list = Test.objects.all() 
       # filter相当于SQL中的WHERE,可设置条件过滤结果 
       response2 = Test.objects.filter(id=1) 
       # 获取单个对象 
       response3 = Test.objects.get(id=1) 
       # 限制返回的数据,相当于SQL中的OFFSET 0 LIMIT 2; 
       Test.objects.order_by('name')[0:2] 
       # 数据排序 
       Test.objects.order_by("id") 
       # 上面的方法可以连锁使用 
       Test.objects.filter(name="Alice").order_by("id") 
       # 输出所有数据 
       for var in list: 
       response1 += var.name + " " 
       response = response1 
       return HttpResponse("<p>" + response + "</p>") 

      ③ 更新数据

      from django.http import HttpResponse 
      from TestModel.models import Test 
      def database(request): 
       # 修改id=1的name字段再save,相当于SQL中的UPDATE 
       test = Test.objects.get(id=1) 
       test.name='Alice' 
       test.save() 
       # 另一种方式 
       # Test.objects.filter(id=1).update(name='Alice) 
       # 修改所有的列 
       # Test.objects.all()..update(name='Google') 
       return HttpResponse("<p>数据修改成功</p>") 

      ④ 删除数据

      删除数据库中的对象只需调用该对象的delete()方法即可:

      from django.http import HttpResponse 
      from TestModel.models import Test 
      def database(request): 
       # 删除id=1的数据 
       test = Test.objects.get(id=1) 
       test.delete() 
       # 另外一种方式 
       # Test.objects.filter(id=1).delete() 
       # 删除所有数据 
       # Test.objects.all().delete() 
       return HttpResponse("<p>数据删除成功</p>") 

      8、Django表单

      1) Get方法

      ① 创建一个 search.py 文件,用于接收用户的请求:

      from django.http import HttpResponse 
      from django.shortcuts import render_to_response 
      # 表单 
      def search_form(request): 
       return render_to_response('search_form.html') 
       # 接收请求数据 
       def search(request): 
       request.encoding='utf-8' 
       if 'q' in request.GET: 
       message = '搜索的内容为: ' + request.GET['q'].encode('utf-8') 
       else: 
       message = '提交了空表单' 
       return HttpResponse(message) 

      ② 在templates中添加 search_form.html 表单:

      <!DOCTYPE html> 
      <html> 
       <head> 
       <meta charset="utf-8"> 
       <title></title> 
       </head> 
       <body> 
       <form action="/search" method="get"> 
       <input type="text" name="q"> 
       <input type="submit" value="搜索"> 
       </form> 
       </body> 
      </html> 

      ③ 修改urls.py:

      from django.conf.urls import url 
      from . import view,database,search 
      urlpatterns = [ 
       url(r'^helloWorld$', view.helloWorld), 
       url(r'^database$', database.database), 
       url(r'^search-form$', search.search_form), 
       url(r'^search$', search.search) 
      ] 

      ④ 启动服务器,并在浏览器访问:127.0.0.1:8000/search_form。

      2) Post方法

      ① 在templates中添加 post.html 表单:

      <!DOCTYPE html> 
      <html> 
       <head> 
       <meta charset="utf-8"> 
       <title></title> 
       </head> 
       <body> 
       <form action="/search-post" method="post"> 
       {% csrf_token %} 
       <input type="text" name="q"> 
       <input type="submit" value="搜索"> 
       </form> 
       <p>{{ rlt }}</p> 
       </body> 
      </html> 

      {% csrf_token %}标签:csrf 全称是 Cross Site Request Forgery,这是Django提供的防止伪装提交请求的功能。POST 方法提交的表格,必须有此标签。

      ② 新建 search2.py 文件并使用 search_post 函数来处理 POST 请求:

      from django.shortcuts import render 
      from django.views.decorators import csrf 
      # 接收POST请求数据 
      def search_post(request): 
       ctx ={} 
       if request.POST: 
       ctx['rlt'] = request.POST['q'] 
       return render(request, "post.html", ctx) 

      ③ 修改urls.py:

      from django.conf.urls import url 
      from . import view,database,search 
      urlpatterns = [ 
       url(r'^helloWorld$', view.helloWorld), 
       url(r'^database$', database.database), 
       url(r'^search-form$', search.search_form), 
       url(r'^search$', search.search) 
       url(r'^search-post$', search2.search_post) 
      ] 

      ④ 启动服务器,并在浏览器访问:127.0.0.1:8000/search_post。

       

      部分代码贡献来自:www.ruanally.com

      展开全文
    24. jwt

      千次阅读 2019-08-17 22:19:01
      typ跟alg属性的全称其实是type跟algorithm,分别是类型跟算法的意思。之所以都用三个字母来表示,也是基于JWT最终字串大小的考虑, 同时也是跟JWT这个名称保持一致,这样就都是三个字符了…typ跟alg是JWT中标准中...
    25. Linux命令全称(转)

      2018-03-15 19:42:15
      5. /var/log : 各种程序的日志 (log) 文件,尤其是 login (/var/log/wtmplog 纪录所有到系统的登录和注销 ) 和 syslog (/var/log/messages 纪录存储所有核心和系统程序信息 ) 。 /var/log 里的文件经常不确定地增长...
    26. ├── / 根目录 ├── /bin ( binary ) 可执行二进制或脚本 ├── /boot ( boot ) 引导程序文件 ├── /dev ( ... └── /var ( variable ) 变量文件,系统运行期间会改变的文件
    27. 【Linux】Linux基础命令及英文全称

      千次阅读 多人点赞 2019-09-22 22:39:35
      文章目录一、系统启动一般流程1.1 Windows1.2 Linux1.2.1 Linux简单驱动程序矿建二、S3C2440内部资源三、命令入门3.1 终端Teminal3.2 Linux命令提示符3.3 Linux命令的格式3.4 常见命令含义...:常见Linux命令英文全称...
    28. es6

      2019-09-24 13:58:45
      es6 全称 ECMAScript 6.0,是es5 的升级版本,更加强大,以及完善 还有叫法ES2015 es6版本 Es2016 es6.1版本 var、let、const var 具备一个变量提升 可以重复声明 let: 1.不具备变量提升 2.let不可以重复声明 3....
    29. HTML常用标签及其全称

      2019-03-27 10:32:42
      <var>var 可变文本(variable)</var>    常用HTML标签的英文全称及简单描述   HTML标签 英文全称 中文释义 a Anchor ...
    30. 前端面试题一答案

      千次阅读 2019-06-14 17:48:26
      前端面试题 基础部份 ... ... css级联样式表,用于实现网页样式,外观。也就是决定网页内容样式,比如,标题的字体大小,...js全称javascript是一门脚本语言,用于实现网页行为,动作。动态操作DOM节点元素,实现滚动,...
    31. /var Variable 是储存各种变化的文件,比如log等等 /home Home 用户缺省宿主目录 /lost+found Lost And Found 存放一些系统出错的检查结果 /srv Server 服务数据目录 /mnt ...
    32. var a = 3 ; let b = 4 ; const c = 5 ; console . log ( this . a ) ; //3 console . log ( this . b ) ; //undefined console . log ( this . c ) ; //undefined 3.变量的解构...
    33. 集成学习—随机森林原理(理解与论文研读)

      千次阅读 多人点赞 2019-08-21 17:44:40
      ”:“随机”是指数据随机采样以及特征随机采样,主要体现在Bagging,它的全称是Bootstrap aggregation,称为自助法,它是一种有放回的抽样方法。Bagging的每个弱学习器的训练集都是通过随机且有放回采样得到的,...
    34. 在scala 中,定义变量有两种 val 和 var  var 的值可以改变. 代码如下: scala&gt; var o = 100 o: Int = 100 scala&gt; o = 190 o: Int = 190 val 的值不可以改变. 代码如下:(会报错) ​ scala&...
    35. Linux命令简写和全称

      万次阅读 多人点赞 2016-05-01 20:51:45
      5. /var/log : 各种程序的日志 (log) 文件,尤其是 login (/var/log/wtmplog 纪录所有到系统的登录和注销 ) 和 syslog (/var/log/messages 纪录存储所有核心和系统程序信息 ) 。 /var/log 里的文件经常不确定地增长...
    36. HTML标签简写及全称大全

      千次阅读 2018-05-27 16:19:10
      常用HTML标签的英文全称及简单描述HTML标签英文全称中文释义aAnchor锚abbrAbbreviation缩写词acronymAcronym取首字母的缩写词address Address地址altalter替用(一般是图片显示不出的提示)bBold粗体(文本)bdo ...
    37. Linux 命令和参数 英文全称

      千次阅读 多人点赞 2018-06-21 10:39:33
      /var = VARiable 是储存各种变化的文件,比如log等等 alias = Create your own name for a command bash = GNU Bourne-Again Shell linux内核 cat = Concatenate 串联 chown= Change owner 改变所有者 ...
    38. Linux常用命令及其英文全称

      千次阅读 多人点赞 2018-04-01 11:39:25
      locate = locate,查找文件地址,并不查硬盘,而是在/var/lib/slocate/slocate.db中查看,速度快省资源 ls = list,列出文件,-l详细信息,-h合适单位显示,-S大小排序,-t时间排序 lsof = List Open Files,列出...
    39. Linux常用命令英文全称与中文解释 apt: Advanced Packaging Tool 高级包装工具 cp: Copy file 复制文件 cat: Concatenate 串联 cd:Change directory 切换目录 chmod: Change mode 改变模式 chown: ...
    40. ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版,主要是为了解决 ES5 的先天不足 2、let 与 const ES6新增加了两个重要的 JavaScript 关键字: let 和 const let 声明的变量只在 let...
    41. linux命令全称

      千次阅读 2018-11-07 09:46:51
      /var = Variable (变量) FIFO = First In, First Out GRUB = GRand Unified Bootloader IFS= Internal Field Seperators LILO = LInux LOader MySQL = My 是最初作者女儿的名字, SQL = Structured ...
    42. HTML5 标签英文全称及简写

      千次阅读 2018-03-28 16:14:09
      HTML标签英文全称中文释义aAnchor锚abbrAbbreviation缩写词acronymAcronym取首字母的缩写词address Address地址dfn Defines a Definition Term定义定义条目kbd Keyboard键盘(文本)samp Sample示例(文本var ...
    43. CocosCreator开发笔记(8)-读取和解析JSON数据文件

      万次阅读 热门讨论 2018-03-22 21:48:44
      在游戏开发过程中,读取配置文件是必不可少的,而使用JSON做...JSON的英文全称是JavaScript Object Notation,即JavaScript对象表示法。 JSON的特点 1、是一种轻量级的文本数据交换格式,类似XML,但是比XML更...
    44. C# 获取串口全称

      千次阅读 2018-10-21 22:31:33
      var search = new ManagementObjectSearcher(@"SELECT * FROM Win32_PnPEntity WHERE Name LIKE '%COM%'"); ...
    45. Linux缩写的全称

      千次阅读 2014-05-30 13:08:22
      bin = BINaries /dev = DEVices /etc = ETCetera /lib = LIBrary /proc = PROCesses /sbin = Superuser BINaries /tmp = TeMPorary /usr = Unix Shared Resources .../var = VARiable ? FIFO = First In, Firs
    46. iOS11的系统越狱之后,用iFunBox查看手机系统的文件,发现找不到private、var等文件。难道是越了个假狱???后面经过查阅一番资料之后,原来越狱之后还需要装一个afc2的补丁。afc2全称(Apple File Conduit 2)afc2...

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 36,948
    精华内容 14,779
    关键字:

    var全称