精华内容
下载资源
问答
  • 浦发银行 信息科技岗 大数据方向 面经

    万次阅读 多人点赞 2018-08-09 23:00:31
    浦发银行总行信息科技部(大数据方向)面试 浦发银行总行信息科技部(大数据方向)面试 8.6面试 大家的面经 浦发银行总行(上海)大数据岗8月6号面经 一、综合面 二、机试 三、专业面试 浦发面经 即兴演讲 上机...

    浦发银行总行信息科技部(大数据方向)面试

    0绪论

    0.1 面试

    2018.8.6日面试了浦发银行信息科技岗,想写一个面经,发现大家都说的差不多了(面试流程较为固定),所以总结一下大家的面经(主要来自牛客网: https://www.nowcoder.com/search?type=post&query=%E6%B5%A6%E5%8F%91 ),为后来人提供个参考(明年应该变化不大)。

    面试主要分为三个部分:

    1. 即兴演讲(结构化面试 3面试官对6个学生)、
    2. 上机测试、
    3. 专业面试(3对1)。

    这三个顺序不固定,哪里面试官有空位 工作人员就先安排大家面哪一个部分。

    大家应该重点参考一下“结构化面试”的题目,提前排练一下,提前想一下“如果是我来回答这个问题,我该怎么答?” “别人把我想说的都说过了,怎么办?”,提前准备一下“固定套路、万能句式”,毕竟做编程的同学在这方面都不是特别强。(包括我 (┬_┬)

    0.2 招聘时间流程 参考

    • 2019届应届生参加 上海总部信息科技提前批,2018年8月6日面试,
    • 10月16日体检通知,
    • 11月21日背调邮件,
    • 11月30日给的offer邮件.

    浦发比较传统且谨慎,因此求职总流程比较慢,铁心去浦发的童鞋一定注意保留自己的三方,不要提前签了别家; 其他童鞋可以安心去其他公司继续面试, (后来发体检通知的时候, 我都快忘记自己面过浦发)

    1 大家的面经

    1.1 浦发银行总行(上海)大数据岗8月6号面经

    https://www.nowcoder.com/discuss/91911

    我是8月6号12:30的场次,面试的是大数据岗。面试一共三部分:综合面,技术面,机试,不分先后顺序,在2楼大厅等着工作人员叫名字,叫到哪里就去哪里参加面试。

    一、综合面

    综合面也就是群面,六个人一组,一共三个面试官。每个人进去抽题,每组有两道题目,抽到以后两分钟时间阅读材料,阅读完以后每个人三分钟时间阐述自己的观点。我当时抽到的题目是“长租公寓行业是否值得投资”,当时组里还有一道题目是关于“高考选择志愿”

    的问题,因为不是我所抽到的题目,所以没有额外留意。每个人三分钟演讲结束后,面试官会单独问问题,有的面试小组是每个人都被问到了,但我在的小组里我和另外一个男生没有被单独问问题,有可能是我三分钟演讲表现不好或者其他原因。后来面试官最后提了一道抢答题,当时考虑到自己没有被单独问问题,所以就抓紧抢了抢答题,但抢答嘛,没有时间考虑答案,所以回答也不是很好,群面就这样结束了。

    二、机试

    在大厅等候的时候工作人员会给你讲哪些岗位是必须要参加机试的,哪些岗位是不必须参加的但若你选择参加会给加分,所以基本上所有的人都会选择机试。机试题目都很简单一共三道题目:①输入一个数字要求输出该数字各个位上偶数的和,如输入5584,输出12。②输入一组数N和数字b ,求出该组数字中能被b 整除的个数。如输入1 2 3 4 5 6和 2,结果输出为3。③求N阶楼梯共有多少种上楼方式,每次只能上1个或2个台阶。编译环境只有java和c和c++,其他语言写的没办法现场编译,但工作人员说仍然提交,他们后再后台看你写的程序。我是用python写的。

    三、专业面试

    专业面试是让我觉得最无法描述的面试,仍然是工作人员喊到你的名字后去面试的地方等,三个面试官。当时我等的时候我前面有四个人,一个哈工大研究生,一个西安交大研究生,一个武汉大学的,还有一个美国回来的硕士生。工作人员说每个人面试时间10到15分钟,但我前面的几个都基本上15分钟,有的还有20分钟的。当时我在等的时候,他们每出来一个也和交流了一下面试官问了哪些问题,他们说自我介绍,针对自我介绍问了一些项目和算法问题。所以我自认为准备还是不错的。

    等我进去以后,面试官同样让我先自我介绍,我当时介绍了一下我是哪个大学什么专业的硕士,然后介绍了一下我会哪些机器学习算法,python编程,hive环境下sql 脚本开发,讲了一个我用逻辑回归和随机森林做的一个项目,最后讲了一下我上一份互联网公司的实习做的东西,在公司主要负责的事情。

    我觉得我的自我介绍还可以,只要想问应该能挖出来很多技术问题可以问。但面试官没有问我一个技术问题,从头到尾也只有一个面试官在问我,我自我介绍结束以后的问题:①我本科哪个学校的,学的什么专业(我本科普通一本非211),②说我硕士专业是控制,和大数据不对口。我解释了一下,虽然我是控制专业,但我导师是机器学习方向的,所以我做的也都是机器学习方向的东西。③问我不是计算机专业的,是不是对计算机编程的东西都不是很懂?(我当时也是一脸懵逼)我解释了一下说我可能做开发比不过计算机的学生,但我基本的东西都会,包括数据结构,操作系统的话Linux 基本指令都会,只不过编程语言是python不是java或者C++。④问我研一都在干什么?(我回答研一主要是上课和看论文)接着问我上什么课(我回答了模式识别,最优化方法,矩阵理论等)⑤接下来面试官就总结了一下,大概意思就是:我的专业不对口,虽然我说了我这些东西也做了不少实际的项目和事情,但给他们的感觉就是我学的很杂,乱七八糟的,让他们无从下手问我问题,感觉我不太符合大数据岗,还有一个就是他们觉得我会的这些东西都是我自学的,因为我的专业不对口(我也是一脸懵,即使计算机的学生,很多东西也不是老师上课教的呀,都是自己自学)

    总之,技术面就这样结束了,我具体多长时间没看表,但大概七八分钟吧,绝对不到十分钟。回来以后我也在反思技术面哪里出了问题。各种原因吧,肯定有我自身的原因。也有可能我前面都是双985都是很优秀的人,到我这面试官压根不想面我吧,不想深入交流。也有可能面试官对我学历和专业不满意(本科普通一本,硕士上海这边的211)

    总之,感觉找工作很随缘吧,我还幻想如果分到别的技术面小组说不定面试官会问我几个技术问题呢,现在也看开了,反正就水了水浦发,炮灰一把呗。

    1.2 浦发面经

    作者:白夏是小白
    链接:https://www.nowcoder.com/discuss/91866
    来源:牛客网

    我投的是总行信息科技部,面试主要分为三个部分:即兴演讲、上机测试、结构化面试。在武汉面试的,从上午十二点左右到武汉分行,到了下午六点多才走,等待面试等得心急如焚。HR小姐姐们十分贴心了,给又饿又焦急的我们买了面包牛奶,笔芯:)

    即兴演讲

    即兴演讲六个人一组,每个人都有一个序号,然后面试的时候一共有三个面试官。进去之后每个人抽一个题目,两分钟看题三分钟回答。这个回答次序是自定的,虽然说第一个举手回答有一定好处,但是一定要思路想清楚描述想清楚了再回答啊QAQ,大概主要是考察表达能力吧,我抢第一个结果回答得巨烂ORZ
    我的题目是说学校决定把什么校车超市之类的地方交由学生管辖,有人认为这会让学生重商轻学,然后问你的看法。
    六个人都回答完之后面试官会提一个问题让六个人回答,我们的问题是“大学里得分最高的一门课是什么?为什么能拿这么高的分?”,然后再抽几个人问了问题,面试官特地问了我一个“你是本科生?”的问题,觉得本科生仿佛受到歧视。

    上机测试

    上机测试是三道巨简单的题目,大概每一个几行代码吧。
    我的三个题目是:
    字符串反转
    数列求和
    字符串缩写
    (悄咪咪说一句,还可以看到大家的做题状态和排名,而且好像是手改,不是很懂)

    结构化面试

    结构化面试就是正常的面试,大概一个人十分钟左右的样子,人多,面试官少,等得生无可恋。三个面试官对一个人,一个主面试官问一些基础问题,然后旁边两个面试官有针对性的问问题,应该一个是问语言,一个是问数据库。
    一开始先自我介绍,然后开始问专业问题,好像面试官手上有一个记录,问一个问题,你说会他做一个记号,说不会或者停顿沉默一会儿就会划掉下一个问题(时间很紧不能迟疑吖)。
    结构化面试大概是整个面试流程中最体现专业的地方了吧可是我并没有感觉到很专业。我在网申的时候在简历上写了一句觉得银行的工作压力比互联网公司小,然后面试的时候特地问了我一句,“你确定吗”,搞得我很虚,我说我接受不了长期熬夜,总觉得会因为这个被毙掉ORZ

    总结
    整个过程下来,我觉得面试银行本科生毫无竞争力,一片全是研究生大佬;而且银行的面试让人捉摸不定,不知道他们到底想要什么样的人,可能比较需要全方面发展,可是技术的话就比较一言难尽。但是整个过程下来就没什么压力,人比较放松,虽然之后越想越凉凉吧emm
    据说浦发结果短则一个月多则两三个月才出来QAQ可能是并不想招人!

    1.3 浦发银行大数据创新岗上海打卡

    作者:明媚_
    链接:https://www.nowcoder.com/discuss/91675
    来源:牛客网

    面试分为三部分

    第一部分 综合面试

    6-7个人抽材料,阅读两分钟,表述三分钟,目前了解到的题:央行发布撤销某些地区的地铁修建资格,问认为这些地区是否该修建/积极废人/阅读习惯/中国是圆珠笔产量大国,核心技术掌握在别的国家/人工智能对银行的影响/无纸化阅读

    第二部分 专业面试

    首先进行自我介绍,根据自我介绍进行提问,确实重视项目,项目问了很久,别的没怎么问,感觉面试官并不专业。除项目问题,问了为什么这么多银行选择来浦发/你的职业规划/最近浦发上一款新产品你知道吗/对互联网有热情吗

    第三部分 上机考试(只有开发和测试岗需要,别的岗可选)

    我做的是以下三道题(开发语言不限)
    1 N的阶乘
    2 输入十个数,最大数和最后一个数交换,最小树和第一个数交换
    3 猴子吃桃子(经典问题,自行百度)

    求好运,攒人品啦?

    1.4 浦发总行信息岗校招面经(上海)

    作者:疯狂求offer
    链接:https://www.nowcoder.com/discuss/91174
    来源:牛客网

    之前也看了不少牛客上的笔经面经,感觉收获很多,昨天(8.5)面了浦发,趁着还有印象写个面筋回馈牛客,顺便攒攒秋招RP~

    我面的系统开发岗,面试时间是8.5中午12:30,当时提前一个多小时坐地铁过去的。结果从12号线虹梅路下来后导航导偏了,绕着附近的科技园转了一圈,经过好心的保安大叔指点后才知道莲花路1688号在哪儿_(:з」∠)_。浦发漕河泾这边的信息园区不是很大,走进楼里感觉环境挺好的,干净整洁,走廊里铺有地毯很舒服。本来以为会迟到,结果到签到处的时候发现前面好多人……排队都要绕着弯儿,目测下午场有接近100个人。由于是中午,当时我还听见HR小姐姐对上午场的同学们说如果没有面试完可以领饭票去一楼食堂免费吃饭,顿时就还挺有好感的,毕竟能为面试者们着想。在签到处会扫描身份证,拿一张打印有自己名字的纸(当作铭牌用)和一张小纸条。小纸条上写的是面试的三个环节:综合面试、专业面试和上机考试,然后就坐在等候区等待HR小姐姐叫号了。等待过程略去不表。

    专业面

    我首先抽到的是专业面试,大概进行了二十多分钟。有三位面试官,有两个感觉像是管理层,大概五十多岁,还有一个大概三十多岁。首先是自我介绍,表明了一下为什么想去浦发。首先是较年轻的面试官提问,开始问了项目,由于项目是做并行计算的,就让我讲讲设计和实现细节。然后问了数据库,增查删改等SQL命令,还问用过哪些数据库(项目中的),其实我做的项目没用数据库_(:з」∠),就略尴尬,但也如实回答了,为了挽回点气氛我就说了数据库事务的四大特性(ACID)和例子,然后他就接着问原子性的实际应用场景,我再举了个例子但是感觉好像那个面试官不太满意。接着问有没有做过socket之类的网络编程,我说没有……由于项目是在Linux集群下实现的,好像他们不太懂,就解释了一番,感觉他们好像还是没懂(:з」∠),然后就问了Linux下的常用命令。由于我不是计算机专业的,就问我有没有上过数据结构与算法的课,然后问了常用的排序算法以及口述快排的实现思路。接着其中一个面试官就问我本科研究生阶段都上过什么课程,然后问原专业做的挺好的为什么想转行来银行,我就商业互吹了一波。坐中间的那个大佬突然冷不丁说,你导师知道你转行来银行面试吗,导师同意吗。我懵逼了1s后就说导师很好不会限制学生云云,大佬也没继续问。面试官们貌似对做的项目挺感兴趣,又让我讲并行是怎么实现的,有啥优化的地方。最后大佬说有啥想问的,我突然犯二就问您在浦发一天的工作是怎么样的,这时候轮到大佬一愣(:з」∠)……估计他心想这小伙子胆儿够肥啊。然后面试官们就说了一通,听下来了解到他们都是管理层的,大佬惹不起惹不起(:з」∠)_。然后又问我还有啥问题,我说没有了,于是专业面结束。出来的时候看了看表,有二十多分钟,听候场区的几个人说他们都很快就十多分钟,我估计是因为自己非科班的缘故,被抓着一通提问。

    结构化面试

    接着又是漫长的等待,这次我抽到了综合面试(群面)。技术岗还有群面我也是有点懵的,心想待会儿说的时候有条理一些就行。群面形式就是每个人2分钟阅读一份材料,然后3分钟阐述观点。我抽到的是网络成瘾这块儿。思路还是不错的,有条理分点阐述了,但是我以为时间很紧就语速很快地说了,不知道面试官听明白了没有,事后感觉这块儿太可惜了语速应该平稳一点,因为我后面的小伙伴们都是慢悠悠地说完的,面试官也没把他们怎么着_(:з」∠)_。接着就是提问环节,没啥好说的。但是其中一个面试官就点出为啥不穿正装,我就很尴尬(之前是谁说银行技术岗不穿正装也OK的啊喂)……后来解释说得体的衣服就行了,也没说啥。大概三十分钟左右群面就结束了,又回到排队叫号环节。

    上机考试

    上机考试的地方大概有三四十台机子,很多人在做题,做完签字就可以走。不得不吐槽一下那个OJ系统和本地IDE是真的难用,一开始很不顺手。OJ上支持的语言有Java、C、C++,没有的可以用伪代码,后面会人工判题给分。题目很简单有三道题,分段函数实现、两个字符串查重、凯撒密码,分值分别是40,40,20。有一题我在本地调试成功但是在OJ上死活都编译不通过,很迷,但我也索性提交了,一切随缘。这个OJ系统还有调试10s内不能提交这种莫名其妙的设定,搞得现场很多人出错。据说除了大数据岗位其他都需要上机考试,但是我感觉几乎所有都去上机了。上机结束后我就坐地铁回学校了,这一天不知道怎么的肚子很不舒服,体验了好几次浦发的洗手间(还挺干净的,一点异味都没有)(:з」∠)

    整个流程很长,我从12:30一直到17:30左右才结束。总结下来感觉银行类的面试很注重数据库及相关实现,如果有相关经历是最好不过了。

    1.5 【浦发银行】信息科技岗(大数据创新岗)8.6日上海总行面经

    作者:爱吃水果的鱼
    链接:https://www.nowcoder.com/discuss/91147
    来源:牛客网

    楼主是中午12:30场次的,因为从上海其他地方坐地铁到漕河泾开发区地铁站,没有吃中午饭,问了下门卫,说可以在食堂吃,25块钱,可支付宝,酸奶水果饮料3选2,菜任意吃。
    具体请见图片,菜色一般般吧,还稍稍有点贵,不过我觉得他们银行工作人员是有饭补的,哈哈哈
    具体流程如下,面试等候区在2楼,电梯出来右手边可以看到指示牌,往厕所那个方向走,就能看到一堆人,先排队,打印自己的名牌,然后等。等着被叫去上机考试(c/c++,JAVA可以测试运行,提交的步骤为提交—>可以本地复制代码---->最下方测试运行----->提交,可以看到自己的代码是否正确),综合面试,专业面试,三者顺序不一定按照所说顺序,哪里有空就把你安排到哪里。
    面试时间大部分都在等候,做完机试在等候区等候,专业面试完去等候区等候,综合面试完就可以走了,很奇怪的是我的专业面试只有5分钟左右,可能说自己不了解数据库,和面试岗位不太匹配吧,23333,具体面经看下图!

    这里写图片描述

    1.6 热乎乎的浦发总行8月6日面筋!

    作者:上海伊泽瑞尔
    链接:https://www.nowcoder.com/discuss/91095
    来源:牛客网

    本人秋招第一次大型面试,打卡攒人品。

    浦发银行总行信息科技部(需求设计方向)面试
    时间:8月6日12:30-16:00

    面试在总行,离学校比较远,所以我提前两小时出发,到的时候前台小姐姐给了我一张餐券,幸福!!食堂伙食还不错!
    候场的candidate黑压压的一片,我问了下工作人员,说这三天在上海面试的总行信科的就有700多人,可见竞争多激烈(大家都开玩笑地说难道笔试不刷人?)
    到点后有工作人员来讲规则,面试分为三部分:综合面试、专业面试和机考,点到后就跟着分别去面试就好。三部分一天结束,预计结果要等一到两个月。(不太理解为什么等这么久)

    一、专业面试(其实更像挖简历的行为面?)

    我先被点到参加专业面试,据说在15mins左右,可是在我前面两位小姐姐都在20mins以上。进去后发现有三位面试官,两男一女,看起来很有资历了前面有一个位子面试者坐,隔得比较远。问好后首先就是万年不变的自我介绍,以及对本人来说,万年不变的“专业不对口”问题。接着对我的实习经历进行了深挖。包括怎么写报告的?报告有哪些亮点?等等。
    三位都有问,且侧重点不同。中间一位侧重需求设计,问我对需求设计有什么理解?我利用了产品经理的相关知识,先说产品的生命周期第一步就是需求设计,并列举了需求设计的三个过程,以及其中的具体方法。面试官指出银行的产品有所不同,需求之后直接输出需求文档及原型转给开发人员,而不像互联网一样先给用户定位和画像。紧接着问如果开发技术不同意我的需求设计怎么办(举了一个最近的例子,一个PM和程序员因为一个需求打起来了)?我答先从自身找问题,再诚心与技术人员沟通。这里强调了产品(需求)人员懂点技术的重要性(“嗯嗯,您说的很有道理”)。后来又问了为什么不继续在券商实习?如果给你offer,同时又有券商基金的offer,该怎么选择?我举了一个例子,如果我是踢球的,皇马巴萨两家俱乐部都想签我,我会考虑自身的特点以及他给的位置和战术安排。最后强调相比之下,总行的信息科技岗对我的吸引力还是很大的!估计他也是球迷吧,听了我这个回答会心一笑。
    右边的女面试官详细问了我公众号的运营经历以及写研究报告的过程。
    左边的面试官很关心我的计算机水平,我自然是要摆低姿态,毕竟小白一个,只自学了一点python而已。后来他问我对计算机本身的了解?有没有拆过计算机?我只好说不好意思了(只有一次因为风扇太吵,拆过一次清灰)。又问我平时关注互联网新闻吗?这个我给了肯定的回答。后面又问我区块链,我只懂一个大概,并说最大特点是去中心化记账。他的这一系列问题我没回答好,也看出了他的失望。还是平时积累不够!!这一块要加强!!

    二、综合面

    六人一组进到一个小房间。六对三面试。每人抽一个话题表达自己的看法。我抽到“如何看待选秀(例如创造101)对青少年的影响?利大于弊抑或弊大于利”。我从三个方面,理性、感性角度及节目本身的特点进行了阐述,结论利大于弊。六个人有三位抽到了这个话题,都支持利大于弊。另三位抽到的是“如何看待高铁吸烟的问题”。个人认为这个不太好说。
    随后面试官问了三位:介绍一下你写的一篇论文;另外三位(包括我):你认为你的优势是什么。一位面试官突然Q我(大概我是这场唯一的男生??),有软件开发经验吗,我表示遗憾,外加生无可恋。。。

    三、机考(编程)

    前一天才知道要机考,只好临时抱了个佛脚,把自学的内容胡乱看了一遍。据说编程题比较简单,例如字符串逆转,大小写,数列求和等等。结果今天说需求设计方向不需要机考!瞬间长舒一口气哈哈哈哈。

    最后赞一下耐心负责的现场面试官和工作人员,以及食堂!
    欢迎小伙伴交流!

    1.7 秋招面经(持续更新,攒RP 银联系统开发)

    作者:ㄣArviiinズ
    链接:https://www.nowcoder.com/discuss/90894
    来源:牛客网

    1.浦发银行总行信息科技部面试(2018.8.5 12.30场)

    综合面:

    三个面试官,6个人,每人给一份材料,一支笔,2分钟阅读材料,3分钟演讲,我的是怎么看待格力董明珠要不要做芯片 我没抽到的另一个是:你怎么看网络综艺和电视台综艺.

    结束后会有提问,有的问自我介绍,有的问自己的优点等,但是我很奇葩的被问了看了什么论文。

    技术面:

    三个面试官对着你一个人,开始就是自我介绍,对着你介绍的问,所以说的时候不要给自己挖坑,技术点细节不怎么问,另外不要把问题想复杂,我有的问题说的太细了,面试官就说可以了,下一个问题。

    机试:

    三道题,第一题:分段函数。第二题:A,B两个字符串,求在第一个字符串出现,第二个字符串中未出现的,重复只取第一次出现,输出字符串。第三题加密解密,就是给你由大写字母组成的字符串,求出原来的字符串,加密 。方式很简单就是字符串后移五位,比如原来是A加密后是F,其余数字等标点符号原样输出.

    总结:时间持续的蛮久的,都是在等的状态,我四点多结束的.

    2.浦发银行总行信息科技部面试(2018.8.9 9.30场)
    到了以后交材料,然后填一个很详细的表,4页.太可怕了.
    群面:2个面试官12个人无领导小组讨论,每人给一份材料,一支铅笔,一张白纸5分钟阅读材料,1分钟自我介绍并回答材料问题,关于金融风险的排序问题.接下来20分钟的自由讨论和3分钟的陈述总结.刷的人不多,面试官也不看我们.

    技术面: 2个面试官对你一个人,开始就是上交简历自我介绍。然后对着简历问问题.我问到了hashMap,反射实现的机制.高并发,还有一些关于自己项目和实习经历的.人还是很nice的,聊的还不错.

    总结:,效率和时间安排还可以,我快12.30结束的.

    1.8 上海浦发面经(秋招面经持续更新,攒人品)

    作者:我只是弱鸡
    链接:https://www.nowcoder.com/discuss/90871
    来源:牛客网

    8.4日,大数据方向,共两面,加上机

    综合面:6个人,每人给一份材料,2分钟阅读材料,3分钟演讲,我的是怎么看待,app,纸质阅读,等多样化阅读,并保持阅读高效性

    另外一个材料:中国生产圆珠笔里的主要材料都是进口的,但却是圆珠笔产量第一的国家,你怎么看?

    结束后会有提问,自我介绍,关于材料哪位同学讲的好之类。

    技术面:自我介绍,会问项目的内容,你对投递岗位的理解,你做的项目如果用到银行会有什么应用,技术点不怎么问。

    上机:可选项,可做可不做(开发方向上机必须,题都基础)。三道题,第一题,从求组中找出唯一出现一次得数。第二题,给年月日,判断是方面第几天。第三题,小球从100米下落,每次回弹一半距离,第几次落地后的总距离。

    1.9 浦发银行现场面(武汉地区)

    作者:珞珈山落草为寇
    链接:https://www.nowcoder.com/discuss/90567
    来源:牛客网

    七月三十一号浦发现场面试,记录下,回馈牛友.
    面试三项流程:结构化面试+即兴演讲+机试
    结构化面试分为两组:每组三个面试官,主要就是对着简历问.
    面试官会让你自我介绍,我介绍的很简短,简历上已有的内容就没介绍,结果面试官让我自己把自己的项目也介绍下(面试官太懒,想听你说)
    有个面试官看见我写的Java项目,就问了几个Java的水题,比如接口和类的区别,常用集合类等.
    然后就出去等候下一轮召唤.
    接下来就是机试,机试很水,三道题,每题代码量不超过十行(可以用Eclipse/Notepa++)
    字符串逆序输出,数列和,小写转大写
    好像用的是华科的OJ评测系统.
    最后一轮是即兴演讲面.6个人一组,抽题目,两分钟读题,三分钟陈述观点.
    总结:面试很耗时,效率很低.中午12.30开始,一直拖动下午五点多才结束.
    面试结果未知,群里说有等一个月或者几个月的.

    1.10 浦发银行(西安分行)信息科技岗面经

    作者:neu张康
    链接:https://www.nowcoder.com/discuss/89581
    来源:牛客网

    先说一下,我投的是(系统开发方向)
    一面:群面,6人一组,每人抽一题,看2分钟然后进行个人演讲。6个人都完事后面试官会问你,你觉得本次演讲谁最突出,推荐2人。
    二面:技术面,三位面试官,问得问题范围比较大,细节问得不多。首先是自我介绍,因为我写的项目中涉及到高并发,然后问从代码的角度如何优化(回答的好像不满意)。其次又问了java的开源框架都熟悉哪些,我说了spring,然后就问了IOC和AOP。然后又问熟悉tomcat吗,配置连接池的时候如何配置最大连接数。然后又问了问研究生期间做的什么,然后就没有然后了。java虚拟机,集合,线程什么的一点没问。
    三面:机考,三个编程题。
    第一题:把字符串中的字符a和A换成c输出。
    第二题:给你年月日,求出是这年的第几天
    第三题:给你两个数,例如23和456,23456=24 25 26 34 35 3*6,让你实现这个算法。

    展开全文
  • 【数据库学习】数据库总结

    万次阅读 多人点赞 2018-07-26 13:26:41
    概念模型是用于信息世界的建模,是一种信息模型,与具体的DBMS无关。且能满足用户对数据的处理要求,易于修改。 概念模型与具体数据模型无关且容易向数据库模型转化。 实体:举行表示 属性:椭圆表示,并用直线与...

    1,概念

    1)数据库

    数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。
    数据库中存储的是数据及数据之间的关系。

    正常情况读写文件系统比数据库快一到两个数据级;
    数据库的查询,大量并发的时候可能最浪费时间的是connect和close。
    数据库的优势是体现的大量数据的查询、统计以及并发读写,不是在速度上。

    2)数据库数据特点

    永久存储、有组织、可共享。
    (数据的最小存取单位是数据项)

    3)数据库系统的特点

    ①数据结构化

    ②数据的共享性,冗余度,易扩充

    ③数据独立性高

    数据独立性包括:物理独立性和逻辑独立性
    a)物理独立性(外模式\模式映像):
    用户程序不需要了解,应用程序要处理的只是数据的逻辑结构,这样当数据的物理存储改变了,应用程序不用改变。
    b)逻辑独立性(模式\内模式映像):
    逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的,即,当数据的逻辑结构改变时,用户程序也可以不变。
    逻辑数据独立性(logical data independence)是指概念模式改变,外模式和应用程序不变。在逻辑数据独立性里,数据的逻辑结构发生改变或存储关系的选择发生改变时用户不会受到影响。改变概念模式,例如增加和删除实体、增加和删除属性、增加和删除联系,不需要改变现有的外模式或重写应用程序。在DBMS中只需要修改视图的定义和映像来支持逻辑数据独立性。对用户来说,不再关心所做的修改是非常重要的。换句话说,模式经过逻辑重构之后,根据外模式构建的应用程序还是和从前一样工作。

    4)概念模型(E-R模型)

    ①概念

    概念模型的一种表示方法:实体联系方法,用E-R方法(E-R模型)来描述。
    概念模型是用于信息世界的建模,是一种信息模型,与具体的DBMS无关。且能满足用户对数据的处理要求,易于修改。
    概念模型与具体数据模型无关且容易向数据库模型转化。

    实体:举行表示
    属性:椭圆表示,并用直线与实体连接
    联系:菱形表示,用直线与实体连接,同时在边上标上联系的类型(1:1,1:n,m:n)。
    

    一个联系转化为一个关系模式,与该联系相连的各实体的码以及联系的属性转化为关系的属性,该关系的码则有三种情况:
    若联系为1:1,则每个实体的码均是该关系的后选码。
    若联系为1:n,则关系的码为n端实体的码。
    若联系为m:n,则关系的码为诸实体码的组合。

    数据库模式定义语言DDL(Data Definition Language):是用于描述数据库中要存储的现实世界实体的语言。一个数据库模式包含该数据库中所有实体的描述定义。这些定义包括结构定义、操作方法定义等。

    数据库逻辑设计: 将概念设计所得到的概念模型转换为某一具体的数据模型(层次、网状、关系、面向对象).

    5)关系完整性

    在关系模型中,关系完整性主要是指以下三方面:

    实体完整性

    所谓的实体完整性就是指关系(所谓的关系就是表)的主码不能取空值;
    比如学生表的主码通常是取学号为主码

    参照完整性

    是指参照关系中每个元素的外码要么为空(NULL),要么等于被参照关系中某个元素的主码;
    参照关系也称为外键表,被参照关系也称为主键表。

    用户定义的完整性

    指对关系中每个属性的取值作一个限制(或称为约束)的具体定义。比如 性别属性只能取”男“或”女“,再就是年龄的取值范围,可以取值0-130 ,但不能取负数,因为年龄不可能是负数。

    6)关系数据库规范化

    目地:使结构更合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新。
    原则:遵从概念单一化“一事一地”原则,即一个关系模式描述一个实体或实体间的一种联系。
    规范的实质:概念的单一化。
    规范化的方法:将关系模式投影分解成两个或两个以上的关系模式。

    2,依赖和范式

    1)依赖

    ①部分函数依赖

    设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。

        举个例子:通过AB能得出C,通过A也能得出C,通过B也能得出C,那么说C部分依赖于AB。
    

    ②完全函数依赖

    设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。

        举个例子:通过AB能得出C,但是AB单独得不出C,那么说C完全依赖于AB.
    

    ③传递函数依赖

    设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。

        举个例子:通过A得到B,通过B得到C,但是C得不到B,B得不到A,那么成C传递依赖于A
    

    ④多值依赖

    设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值有一组Y的值,这组值仅仅决定于x值而与z值无关。

    举例:
    有这样一个关系 <仓库管理员,仓库号,库存产品号> ,假设一个产品只能放到一个仓库中,但是一个仓库可以有若干管理员,那么对应于一个 <仓库管理员,库存产品号>有一个仓库号,而实际上,这个仓库号只与库存产品号有关,与管理员无关,就说这是多值依赖。

    2)范式

    各个范式联系:
    5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF

    ①1NF(满足最低要求的范式:字段不可再分,原子性)

    如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
    自我理解1NF就是无重复的列。
    如:(X1,X2)→X3,X2→X3 其中x3对x2部分依赖
    如:(X1,X2)→X3,X2→X4 其中有非主属性X4部分依赖于候选键{X1,X2},所以这个关系模式不为第二范式;又因为范式之间的关系满足1NF⊇2NF⊇3NF ⊇ BCNF,所以是第一范式。

    ②2NF(消除部分子函数依赖:一个表只能说明一个事物)

    若R∈1NF,且每一个非主属性完全函数依赖于码,则R∈2NF。
    即要求数据库表中的每个实例或行必须可以被唯一地区分。

    ③3NF(消除传递依赖,即消除非主属性对键的传递依赖:每列都与主键有直接关系,不存在传递依赖。任何非主属性不依赖于其它非主属性。)

    若R∈3NF,则每一个非主属性既不部分依赖于码,也不传递依赖于码。
    自我理解是:表中所有的数据元素不但要能唯一地被主键所标识,而且他们之间还必须相互独立,不存在其他的函数关系。

    ④BCNF(修正第三范式、扩充第三范式 消除主属性对键的传递依赖)

    所有非主属性对每一个码都是完全函数依赖;
    所有主属性对每一个不包含它的码,也是完全函数依赖;
    没有任何属性完全函数依赖于非码的任何一组属性。

    ⑤4NF

    关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X->->Y(Y∉X),X都含有码,则称R<U,F>∈4NF

    3,数据库平台

    数据库管理系统(DBMS):是系统软件,是数据库系统的核心。
    常见数据库管理系统有:Access、mysql、sql server

    4,数据库语句

    SQL 语言是非过程化的语言,易学习。
    SQL语言具有两种使用方式:一种是在终端交互方式下使用,称为交互式SQL; 另一种是嵌入在高级语言的程序中使用,称为嵌入式SQL,而这些高级语言可以是C、PASCAL、COBOL等,称为宿主语言。

    1)基本对象

    关系数据库系统支持 三级模式结构,其概念模式、外模式和内模式中的基本对象有表、视图和索引。
    三级模式结构有效地组织、管理数据,提高了数据库的逻辑独立性和物理独立性。使数据库达到了数据独立性。

    ①模式(schema,逻辑模式)

    A.概念

    是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。是数据库系统模式结构的中间层,即不涉及数据的物理存储细节和硬件环境,也与具体的应用程序、开发工具及高级设计语言无关。
    模式是数据库数据在逻辑级上的视图,一个数据库只有一个模式。

    也用于区分一个 大项目中的各个小项目,这样若有相同名字的表的话, 不同模式不会发生冲突。相当于编程时的命名空间。
    如:
    一个公司的系统,分2个子系统,分别为财务系统和人力资源系统.
    这2个子系统, 共用一个数据库。
    那么 财务系统的表, 可以放在财务的模式(schema).
    人力资源系统的表,放在人力资源系统的模式里面。
    这2个子系统,能够互相访问对方的表。
    但是又不因为 表重名 的问题,影响对方。

    B.访问

    访问具体的一个表,可以由 4个部分组成
    分别为 服务器名, 数据库名,模式名,表名。

    对于访问本地的数据库:
    不指定模式名的话, 数据库默认使用dbo模式。
    (DBO是每个数据库的默认用户,具有所有者权限,即DbOwner )
    pg不指定模式的话默认使用public模式。

    C.操作

    --创建
    CREATE SCHEMA schema_name;
    

    ②外模式(子模式,用户模式)

    是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
    外模式通常是模式的子集,一个数据库可以有多个外模式,但一个应用程序只能有一个外模式。
    外模式是保证数据库安全性的一个有力措施:用户只能访问外模式的数据,其余数据不可见。

    ③内模式(存储模式)

    一个数据库只有一个内模式。
    内模式是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。

    数据库管理系统在三级模式之间提供了两层映像:
    外模式/模式映像(保证数据的逻辑独立性)
    模式/内模式映像(保证了物理独立性)

    ④表

    表分为临时表和永久表。

    临时表

    临时表存储在tempdb中(如下),当不再使用时会自动删除。

    IF OBJECT_ID('tempdb..#ownerAnnouce') IS NOT NULL
    

    根据进程独立,只有进程的拥有者有表的访问权限,其它用户不能访问该表;
    不同的用户进程,创建的临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证临时表的进程独立性。

    临时表有两种类型:本地和全局。

    A.本地临时表

    名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。

    B.全局临时表

    名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。

    临时表优点

    真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。

    临时表的创建

    A. create table #临时表名
    B.select * into #临时表名 from 表名(永久表或临时表)

    ⑤视图

    A.概念

    视图是一张虚拟表,视图的字段是自定义的,视图只支持查询,查询数据来源于实体表。

    一般视图是只读的,在pg中通过添加规则可以进行视图的更新。从pg9.1开始,用户可以通过INSTEAD OF的触发器来实现视图更新。

    B.优缺点

    • 优点
      视图可以将多个复杂关联表提取信息,方便查询,但不能优化查询速度(调用视图查询时才进行动态检索数据)。
      即,如果你认为一个sql查询非常慢,为了优化它的速度把它建立成视图,这是不可取的,视图是每次调用的时候生成,并不是数据源变化就刷新数据,并不能提高检索效率。
    • 缺点
      视图就是临时表,即调即用,如果数据源没有任何变化,在反复调用中,临时表会缓存到内存中(SHOW STATUS LIKE ‘Qcache%’;),视图中不能创建索引,但视图可以基于索引生成 。

    C.场景

    1. 重用SQL语句;
    2. 简化复杂SQL操作(生成视图),重用查询且不需要知道基本查询细节。
    3. 保护数据。用户有表的部分权限。
    4. 更改数据格式和表示。视图可返回与底层表不同的表示和格式。

    D.操作

    --创建视图
    CREATE OR REPLACE VIEW view_name(studentName, studentAge)  --(studentName, studentAge) 可以去掉,加上是重命名列名
    AS 
    SELECT user_info.name, user_info.age from user_info;
    
    --删除视图
    DROP VIEW view_name;
    

    ⑥实体视图

    相对于普通的视图来说,实体化视图的不同之处在于实体化视图管理存储数据,占据数据库的物理空间。

    实体化视图的结果会保存在一个普通的数据表中,在对实体化视图进行查询的时候不再会对创建实体化视图的基表进行查询,而是直接查询实体化视图对应的结果表,然后通过定期的刷新机制来更新实体化视图表中的数据。

    demo

    -- 创建物化视图
    CREATE MATERIALIZED VIEW MAX_ID_MVIEW 
    AS
      SELECT PART_ID, MAX(ID)  MAX_ID
      FROM PART_DETAIL GROUP BY PART_ID;
      
    -- 如果刷新时不带CONCURRENTLY则无需创建唯一索引
    CREATE UNIQUE INDEX IDX_MAX_ID ON MAX_ID_MVIEW(PART_ID);
    
    -- 利用watch命令每120s刷新一次物化视图
    REFRESH MATERIALIZED VIEW CONCURRENTLY MAX_ID_MVIEW; \watch 120
    

    作用

    1. 减轻网络负担:通过实体化视图将数据从一个数据库分发到多个不同的数据库上,通过对多个数据库访问来减轻对单个数据库的网络负担。
    2. 搭建分发环境:通过从一个中央数据库将数据分发到多个节点数据库,达到分发数据的目的。
    3. 复制数据子集:实体化视图可以进行行级/列级的筛选,这样可以复制需要的那一部分数据。
    4. 实体化视图是用于汇总,预计算,复制或分发数据的对象, 在大型的数据库中使用它可以提高涉及到的SUM,COUNT,AVG,MIN,MAX等的表的查询的速度。
    5. 物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新。因此快速刷新是物化视图刷新方式的首选。

    ⑦索引

    为了改变数据库的性能和可访问性所增加的一组辅助性数据。
    详细介绍见下文。

    2)数据结构创建及修改

    1>数据库操作

    --查看数据库
    show databases;
    --建库
    create database children;
    --删库
    drop database children;
    --调用数据库
    use children;
    

    2>表操作

    --pg建表
    CREATE TABLE if not exists public.stu_info(   --创建public模式下的表
        FOREIGN KEY (ID) REFERENCES people_info (ID),  --单个外键,一般情况下不建议增加这种强约束
        id int8 PRIMARY KEY,    --系统会自动为主键创建一个隐含的索引  primary key(Sno,Cno)组合主键
        address VARCHAR (255) UNIQUE NOT NULL,
        birthday TIMESTAMP NOT NULL,  
        age int default 15,  --默认值,影响后续插入值。但对旧数据没有影响。
       CONSTRAINT student2_pkey PRIMARY KEY (id),
       CONSTRAINT ck_age CHECK(age<18), --检查约束,约束某些字段需要满足的要求。NULL被认为满足条件。
       CONSTRAINT uk_tbl_unique_a_b unique(id ,address) --唯一约束。唯一键中可以写入任意多个NULL!即可以存在多组 1,null  
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE myschema.tb_test
      OWNER TO postgres;
    
    --重命名表
    alter table tableName RENAME TO newName;--pg
    

    i>指定默认值

    一般用于数据预置或create_time、update_time的自动录入。各个DBMS获得系统日期如下:

    DBMS函数/变量
    AccessNOW()
    DB2CURRENT_DATE
    MySQLCURRENT_DATE()
    OracleSYSDATE
    PostgreSQLCURRENT_DATE
    SQL ServerGETDATE()
    SQLitedate(‘now’)
    --修改默认值
    alter table tableName alter column age set DEFAULT 15;--pg
    --删除默认值
    alter table tableName alter column age drop DEFAULT 15;--pg
    

    ii>表约束

    表约束有:主键、外键、检查约束、唯一约束、非NULL约束。

    --添加主键(有些DBMS不允许在建表之后修改主键)
    ALTER TABLE tableName ADD PRIMARY KEY(fieldName) ; --fieldName在库中不能有重复数据
    --增加约束
    alter table tableName add check (age<16);--pg 增加检查约束,约束名为:tableName_age_check
    alter table tableName add constraint uk_tbl_unique_a_b unique (a,b);--pg 增加唯一约束
    alter table tableName alter column fieldName set NOT NULL;--pg 增加非空约束
    --删除约束
    alter table tableName drop constraint constraintName;--pg 根据约束名删除检查约束、唯一约束
    alter table tableName alter column fieldName drop NOT NULL;--pg 删除非空约束(非空约束没有约束名)
    

    iii>修改表字段

    --增加列\添加一个字段
    alter table tableName add column columnName varchar(30) default 'a' not null; --column 可加可不加
    --删除列(会连同字段上的约束一并删除)
    alter table tableName drop column columnName; --column 可加可不加
    --修改列名:
    alter table tableName rename column fieldName TO fieldNameNew;--pg、oracle中
    exec sp_rename '[表名].[列名]‘,’[表名].[新列名]'--在sqlserver
    ALTER TABLE 表名 CHANGE 列名 新列名 列类型--mysql
    
    --修改字段类型或长度:
    alter table tableName modify column 字段名 类型;
    alter table tableName alter column fieldName TYPE text;--pg修改字段数据类型。仅在当前数据都可以隐式转换为新类型时才可以执行成功
    --将NAME最大列宽增加到10个字符
    ALTER TABLE CARD ALTER COLUMN NAME varchar(10) 
    
    

    3)数据查询

    数据库处理一个查询的步骤:
    客户端连接->查询缓存->解析器->预处理器->查询优化器->查询执行引擎->数据

    1. 客户端发送一条查询给服务器;
    2. 服务器先会检查查询缓存query cache,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶段;
    3. 服务器端进行SQL解析parsing、预处理transition,再由优化器optimization生成对应的执行计划;
    4. 根据优化器生成的执行计划,调用存储引擎的API来执行分布distribution查询;
    5. 将结果返回给客户端。
    

    1>简单查询

    select * from student;
    select 1+2; #当表达式与表列无关时,在pg和mysql中不适用“from tableName”
    

    拼接查询:
    Access和 SQL Server使用 + 号。DB2、Oracle、PostgreSQL、SQLite和Open Office Base 使用 ||。

    select label || '_' || id from user_info;  --结果:abc_1
    

    2>条件查询

    功能表达举例备注
    等于=
    不等于<>!=
    空值is null,is not nullselect * from student where class is not null;
    确定集合,ininnot inselect * from student where age not in(21,23);在sql标准中仅支持100个以内的占位符作为查询参数。根据数据库不同,对in的参数和长度有不同的限制,否则会直接报错。
    确定范围between and , not between and
    模糊查询like ,not likeselect * from student where name like '%丽%';’ %代表任意长度(可为0)的字符串;_(下划线):代表任意单个字符。(汉字代表2个字符,所以一个汉字用两个下划线);\为转义字符

    select出的别名是否可以作为where查询条件?不能,因为执行计划中where在selectz之前。如:select label a from asset_field where a = '分类'

    3>排序查询

    非排序查询的数据顺序:pg默认返回数据的顺序是插入表的数据顺序。

    # 单个排序:
    select name,age from student order by age desc; # 默认为asc:升序排列。desc:降序排序。
    
    #多重排序:
    order by 字段5,字段6 asc  //先按字段5排序,再按字段6排序
    

    4>case when then查询

    --简单case函数
    case sex
      when '1' then '男'
      when '2' then '女’
      else '其他' end
    --case搜索函数
    case when sex = '1' then ''
         when sex = '2' then ''
         else '其他' end  
    

    应用:

    select (case sex
    		  when '1' then '男'
    		  when '2' then '女’
    		  else '其他' end)sex from student where class = 11;
    

    5>where、group by、having

    大部分的where都可以背having代替,不同的是where过滤行,而having过滤分组,用在group by之后。(where在分组前过滤,having在分组后过滤)

    select class,avg(age) as age from student 
    group by class 
    having avg(age)>23 /*要求平均年龄大于23*/
    

    where肯定在group by 之前
    where后的条件表达式里不允许使用聚合函数,而having可以。

    6> 函数

    聚合函数

    avg平均数,同min(age)、max(age)、sum(age)

    select avg(age)  as age from student group by class order by age desc; 
    

    count

    select count(class)from student;
    /*数量 因为使用了92标准,所以null不计入count*/
    count(*) 跟count(1) 的结果一样,返回记录的总行数,都包括对NULL 的统计,
    count(column) 是不包括NULL 的统计。
    

    distinct

    select distinct(class)from student;/*去重复,出现所有不同的内容*/
    select count(distinct(class)) from student;
    

    其它

    LEFT(“123456789”,LEN(“数据库”))/*分两步运算,第一步是运算LEN函数,结果是3。第二步针对123456789这个字符从左边开始连续取三个数*/
    
    select top 100 * from student where no=11;/*显示前100行*/
    select isnull(name,'无') as name,age,class from student;/*isnull之后就无列名了 用as给列重命名*/
    select name,age,class,'the name is' + name as introduce from student;/*用加号形成一个自定义列*/
    

    7>SQL-92 规则

    是数据库的一个标准。以下代码 写在存储过程前面,表示遵从SQL-92 规则。
    SQL-92 标准要求在对空值进行等于 (=) 或不等于 (<) 比较时取值为 FALSE。

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    

    SET ANSI_NULLS ON
    即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。
    即使 column_name 中包含非空值,使用 WHERE column_name < NULL 的 SELECT 语句仍会返回零行。

    SET QUOTED_IDENTIFIER ON
    为ON:标识符可以由双引号分隔,而文字必须由单引号分隔。
    为OFF:标识符不可加引号。

    8>多层查询 EXISTS

    如果内层查询语句查询到符合条件的记录,就返回一个真值(true),否则,将返回
    一个假值(false)。

    SELECT * FROM employee
    WHERE EXISTS
    (SELECT d_name FROM department WHERE d_id=1003);
    

    同理还有:NOT EXISTS。

    9>关联查询、联结(JOIN)表

    关系数据库设计中表的设计是把信息分解成多个表,一类数据一个表,各表通过某些共同的值相互关联。
    一般情况下我们不建议建立外键这种强关联的关联信息。

    可伸缩(scale)
    能够适应不断增加的工作量而不失败。关系数据库的可伸缩性远远优于非关系数据库。

    注意:

    1. 联结的表越多效率越低。
    2. SQL本身不限制联结表的数目,但DBMS有最大数目限制。
    3. 一般情况下,联结查询比子查询快,实际应用中应该尝试两种方法看哪种快。
    JSON类型说明备注
    JOIN如果表中有至少一个匹配,则返回行INNER已省略。外联结比内联结返回的行数多(还包括没有关联的行)
    LEFT JOIN即使右表中没有匹配,也从左表返回所有的行OUTER已省略
    RIGHT JOIN即使左表中没有匹配,也从右表返回所有的行OUTER已省略
    FULL JOIN只要其中一个表中存在匹配,就返回行OUTER已省略

    luo_persons表:

    id_plast_namefirst_nameaddresscity

    luo_orders表:

    id_oorder_noid_p

    要求输出:谁订购了产品,并且他们订购了什么产品?

    ①联表查询(等值联结,equijoin)

    SELECT
    	a.last_name, a.first_name, b.order_no
    FROM
    	luo_persons a,
    	luo_orders b 
    WHERE
    	a.id_p = b.id_p	
    

    ②join查询(内联结,inner join, 推荐)

    /*(推荐)等值联结明确指定联结类型可转换为inner join

    SELECT
    	last_name,
    	first_name,
    	order_no 
    FROM
    	luo_persons
    	INNER JOIN luo_orders ON luo_persons.id_p = luo_orders.id_p
    

    ③union查询(复合查询、并查询)

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

    注意:

    1. UNION 内部的 SELECT 语句必须拥有相同数量的列、表达式或聚集函数。列也必须拥有相似的数据类型(可以不完全相同,但是可以互相转换)。同时,每条 SELECT 语句中的列的顺序必须相同。
    2. 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
    3. UNION能组合的最大语句数目限制需要查询具体的DBMS文档。
    	select id_p from luo_persons 
    	union 
    	SELECT id_p from luo_orders
    

    某些DBMS中还支持其它类型的UNION:

    1. EXCEPT(或MINUS):检索在第一个表中存在而在第二个表中不存在的行;
    2. INTERSECT:检索两个表中都存在的行。

    4)数据更新

    ①数据插入

    i> insert

    insert into tableName(no,name) values'1','kate');
    --按表中列的顺序,但如果表结构发生了变化那么对应 sql也要改。不推荐
    insert into product values('001','001','N','N');
    

    有自增长主键(id)的插入:
    i>可以把id的值设置为null或者0,这样mysql会自己做处理
    ii>手动指定需要插入的列,不插入这一个字段的数据!

    ii> insert select

    将select结果插入表中,一般用于可重复执行的sql。
    注:
    1.insert select语句中,如果select返回多行,那么会insert多行数据。

    INSERT INTO "public"."vendors"("vend_name", "vend_id") select 'vend_name1', 1 
    WHERE NOT EXISTS (select 1  FROM "public"."vendors" WHERE vend_id = 1);
    

    iii> select into

    1. SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
    2. SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
    3. select into 可以从多个表中检索数据,但只能插入到一个表中。

    函数里面,把一个查询出来的值存入临时变量:

    SELECT LastName,FirstName
    INTO _lName,_fName  FROM Persons
    

    也可以存入临时表中:

    SELECT *
    INTO Persons_backup
    FROM Persons
    

    ②数据修改

    update tableName set name = 'Tom' where name='kate';
    update tableName set age = age + 1;
    

    5)数据删除

    删除表中几行:

    DELETE FROM Person WHERE LastName = 'Wilson' 
    

    删除表中所有行,保留表、不释放空间。所删除的每行记录都会进日志,可以回滚。

    DELETE FROM table_name
    

    删除表:删除内容和定义,释放空间

    drop table user;    
    DROP TABLE IF EXISTS "public"."role_relation"; 可重复执行sql
    

    删除表中所有数据,保留表、同时释放空间(速度比delete快,但是无法撤回,日志里面只记录页释放):

    truncate table book;
    

    truncate是DDL语句(Data Definition,数据定义语句),相当于用重新定义一个新表的方法把原表的内容直接丢弃了,所以执行起来很快。delete语句是DML语句(Data Manipulation,数据操作语句),把数据一条一条的删除,所以删除多行数据执行较慢。

    6)其他注意

    ①加中括号

    列名、表名、存储过程名、函数名等都可以按需要加中括号。防止某些关键字在应用中引起歧义。

    select [select] from 表名;
    

    7)数据库授权

    ①授权GRANT

        GRANT <权限>
        ON <对象类型>  <对象名>
        TO <用户>
        [WITH GRANT OPTION]  // 如果指定了WITH GRANT OPTION子句,则获得某种权限的用户还可以把这种权限再授予其他用户,允许用户传递权限,但是不允许循环授权。
    

    举例:

    例1:把查询Student表的权限授给用户U1
    GRANT SELECT
    ON TABLE Student
    TO U1;
    
    例2:把全部操作权限授予用户U2和U3
    GRANT ALL PRIVILEGES
    ON TABLE Student,Course
    TO U2,U3;
    
    例3:把查询权限授予所有用户
    GRANT SELECT
    ON TABLE SC
    TO PUBLIC;
    

    ③权限的收回 REVOKE

    REVOKE <权限>
    ON <对象类型>  <对象名>
    FROM <用户>
    

    举例:

    例6:收回所有用户对表sc的查询权限
    REVOKE SELECT
    ON TABLE SC
    FROM PUBLIC;
    

    ③对用户模式的授权

    由DBA(数据库管理员,Database Administrator,简称DBA)在创建用户时实现。

    CREATE USER <username>
    [WITH] [DBA|RESOURCE|CONNECT]
    

    只有系统的超级用户才有权创建一个新的数据库用户
    新创建的用户有三种权限:DB,|RESOURCE,CONNECT

    ④数据库角色创建及授权

    CREATE ROLE <角色名>
    

    给角色授权:

    GRANT <权限>
    ON <对象类型>  对象名
    TO <角色>
    

    将一个角色授予其他的角色或用户

    GRANT <角色1>
    TO <角色3>
    [WITH ADMIN OPTION]//如果指定了WITH ADMIN OPTION 子句,则获得某种权限的角色或用户还可以把这种权限再授予其他角色
    

    角色权限的收回

    REVOKE <权限>
    ON <对象类型>  <对象名>
    FROM <角色>
    

    ⑤DENY 拒绝账户访问

    在安全系统中创建一项,以拒绝给当前数据库内的安全帐户授予权限并防止安全帐户通过其组或角色成员资格继承权限。

    DENY { ALL | statement [ ,...n ] }
    TO security_account [ ,...n ]
    

    和授权区别:
    不授权是没有权限,但是如果这个用户属于某个角色,这个角色有了权限,那么这个用户可以从角色继承这个权限。如果选择了deny,即使这个用户属于某个具有权限的角色,他也没有权限。

    8)数据类型

    ①uniqueidentifier

    可存储16字节的二进制值,其作用与全局唯一标记符(GUID)一样。GUID是唯一的二进制数:世界上的任何两台计算机都不会生成重复的GUID值。GUID主要用于在用于多个节点,多台计算机的网络中,分配必须具有唯一性的标识符。

    9)函数

    ①OBJECT_ID

    A. 返回指定对象的对象 ID

    USE master;
    GO
    SELECT OBJECT_ID(N'AdventureWorks.Production.WorkOrder') AS 'Object ID';
    GO
    

    B. 验证对象是否存在

    USE AdventureWorks;
    GO
    IF OBJECT_ID (N'dbo.AWBuildVersion', N'U') IS NOT NULL
    DROP TABLE dbo.AWBuildVersion;
    GO
    

    N是显式的将非unicode字符转成unicode字符,它来自 SQL-92 标准中的 National(Unicode)数据类型,用于扩展和标准化,在这里可以不用,写作object_id(PerPersonData)。

    10)SQL中的借书经典案例

    ①问题描述

    本题用到下面三个关系表:
    CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级
    BOOKS 图书。 BNO 书号,BNAME 书名, AUTHOR 作者,PRICE 单价,QUANTITY 库存册数
    BORROW 借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期

    备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。

    要求1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束。

    CREATE TABLE BORROW(
        CNO int FOREIGN KEY REFERENCES CARD(CNO),
        BNO int FOREIGN KEY REFERENCES BOOKS(BNO),
        RDATE datetime,
        PRIMARY KEY(CNO,BNO)) 
    

    要求2. 找出借书超过5本的读者,输出借书卡号及所借图书册数。

    SELECT CNO,借图书册数=COUNT(*)
    FROM BORROW
    GROUP BY CNO
    HAVING COUNT(*)>5
    

    要求3. 查询借阅了"水浒"一书的读者,输出姓名及班级

    CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级
    BOOKS 图书。 BNO 书号,BNAME 书名, AUTHOR 作者,PRICE 单价,QUANTITY 库存册数
    BORROW 借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期

    SELECT * FROM CARD c
    WHERE EXISTS(
        SELECT * FROM BORROW a,BOOKS b 
        WHERE a.BNO=b.BNO
            AND b.BNAME=N'水浒'
            AND a.CNO=c.CNO) 
    

    要求4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期。

    SELECT * FROM BORROW 
    WHERE RDATE<GETDATE() 
    

    要求5. 查询书名包括"网络"关键词的图书,输出书号、书名、作者。

    SELECT BNO,BNAME,AUTHOR FROM BOOKS
    WHERE BNAME LIKE N'%网络%' 
    

    N’string’ 表示string是个Unicode字符串

    要求6. 查询现有图书中价格最高的图书,输出书名及作者。

    SELECT BNO,BNAME,AUTHOR FROM BOOKS
    WHERE PRICE=(
        SELECT MAX(PRICE) FROM BOOKS) 
    

    要求7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。

    SELECT a.CNO
    FROM BORROW a,BOOKS b
    WHERE a.BNO=b.BNO AND b.BNAME=N'计算方法'
        AND NOT EXISTS(
            SELECT * FROM BORROW aa,BOOKS bb
            WHERE aa.BNO=bb.BNO
                AND bb.BNAME=N'计算方法习题集'
                AND aa.CNO=a.CNO)
    ORDER BY a.CNO DESC 
    

    要求8. 将"C01"班同学所借图书的还期都延长一周。

    UPDATE b SET RDATE=DATEADD(Day,7,b.RDATE)
    FROM CARD a,BORROW b
    WHERE a.CNO=b.CNO
        AND a.CLASS=N'C01' 
    
    DATEADD(datepart,number,date)  
    date 参数是合法的日期表达式。number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。
    

    要求9. 从BOOKS表中删除当前无人借阅的图书记录。

    DELETE FROM BOOKS a
    WHERE NOT EXISTS(
        SELECT * FROM BORROW
        WHERE BNO=a.BNO) 
    

    要求11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。

    CREATE TRIGGER TR_SAVE ON BORROW
    FOR INSERT,UPDATE
    AS
    IF @@ROWCOUNT>0
    INSERT BORROW_SAVE SELECT i.*
    FROM INSERTED i,BOOKS b
    WHERE i.BNO=b.BNO
        AND b.BNAME=N'数据库技术及应用' 
    

    要求13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。

    SELECT a.CNO
    FROM BORROW a,BOOKS b
    WHERE a.BNO=b.BNO
        AND b.BNAME IN(N'计算方法',N'组合数学')
    GROUP BY a.CNO
    HAVING COUNT(*)=2
    ORDER BY a.CNO DESC
    

    5,索引

    6,关系运算

    1)集合运算符

    并(∪)、差(-)、交(∩)、笛卡尔积(×)

    笛卡尔积(直积):表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
    例如,A={a,b}, B={0,1,2},则
    A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
    

    2)专门的关系运算符

    ①选择(限制、σ)

    在关系R中选择满足给定条件的诸元组。

    ②投影(π)

    关系R上的投影是从R中选择出若干属性列组成新的关系。
    这里写图片描述
    投影之后可既改变行,又改变元组的数量。

    ③连接(θ连接、⋈)

    从两个关系的笛卡尔积中选取属性间满足一定条件的元组。(连接由乘积(笛卡尔积)、选择、投影组成)
    分为等值连接(=)、自然连接(要求比较的分量是相同的属性组,并在结果中把重复的属性列去掉)。
    这里写图片描述

    ④除运算(➗)

    RS÷S的意义就是:“在R和S的联系RS中,找出与S中所有的元组有关系的R元组”。

    3)算术比较符

    4)逻辑运算符

    非与或

    7,数据库完整性

    1)实体完整性

    主键唯一且不为空。

    2)参照完整性

    不允许修改外码
    级连操作:当删除或修改被参照表时,同时删除或修改参照表中的不一致元祖。

    3)用户定义的完整性

    4)触发器(Trigger)

    是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,任何用户对标的增删改操作均由服务器自动激活相应触发器,在DBMS核心层进行集中的完整性控制。

    8,存储过程(Stored Procedure)

    1)概念

    存储过程是一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

    2)优点

    ①执行效率高

    存储过程因为SQL 语句已经预编译过了,因此运行的速度比较快。

    ②降低了客户机和服务器之间的通信

    存储过程在服务器端运行,减少客户端的压力。
    减少网络流量,客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL 语句相比自然数据量少了很多。

    ③方便实施企业规则(提高了可维护性、安全性)

    可以把企业规则的运算程序写成存储过程放入数据库服务器中,由RDBMS管理,既有利于集中控制,又能够方便地进行维护。
    当用户规则发生变化时,只要修改存储过程,无须修改其他应用程序。

    允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次,类似方法的复用。
    增强了使用的安全性,充分利用系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。程序员直接调用存储过程,根本不知道表结构是什么,有什么字段,没有直接暴露表名以及字段名给程序员。

    ④安全性高

    可设定只有某些用户才具有对指定存储过程的使用权。

    3)缺点

    调试麻烦(至少没有像开发程序那样容易),可移植性不灵活(因为存储过程是依赖于具体的数据库)。

    4)场景

    当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;
    当在一个事务的完成需要很复杂的商业逻辑时(比如,对多个数据的操作,对多个状态的判断更改等)要考虑;还有就是比较复杂的统计和汇总也要考虑,但是过多的使用存储过程会降低系统的移植性。

    sql尽量放在存储过程中。
    面对大量数据,用orcle比sql server稳定。

    5)代码

    ①创建

    use test1
    set ansi_nulls on
    go
    set quoted_identifier on
    go
    create procedure procedure_student
    	-- add the parameters for the stored procedure here
    	@gradeid int,
    	@gradename varchar(10) --传入的参数
    as
    begin
    	--计算内容
    end
    go
    

    ②执行

    exec dbo.procedure_student 1,'g'
    

    9,数据库恢复技术

    1)事务

    10,并发控制

    为了保证事务的隔离性和一致性,DBMS需要对并发操作进行正确调度。

    1)并发操作带来的数据不一致性

    ①更新丢失

    ②读“脏”数据

    事务T1修改数据,T2读取数据,T1由于某种原因被撤销,则数据修改回原值,但T2读取的数据是之前修改的数据,即脏数据、不正确的数据。

    ③不可重复读

    事务T1读数据后,T2修改了数据,T1无法再现上一次读取的结果。

    ④幻读

    事务T1读数据后,T2新增或者删除了数据,T1无法再现上一次读取的结果。

    2)并发控制技术

    悲观锁:封锁
    乐观锁:版本号、时间戳

    3)封锁分类(悲观锁)

    ①共享锁(S锁、读锁)

    (读取)操作创建的锁。其他用户可以并发读取数据,但任何事物都不能获取数据上的排它锁,直到已释放所有共享锁。
    若事务T对数据对象A加上S锁,则事务T只能读A;其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

    ②排它锁(X锁、写锁,eXclusive lock)

    若事物T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。它防止任何其它事务获取资源上的锁,直到在事务的末尾将资源上的原始锁释放为止。

    ③更新锁(U锁)

    用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的页将要被更新时,则升级为X锁;U锁一直到事务结束时才能被释放。

    4)封锁问题

    ①活锁

    i>饥饿

    考虑一台打印机分配的例子,当有多个进程需要打印文件时,系统按照短文件优先的策略排序,该策略具有平均等待时间短的优点,似乎非常合理,但当短文件打印任务源源不断时,长文件的打印任务将被无限期地推迟,导致饥饿以至饿死。

    ii>活锁概念

    与饥饿相关的另外一个概念称为活锁,在忙式等待条件下发生的饥饿,称为活锁。

    a)忙式等待:不进入等待状态的等待。
    b)阻塞式等待:进程得不到共享资源时将进入阻塞状态,让出CPU 给其他进程使用。
    c)忙等待和阻塞式等待的相同之处:
    在于进程都不具备继续向前推进的条件,不同之处在于处于忙等待的进程不主动放弃CPU,尽管CPU 可能被剥夺,因而是低效的;而处于阻塞状态的进程主动放弃CPU ,因而是高效的。

    iii>举例

    事务T1请求封锁R,T2请求封锁R,T3请求封锁R……
    T1释放R之后,系统批准了T3的请求,然后是T4……请求,T2可能永远等待下去。(在整个过程中,事务T2 在不断的重复尝试获取锁R)。

    iv>与死锁区别

    活锁的时候,进程是不会阻塞的,这会导致耗尽CPU 资源,这是与死锁最明显的区别。
    处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有一定几率解开,而死锁是无法解开的。

    v>避免方式

    采用先来先服务策略。

    ②死锁

    i>概念

    是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或系统产生了死锁。

    ii>举例

    T1请求封锁R1,T2请求封锁R2,然后T1又请求封锁R2,T1一直等待T2释放R2,此时,T2请求封锁R1,T2将一直等待T1释放R1。

    iii>死锁原因

    在数据库中,产生死锁的原因主要是:
    两个或多个事务都已封锁了一些数据对象,然后又都请求其他事务已封锁的数据对象,从而出现死等待。

    产生死锁的四个必要条件:
    (1) 互斥条件:一个资源每次只能被一个进程使用。
    (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    (3) 不可剥夺条件: 进程已获得的资源,在末使用完之前,不能强行剥夺。
    (4) 环路等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系。
    只要系统发生了死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死
    锁。

    iv>死锁预防

    预防死锁的发生只需破坏死锁产生的四个必要条件之一即可。

    1. 破坏互斥条件
      如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性。
    2. 破坏不剥夺条件
      当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。
      该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源,如CPU 的寄存器及内存资源,一般不能用于打印机之类的资源。
    3. 破坏请求和保持条件
      釆用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。
      这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。
    4. 破坏环路等待条件
      为了破坏循环等待条件,可釆用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri 的资源。
      这种方法存在的问题是,编号必须相对稳定,这就限制了新类型设备的增加;尽管在为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使甩资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。

    都不好用,一般采用死锁的诊断和解除。

    v>死锁的诊断和解除

    a)超时法
    如果一个事务等待时间超时,则认为发生死锁。(可能误判)
    b)事务等待图法
    事务等待图是一个有向图,反映了事务的等待情况。如果图中出现回路,就表示出现了死锁。

    处理方案是:选择一个处理代价最小的事务,将其撤销并释放所有锁。
    a) 从死锁进程处剥夺资源
    b) 终止部分或全部进程

    5) 两段锁协议(Two-Phase Locking――2PL)

    两段锁协议规定所有的事务应遵守的规则:
    ① 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。
    ② 在释放一个封锁之后,事务不再申请和获得其它任何封锁。
    即事务的执行分为两个阶段:
    第一阶段是获得封锁的阶段,称为扩展阶段。
    第二阶段是释放封锁的阶段,称为收缩阶段。

    定理:若所有事务均遵守两段锁协议,则这些事务的所有交叉调度都是可串行化的。
    对于遵守两段协议的事务,其交叉并发操作的执行结果一定是正确的。值得注意的是,上述定理是充分条件,不是必要条件。一个可串行化的并发调度的所有事务并不一定都符合两段锁协议,存在不全是2PL的事务的可串行化的并发调度。
    同时我们必须指出,遵循两段锁协议的事务有可能发生死锁。

    此时事务T1 、T2同时处于扩展阶段,两个事务都坚持请求加锁对方已经占有的数据,导致死锁。
    为此,又有了一次封锁法。一次封锁法要求事务必须一次性将所有要使用的数据全部加锁,否则就不能继续执行。因此,一次封锁法遵守两段锁协议,但两段锁并不要求事务必须一次性将所有要使用的数据全部加锁,这一点与一次性封锁不同,这就是遵守两段锁协议仍可能发生死锁的原因所在。

    11,常见图

    DFD 数据流图(Data Flow Diagram):
    这里写图片描述
    ER图 实体-联系图(Entity-Relationship Diagram)
    这里写图片描述

    12,数据库连接:JDBC与JdbcTemplate

    13,数据库安全

    1)SQL注入

    ①概念

    在SQL 语句在拼接的情况下,用户输入为一部分sql语句。

    ②解决方法

    i> 对特殊字符进行过滤、转义或者使用预编译的sql 语句绑定变量

    SQL执行时,2种方式:
    ①字符串处理(拼接),然后执行SQL
    用户输入的时候,可以通过输入sql语句来进行SQL注入。
    ②传参,执行SQL -->交给SQL引擎**(推荐)**
    用prepareStatement,参数用set 方法进行填装。

    String sql= "insert into userlogin values(?,?)";
    PreparedStatement ps=conn.prepareStatement(sql);
    for(int i=1;i<100;i++){
    ps.setInt(1, i);
    ps.setInt(2, 8888);
    ps.executeUpdate();
    ps.close();
    conn.close();
    

    ii> 当sql 语句运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄漏服务器和数据库相关信息

    iii>检查变量的数据类型和格式

    只要是有固定格式的变量,在SQL 语句执行前,应该严格按照固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL 注入攻击。
    例如:对于where id={$id}这种形式,数据库里所有的id 都是数字,那么就应该在SQL 被执行前,检查确保变量id 是int 类型。

    iv>所有的SQL 语句都封装在存储过程中

    所有的SQL 语句都封装在存储过程中,这样不但可以避免SQL 注入,还能提高一些性能。

    14,分布式数据库

    1)概念

    分布式数据库是一个物理上分散的而逻辑上集中的数据集。
    它有三大特点: 数据分布性 逻辑关联性 站点自治性

    2)五个基本原则

    ①资源的重复性
    指分布式系统中硬件,软件以及数据的冗余配置。
    ②物理上的分布性
    从硬件,软件以及数据上看都是相互独立地分布。
    ③高层操作系统(或者分布式操作系统)
    高层操作系统负责对分布性的资源进行统一的控制,它使一个简单的硬件堆积转变为一个统一协调的工作系统。
    ④系统的透明性
    透明性是分布式系统的灵魂,实现不同层次的透明性是分布式系统必须解决的关键问题之一。
    ⑤协作的自治性
    每一节点都是一个完整的处理系统,同时又是合作的。 简而言之:分布式系统是一个多节点的,处理或数据分布的,在统一下提高综合处理能力的协作体。

    3)待解决问题

    不完整系统状态信息
    时间延迟
    通信的代价
    负载均衡

    4)分类(从控制方式角度)

    ①紧耦合式DDBMS

    全局控制信息放在一个称为中心站点的站点上。所有的全局访问都必须通过中心站点来确定远程数据片的位置。
    优点:容易实现数据的一致性和完整性。
    缺点:易产生访问瓶颈,系统效率不高,可靠性较差。

    ②联邦式DDBMS

    每个站点都包含全局控制信息的一个副本,都可以接受全局访问。任何对远程数据的请求,都可以通过广播方式传播到其他节点。
    优点:具有较好的可靠性和可用性,并行性好,更容易适应旧有的系统集成和异构分布式数据库系统的建立。
    缺点:保持数据的一致性很困难,实现难度大。

    ③组合式DDBMS

    是上述方案的折衷,它把站点分为两类,一类具有全局控制信息,称为主节点,可以接受全局任务,另一类没有全局信息,只能为主节点提供数据服务。
    优点:灵活性较好,易于实现层次控制结构。
    缺点:设计复杂。

    5)分布透明性

    即在分布式数据库系统中用户不必关心数据的分布情况。分为三个层次:

    ①分片透明性

    它是分布式数据库系统的最高透明性层次,它向用户完全屏蔽了DDB的分片信息。这样的透明性保持了高水平的数据独立性。

    ②位置透明性

    用户的应用程序不需要关心数据分片的具体存储站点,当数据库的数据片的存储站点发生改变时,只需改变对应的GRS/NRS映射就可以保持全局表示模式不发生改变

    ③数据模型透明性

    它向用户屏蔽的只是本站点的具体数据库存储及其管理情况。 在异构的情况下,这种透明性避免了用户对不同数据模型的转换的实现。
    本地透明性是3种透明方式中最低的。

    6)数据分割方法

    ①水平分割

    把全局关系的元组分割成一些子集,这些子集被称为数据分片或段(Fragment)。
    水平分割可以通过关系运算“选择”来定义。

    水平分片是对全局关系执行“选择”操作,把具有相同性质的元组进行分组,构成若干个不相交的子集.水平分片的方法可归为初级分片和导出分片两类。

    ②垂直分割

    把全局关系按照属性组(纵向)分隔成一些数据分片或段。
    垂直分割可以通过关系运算“投影”来定义。

    ③混合分割

    可把水平分割和垂直分割这两种方法结合起来使用,产生混合式数据分片。

    ④数据分片应遵循的原则

    若R={R1,R2,…,Rn}满足:
    1)完整性(completeness)条件:
    如果分片 a∈R,则必有a∈Ri,i=l,2,…,n
    2)可重构(reconstructed)条件:
    R=∪ Ri,(水平分片)或R=∞Ri,(垂直分片)
    3)不相交(disjoint)条件:
    Ri∩ Rj=φ,i≠j,I,j:=1,2,…,,n(水平 分片)
    Ri∩Rj=主键属性,I,j=1,2,…,n(垂直分片)

    7)分布式数据库和集中式区别

    分布式(distributed)是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务。
    集群(cluster)是指在多台不同的服务器中部署相同应用或服务模块,构成一个集群,通过负载均衡设备对外提供服务。

    15,数据库优化

    1)优化SQL 语句

    ①explain

    通过explain(查询优化神器)用来查看SQL 语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。
    通常我们可以对比较复杂的尤其是涉及到多表的SELECT 语句,把关键字EXPLAIN 加到前面,查看执行计划。例如:explain select * from news;

    explain语法:

    explain select … from … [where ...] 
    

    ② 用具体的字段列表代替“*

    任何地方都不要使用select * from t ,不要返回用不到的任何字段。

    ③ 不在索引列做运算或者使用函数

    ④ 查询尽可能使用limit 减少返回的行数,减少数据传输时间和带宽浪费。

    2)优化表的数据类型

    ① 使用procedure analyse()函数对表进行分析

    该函数可以对表中列的数据类型提出优化建议。能小就用小。表数据类型第一个原则是:使用能正确的表示和存储数据的最短类型。这样可以减少对磁盘空间、内存、cpu 缓存的使用。
    使用方法:select * from 表名procedure analyse();

    ② 对表进行拆分

    通过拆分表可以提高表的访问效率。有2 种拆分方法:
    1.垂直拆分
    把主键和一些列放在一个表中,然后把主键和另外的列放在另一个表中。如果一个表中某些列常用,而另外一些不常用,则可以采用垂直拆分。
    2.水平拆分
    根据一列或者多列数据的值把数据行放到二个独立的表中。

    ③ 使用中间表来提高查询速度

    创建中间表,表结构和源表结构完全相同,转移要统计的数据到中间表,然后在中间表上进行统计,得出想要的结果。

    3)硬件优化

    ①CPU 的优化

    选择多核和主频高的CPU。

    ②内存的优化

    使用更大的内存。将尽量多的内存分配给MYSQL 做缓存。

    ③磁盘I/O 的优化

    i>使用磁盘阵列

    RAID 0 没有数据冗余,没有数据校验的磁盘陈列。实现RAID 0至少需要两块以上的硬盘,它将两块以上的硬盘合并成一块,数据连续地分割在每块盘上。
    RAID1 是将一个两块硬盘所构成RAID 磁盘阵列,其容量仅等于一块硬盘的容量,因为另一块只是当作数据“镜像”。
    使用RAID-0+1 磁盘阵列。RAID 0+1 是RAID 0 和RAID 1 的组合形式。它在提供与RAID 1 一样的数据安全保障的同时,也提供了与RAID 0 近似的存储性能。

    ii>调整磁盘调度算法

    选择合适的磁盘调度算法,可以减少磁盘的寻道时间。

    4)MySQL 自身的优化

    对MySQL 自身的优化主要是对其配置文件my.cnf 中的各项参数进行优化调整。如指定MySQL 查询缓冲区的大小,指定MySQL 允许的最大连接进程数等。

    5)应用优化

    ①使用数据库连接池

    ②使用查询缓存

    它的作用是存储select 查询的文本及其相应结果。如果随后收到一个相同的查询,服务器会从查询缓存中直接得到查询结果。查询缓存适用的对象是更新不频繁的表,当表中数据更改后,查询缓存中的相关条目就会被清空。

    6)大访问量的优化

    ①使用优化查询的方法

    (见上面)

    ②主从复制,读写分离

    i>主从复制(master,slave):

    通过配置两台(或多台)数据库的主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站可以利用数据库的这一功能,实现数据库的读写分离,从而改善数据库的负载压力。一个系统的读操作远远多于写操作,因此写操作发向master,读操作发向slaves 进行操作(简单的轮循算法来决定使用哪个slave)。
    利用数据库的读写分离,Web 服务器在写数据的时候,访问主数据库(Master),主数据库通过主从复制机制将数据更新同步到从数据库(Slave),这样当Web 服务器读数据的时候,就可以通过从数据库获得数据。这一方案使得在大量读操作的Web 应用可以轻松地读取数据,而主数据库也只会承受少量的写入操作,还可以实现数据热备份,可谓是一举两得的方案。
    这里写图片描述

    负载均衡(Load Balance,简称LB)

    7)数据库分表、分区、分库

    分表见上面描述。
    分区就是把一张表的数据分成多个区块,这些区块可以在一个磁盘上,也可以在不同的磁盘上,分区后,表面上还是一张表,但数据散列在多个位置,这样一来,多块硬盘同时处理不同的请求,从而提高磁盘I/O 读写性能,实现比较简单。包括水平分区和垂直分区。
    分库是根据业务不同把相关的表切分到不同的数据库中,比如web、bbs、blog 等库。

    17,应用

    1)服务器与服务器之间传输文件夹下的文件,一个文件夹下有10 个文件,另一个文件夹下有100 个文件,两个文件夹大小相等,问,哪个传输更快?

    10 个文件更快。
    1)建立连接数更少,建立连接的开销比传输文件的开销大。
    2)文件写入磁盘,要计算文件的起始位置,文件数目少的话,这个开销就小了

    展开全文
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    前端面试题汇总 ... 你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? 21 ... 21 Quirks模式是什么?它和Standards模式有什么区别 21 div+css的布局较table布局有什么优点?...img的alt与title有何异同?...

    前端面试题汇总

    一、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. FPGA现状

      万次阅读 多人点赞 2019-07-16 19:51:42
      麒麟、大唐联芯),并成功实现商业化,这在10年前都不敢相信。在我们在过去积累的技术沉淀和创新能力,已经使得我们在FPGA的特定应用领域(军工、通讯)实现一定程度上的自我供给。未来也可能类似于CPU+FPGA用于云...

        FPGA国内现状

        目前中国IC厂商在FPGA这个细分领域和国外巨头的差距远远比其他领域要大。

        FPGA技术门槛非常高,核心技术只掌握在及其少数的公司手上,而且xilinx和atlera手头握有6000多项专利,对后进者形成很高的技术壁垒,国内厂商要么和国外巨头专利交叉授权,要么花钱买专利,但当前我们并没有多少专利可以和xilinx和altera进行交叉许可,购买难度更大,这不仅仅是资金的问题。从canyon bridge收购latTIce被美国否决来看,凡涉及到美国国家安全的高新技术公司,我国是不可能通过收购来获得的,latTIce在行业内充其量是第二团队尚且如此,业界领先的企业我国更难获得。

        国内FPGA的发展只能靠自主,虽然这个过程可能会很漫长,但除此之外没有更好的选择。芯片的自主设计是实现信息安全的最底层保障。这也是为什么与信息处理相关的基础芯片(手机芯片、PC处理器等)需要实现自制的原因。在目前FPGA的技术和供给几乎全部来源于美国,包括欧洲和日本等技术强国也没有掌握到核心技术。

        对于中国而言,国家促进集成电路发展已经提升至国家战略。同时特殊的应用场景(军工、导弹、航天航空)的要求的FPGA,国外对中国是禁运的,这也从另一方面促成国内FPGA自制的契机。目前,国内生产的FPGA主要用于军工、通讯、航空航天等领域。

        在民用领域,国内是FPGA需求最大的市场,现在Xilinx、Altera最大的客户就在中国,通讯市场华为中兴烽火包揽了全国60%以上的量。中国FPGA的发展红利在于需求市场足够大,有需求就要有相应产品来支持。这对于国内厂家就是机会,目前,同方国芯片已经和华为中兴合作,想实现一部分的国产替代。

        最后,从技术角度来说,我们已经不像10年前基本不懂核心技术。国内半导体产业链的不断成熟完善,以及芯片设计能力的不断加强,我们自己可以自主设计和流片ARM架构的手机CPU(海思麒麟、大唐联芯),并成功实现商业化,这在10年前都不敢相信。在我们在过去积累的技术沉淀和创新能力,已经使得我们在FPGA的特定应用领域(军工、通讯)实现一定程度上的自我供给。未来也可能类似于CPU+FPGA用于云数据中心节中,这些应用领域都是信息高度敏高的地方,使用自主设计的芯片更能实现安全可控。

      FPGA市场现状和未来趋势如何?

        中国FPGA的机遇

        为了满足经济发展和国防需求,打破美国的垄断,中国政府多年来投入了数百亿科研经费,通过逆向工程方式仿制美国对我禁运的FPGA产品。但由于知识产权、生产工艺和软件技术等多方面的限制,仿制品种有限,技术无法突破,难以满足国家安全的需要。随着国际形势的变化,通过走私进口禁运产品的渠道可能被切断,进口的关键芯片也可能被人为地嵌入后门通道或定时炸弹等模块,严重危及国家安全。

        我们不得不承认国产FPGA产业与国际巨头还存在较大的差距,不论从产品性能、功能、功耗、软件、应用支撑上都有差距。甚至成本上,我们的优势也不大。

        但是,中国拥有超过50亿元的FPGA市场。“十二五”期间,中国的可编程器件市场仍将保持年均30%以上的增长速度。中国尤其是北京等重要研究部门急需也长期需要FPGA用于国家安全和重点应用,比如航天航空、信息安全、知识产品保护等。此外,中国电子产品市场要求敏捷快速的研发周期和少量多样的产品形态,最适合FPGA应用。

        因此,中国FPGA产业享有巨大的发展空间,机遇与挑战并存。

        全球FPGA市场发展前景展望

        当今,半导体市场格局已成三足鼎立之势,FPGA,ASIC和ASSP三分天下。市场统计数据表明,FPGA已经逐步侵蚀ASIC和ASSP的传统市场,并处于快速增长阶段。

        在全球市场中,Xilinx、Altera两大公司对FPGA的技术与市场仍然占据绝对垄断地位。两家公司占有将近90%市场份额,专利达6000余项之多,而且这种垄断仍在加强。同时,美国政府对我国的FPGA产品与技术出口进行苛刻的审核和禁运,使得国家在航天、航空乃至国家安全领域都受到严重制约。因此,研发具有自主知识产权的FPGA技术与产品对打破美国企业和政府结合构成的垄断,及国家利益意义深远。

        作为一种可编程逻辑器件,FPGA在短短二十多年中从电子设计的外围器件逐渐演变为数字系统的核心。伴随半导体工艺技术的进步,FPGA器件的设计技术取得了飞跃发展及突破。通过FPGA器件的发展历程来看,今后仍将朝下以下几个方向发展:

        ·高密度、高速度、宽频带、高保密;

        ·低电压、低功耗、低成本、低价格;

        ·IP软/硬核复用、系统集成;

        ·动态可重构以及单片集群;

        ·紧密结合应用需求,多元化发展。

        此外,集成了FPGA架构、硬核CPU子系统(ARM/MIPS/MCU)及其他硬核IP的芯片已经发展到了一个“关键点”,它将在今后数十年中得到广泛应用,为系统设计人员提供更多的选择。例如,以应用为导向,在受专利保护的FPGA平台架构上无缝集成特定功能模块,以形成具备行业竞争优势(高性价比)的独特产品。Altera、Cypress®半导体、Intel®和Xilinx®公司等供应商相继在最近一年发布或者开始发售SoCFPGA器件。

        在FPGA领域,Xilinx和Altera长期稳坐第一第二的位置。根据最新Form-10K数据显示,其分别占有48%和41%的市场份额。其中Xilinx净销售额为23.1亿美元,净收入为6.3亿美元;Altera净销售额为19.5亿美元,净收入为7.8亿美元。这两家公司一直以来是市场和技术的领头羊,而剩余的市场份额被LatTIce占据多数。

        为了在竞争中占据主动,Xilinx与Altera新近分别宣布其下一代FPGA产品都将采用高k金属栅技术的 28nm工艺,以满足诸如云计算、移动互联网和3G应用等领域所不断增长的带宽需求。由于PLD器件采用更高技术的工艺节点制造,无疑可以降低成本、提升性能,尤其是能够改进一直以来为ASIC所诟病的功耗水平,以适应更广阔的设计应用。

        Xilinx和Altera虽然控制世界将近90%的FPGA市场,但是他们的产品是大多以纯FPGA为主。“平台化”已成为FPGA一个发展趋势,尽管Xilinx和Altera在FPGA“平台化”方面在最近几年也有涉及,但概念和特点比较简单,没有完全形成气候。

        权威市场调研机构Gartner 2010年初的预测数据表明,FPGA正处于一个加速增长的市场势态中。未来5年,市场平均增长幅度超过12.6%,这种增长幅度远大于ASIC和ASSP市场。同时,市场数据表明其行业平均毛利大于60%。FPGA行业需要更大的市场规模,以吸引更多的使用者。预计未来5年,随着产量增加,成本进一步降低,FPGA市场份额将会持续增大。

       

      今天先就从FPGA开始说起吧。

      FPGA——现场可编程门阵列,是指一切通过软件手段更改、配置器件内部连接结构和逻辑单元,完成既定设计功能的数字集成电路。换个简单通俗的介绍方式,就好比一个全能运动员,游泳如孙杨、跨栏像刘翔、网球能力堪比李娜,FPGA就是这么神奇的可以通过设定而实现各种复杂的功能电路。FPGA的核心优点:可编程灵活性高、开发周期短、并行计算可编程灵活性高。同时FPGA也有自身的很多需要解决的问题,FPGA限制因素:成本、功耗和编程设计。

      关于国产FPGA发展现状以及未来发展前景趋势详解

      市场空间:

      根据权威市场调研机构Gartner数据显示,2014年全球FPGA市场总规模达到50亿美金,其中,中国的市场份额有15亿美金,中国市场占全球市场的三分之一。分析机构预计2015年至2020年全球FPGA市场的年复合增长率为9%,到2020年全球FPGA 市场规模将达84亿美金。

      具体细分领域来看,在FPGA被用于深度学习之前,FPGA主要有3大应用方向:(1)通信设备的高速接口电路设计,FPGA可以用来做高速信号处理,一般如果AD采样率高,数据速率高,这时就需要FPGA对数据进行处理,比如对数据进行抽取滤波,降低数据速率,使信号容易处理,传输,存储;(2)数字信号处理方向/数学计算方向,包括图像处理,雷达信号处理,医学信号处理等,优势是实时性好,用面积换速度,比CPU快的多;(3)SOPC,即利用FPGA这个平台搭建的一个嵌入式系统的底层硬件环境,然后设计者在上面进行嵌入式软件开发。

      FPGA国际市场

      1984年Xilinx刚刚创造出FPGA时,它还是简单的胶合逻辑芯片,而如今在信号处理和控制应用中,它已经取代了自定制专用集成电路(ASIC)和处理器。短短30年的历史长河中,超过上百家行业巨头杀入这个市场,不过最后大部分都铩羽而归。这些公司包括了Intel、Philips、Agere Systems、AMD以及摩托罗拉等国际知名的芯片设计厂商。这是因为,赛灵思Altera在这个领域深耕几十年,两家持续不断地军备竞赛,占据了90%市场,提前布局的专利保护对后来者形成了强大的市场壁垒,几乎封锁了所有通向FPGA商用产品的通途。而MicrosemilatTIce,QuickLogic曾经挑战他们的霸主地位,但是他们的市场份额加起来也不到10%。而最后也因为种种原因市场份额不断下滑,并没有实现对双寡头的突破和挑战。

      可以说,FPGA是全球芯片设计业最需要技术和垄断突破的产品之一,在所有的芯片领域中属于最难以突破和打破格局的技术产品。

      Xilinx:发明的FPGA颠覆了半导体世界,创立了Fabless(无晶圆厂)的半导体模式。Xilinx的产品组合融合了 FPGA、SoC 和 3DIC 系列 All Programmable 器件,以及全可编程的开发模型,包括软件定义的开发环境等。产品支持 5G 无线、嵌入式视觉、工业物联网和云计算所驱动的各种智能、互连和差异化应用。2014年12月,Xilinx的20nm芯片实现量产,2015年Xilinx紧接着推出新的16nm FPGA和SoC,并采用新型存储器UltraRAM,因此继28nm和20nm之后,继续在行业中保持领先。公司产品纵向布局各个制程,因为20nm、28nm、40nm等制程的产品会在市场共存,以满足复杂度不同的各种应用。

      Altera:是世界上“可编程芯片系统”(SOPC)解决方案倡导者。结合带有软件工具的可编程逻辑技术、知识产权(IP)和技术服务,在世界范围内为14,000多个客户提供高质量的可编程解决方案。2015年,英特尔宣布以167亿美元收购FPGA厂商Altera。这是英特尔公司历史上规模最大的一笔收购。随着收购完成,Altera将成为英特尔旗下可编程解决方案事业部。在和Xilinx的制程战之争中,两家巨头各领风骚,Altera路线图中,最近的产品系列"Cedar"(替代Cyclone)采用了台积电16nm工艺将在2016年上半年交付使用。"Oak"系列采用英特尔的14nm工艺,于2016年下半年交付,"Sequoia"采用英特尔的10nm工艺,将于2018年上市Altera将赢得10nm工艺节点之战。

      LatTIce:LatTIce(是全球智能互连解决方案市场的领导者,也是全球第二大FPGA厂,提供市场领先的IP和成本低、功耗小、小尺寸的器件。产品主要有三大块:可编程逻辑;视频传输;毫米波解决方案。公司的最终用户主要是通讯、计算机、工业、汽车、医药、军事及消费品市场的原始设备生产商。在双大哥的夹击之下,LatTIce的路也是走的越发艰难,在中高端市场难以与前两者抗衡。

      中国的破局

      紫光集团想通过购买Lattice快速发展,受到美国外国投资委员会(CFIUS)的审查和特朗普政府的反对后收购以失败告终。那对于国内FPGA如何破局,如何发展,在无法通过外延引入技术的条件下,国内也只能通过人研发和技术积累打破当前的这种格局。

      京微雅格:公司聚集了最早在FPGA行业耕耘与尝试的一批技术精英,他们采用了SoC FPGA的战略,片上整合了DSP、Memory、MCU等单元的CME-GM7系列,试图通过整合的优势打破FPGA市场的壁垒。这个公司实际上有两条产品线:1、自身从头研发的,面向中低端市场的金山系列;2、收购美国CSwitch的产品线,面向高速通信市场。

      产品型号:M7华山系列;HR3纯FPGA低功耗系列;M5金山系列;M1衡山系列。

      不过比较可惜是,在特定的国内行情和市场环境下,公司在发出自己最强音后也由于种种原因走入困境,让自己举步维艰。FPGA对技术支持的门槛相当高,由于京微雅格没有办法做到Pin-Pin,所以需要每一个产品都要有技术工程师保持长时间的维护和跟进,但是产品的成功率还可能不到10%,这样的市场环境下,公司会陷入一种非常被动的局面,长时间的战略失误让京微雅格陷入了人才、资本和发展僵局。

      京微雅格的失败有很多值得思考的地方,FPGA产业的成功不仅在产品,还在于产品线的生态系统平台建设。这个生态系统平台包括:FPGA芯片、EDA工具、IP库……缺一不可。完善的生态系统能够提供给用户更全面的设计资源,从而突出系统优势,迅速适应各种市场应用变化,快速抢占市场高地。同时,市场上的认可是决定芯片厂商能不能在高速的产品迭代中实现技术和资金的积累的重要因素,任何不被市场接受的高性能产品都是失败的。

      黄埔军校之后的国内格局

      京微雅格在FPGA上的努力和成果给了本土后继者很大的动力;京微雅格很多的技术研究人员在进入了后续成立的上海安路科技,AGM和高云半导体团队里。也就是说,京微雅格在中国FPGA领域的开山鼻祖一样的存在使得散乱后的技术人才分散都国内其余的公司中,成为了人才与技术的黄埔军校。

      高云半导体:高云半导体的CEO朱璟辉和SVP宋宁都来自于Lattice团队,尤其是朱璟辉,从清华大学毕业后,1996年-2011年任职Lattice,历经七代FPGA产品的研发,曾获得11项美国专利,5项中国专利,目前还是科技部863计划的可编程器件重大专项的技术负责人。而另一个核心人物宋宁除了任职Lattice高工,还任职过Cadence高工。目前负责高云半导体FPGA全流程软件开发,对FPGA架构、硬件设计、软件研发同步开发有独到经验。所以,Synopsys为高云提供前SynplifyPro高云版端软件软件,也是中国唯一由新思授权的FPGA前端软件。

      低密度非易失性FPGA已经完全取代传统CPLD,并成为低密度FPGA市场的绝对主力,每年约5亿美元的市场销量。可以说,高云半导体切入和对标的是Altera MAX V10和Lattice XO2/3;100万门-500万门易失性FPGA产品,采用台积电55nm基于SRAM,可与Xillinx Spartan及Altera Cyclone系列PK。近日,高云宣布研发成功了GW3AT-100,这是国内首款28纳米中高密度FPGA,由台积电代工。

      上海安路科技:上海安路信息科技有限公司成立于2011年,总部位于浦东张江,创始人为文余波。公司创始人及核心团队来自海外高级技术管理人才、国外FPGA公司产品开发骨干以及学术界资深FPGA科研人员组成。公司研发团队60%以上是复旦、交大、UCLA、UIUC等国内外高校的硕士或者是博士,具有很强的研究能力和设计水准。核心工作成员大多数在世界前五的FPGA公司和EDA公司中从事数十年以上技术研和管理工作,参与开发了多款世界领先的FPGA 芯片和最好的EDA 开发系统。安路当前已经形成了从小规模CPLD(Elf-300、Elf-650)到2百万门FPGA(EG-4、AL3-6、AL3-10、AL3-S10、EG-20、EG-D20)的系列器件,以及一颗已经实际应用了的千万门级FPGA IP核(AL3-130)。华大半导体入股之后,其作为国内最大的国产EDA软件商华大九天与作为自主FPGA厂商安路科技,双方在EDA工具上的合作空间,包括互补性上,都具有很大的想象力。

      AGM:上海遨格芯微电子有限公司(AGM)成立于2012年,是国内领先的以可编程逻辑技术为基础,提供应用市场SoC芯片的半导体集成电路无生产线设计公司。由来自美国硅谷知名可编程逻辑芯片企业的团队和国内资深工程团队创办。AGM是以开发自主产权的编译软件开始,兼容切入现有FPGA软件的生态链。看到智能手机风口的AGM也不失时机出了一款用于智能手机和loT的FPGA芯片,在助力客户逐渐退出低端市场之时,把握住机会,通过价格优势抢夺低端市场。通过最近几年的不断地产品迭代和市场扩展,AGM悄悄地积累了比较稳定的客户,产品线也开始丰富起来,成为了国内FPGA的一批发展迅猛的黑马。

      同创国芯:国产化替代率最大,利润最高的军工院所应用市场,基本上被同创国芯(深圳国微)垄断。连当年的竞争对手成都华微,也是基本没有了声响。而且,同创国芯的民用拳头产品Titan PGT30G已量产,该系列芯片可编程逻辑器件采用了完全自主产权的体系结构和主流先进制造工艺,带有DDR3和PCIe接口,是国内少有的千万门级FPGA。另外采用了台湾联华UMC代工先进的40nm制程,在国内领先。正在中兴通讯,烽火通信试用。

      FPGA行业的发展靠自力更生

      国内FPGA的发展只能依靠自主,这个必然需要漫长的等待和尽心的呵护,但除此之外没有更好的选择。芯片的自主设计是实现信息安全的最底层保障。这也是为什么与信息处理相关的基础芯片(手机芯片、PC处理器等)需要实现自制的原因。在目前FPGA的技术和供给几乎全部来源于美国,包括欧洲和日本等技术强国也没有掌握到核心技术。

      对于中国而言,国家促进集成电路发展已经提升至国家战略。同时特殊的应用场景(军工、导弹、航天航空)要求的FPGA是涉及到国家安全和领土安全的,对芯片的要求也会比较严谨,但这一块本身高性能的产品国外对中国是禁运的,这也从另一方面促成国内FPGA自己满足的契机。目前,国内生产的FPGA主要用于军工、通讯、航空航天等领域。

      在民用领域,国内是FPGA需求最大的市场,现在Xilinx、Altera最大的客户就在中国,通讯市场华为中兴烽火包揽了全国60%以上的量。同时人工智能芯片需求的高速并行计算对FPGA芯片的需求也在几十亿美元的数量级,而国内是人工智能高速芯片发展最快,需求最大的市场。中国FPGA的发展红利在于需求市场足够大,有需求就要有相应产品来支持。这对于国内厂家就是机会,目前,同方国芯片已经和华为中兴合作,想实现一部分的国产替代。

      最后,从技术角度来说,我们已经不像10年前基本不懂核心技术。国内半导体产业链的不断成熟完善,以及芯片设计能力的不断加强,我们自己可以自主设计和流片ARM架构的手机CPU(海思麒麟、大唐联芯),并成功实现商业化,这在10年前都不敢相信。在我们在过去积累的技术沉淀和创新能力,已经使得我们在FPGA的特定应用领域(军工、通讯)实现一定程度上的自我供给。未来也可能类似于CPU+FPGA用于云数据中心节中,这些应用领域都是信息高度敏高的地方,使用自主设计的芯片更能实现安全可控。

      后面,我还要说说我和IC界的朋友交流和我自己的一些感悟。

      1.大家为什么对于技术的追求会停留下来。因为对于很多人来说,等到技术产生产品并融到资金后,实现技术积累到资本积累了。技术再产生的价值短时间内比资本产生的价值会慢很多,多数人会从技术上转向资本市场。这样一遍遍反反复复,所以能看到在技术达到一定的平台后会长时间的原地踏步,后来者也会跟随前面人的脚步。

      2.所谓的产业扶持,切不可本末倒置和打着旗帜反革命。芯片不简单的是需要资本的支撑,因为不完善与不合理的资本炒作反而会使的行业在潮水退去后一地鸡毛。芯片更多的属于技术积累型行业,所有的产品和参数都需要技术员工在工作中不断地去突破和思考,而对于这样一群工程师来说,报酬如果不匹配劳动支出,行业内的技术人才出走与流失是再自然不过的事情了。因此,产业的扶持不仅仅是资本对公司层面的支撑,更需要落实到一个个基层中的技术员工。

      3.芯片行业起步容易,往上层走会很难。芯片做到一定程度后,不再是简单的技术积累能解决的,一定需要对物理和数学有比较深的认知,在整个高的角度去处理基础难点,而这对人才的需求地要求是非常高的。

      4.市场需求端,任何一种芯片从推出到应用,需要几代产品的更迭。国内芯片起步晚,产品性能和国外差距较大,因此会形成一种困局:国内应用端不用国内产品,国内产品更迭跟不上会导致公司倒闭或者产品无法持续更新。国外芯片行业干了几十年,技术路线上的坑和陷阱被先行者填补了很多,而芯片行业并不存在后发优势,之前别人留下的坑还会继续存在哪里,甚至还需要去避免国外厂商在探索过程中申请的成千上万的知识产权保护新增的坑。

      5.芯片行业的国产化任重而道远,我们需要在整个过程中慢慢的去探索。急功近利和空喊口号只不过给了投机分子空间可钻。呵护芯片行业同时也要提升技术人员的福利。

      展开全文
    22. 区块链学习笔记(初识区块链)

      千次阅读 多人点赞 2019-08-05 12:38:52
      EUS:类似微软的操作系统,商业化,性能大幅度提升 区块链大火,人们失去理智 阿里走在区块链技术专利的前列 二.协议分层 pow全网记账,pos全网随机选一个记账,dpos选出少数人记账 DBFT 拜占庭容错机制,...
    23. C#基础教程-c#实例教程,适合初学者

      万次阅读 多人点赞 2016-08-22 11:13:24
      可以在命令提示符窗口运行可执行文件Welcome.exe,屏幕上出现一行字符提示您输入姓名:请键入你的姓名:输入任意字符并按下回车键,屏幕将打印出欢迎信息:欢迎! 注意,和我们使用过的绝大多数编译器不同,在C#中...
    24. 商业】梳理你的商业模式

      千次阅读 2018-06-18 19:26:17
      商业模式一直是一个好像...本文不打算按照教科书的方式介绍商业模式,我们试图从多个方面展开对商业模式的讨论,包括什么是商业模式,商业模式有何价值,以及如何运用有效的工具设计商业模式。一篇文章无法覆盖商业...
    25. JAVA上百实例源码以及开源项目

      千次下载 热门讨论 2016-01-03 17:37:40
       通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...
    26. 这次疫情,给经济按下了“暂停”键。企业没有了收入,大多处于水深火热之中。很多企业都来问,我太难了,我到底应该怎么办?接触了太多身处危机的企业,看多了生死,从感情上,商业顾问对经济的判断...
    27. 商业的本质》读书笔记

      千次阅读 2019-01-16 14:28:34
      商业的本质》是2016年中信出版社出版的中译图书,作者 杰克·韦尔奇 / 苏茜·韦尔奇 杰克•韦尔奇 1960年加入通用电气公司(GE),1981至2001年担任该公司的董事长兼首席执行官,是GE历史上最年轻的董事长。在任...
    28. 商业银行业务概述

      千次阅读 2018-08-28 11:44:47
      信用中介职能实现资金盈余与资金短缺之间的融通。变小额资本为大额资本,变短期资本为长期资本 支付中介职能大大减少现金...三、国有商业银行,就是我们平时所说的四大行,是国家管控的大型银行,后加入交通银行,共...
    29. 郁金香商业辅助教程 2016 笔记 1~5

      万次阅读 2018-02-20 10:48:18
      我们要找出基本信息中,所有数据的地址。 我们要用到一款工具,CE。打开之后点击左上角打开进程,会弹出进程列表,我们需要选择游戏的进程。 我们可以点击下面的“窗口列表”,然后从打开的窗口中搜索,这样...
    30. 服务层分——RDB 分新思路

      万次阅读 2019-04-19 09:46:14
      目前国内流行的开源数据库分实现都基于 SQL 的改写、分发与结果归并。但这种实现存在一些无法避免的缺陷,本文试图说明白这些缺陷的由来及提供一个传统数据库分实现的新思路。 流行分框架实现分析 目前国内...
    31. Linux实用教程(第三版)

      万次阅读 多人点赞 2019-08-27 22:55:59
      第四章 目录和文件管理 4.1 Linux文件类型 Linux目录结构 文件和目录操作 4.4链接文件 第五章 Linux常用操作命令 5.1 文本内容显示 5.2 文件内容的处理 5.3 文件和命令查找 5.4系统信息显示 5.5日期和时间 5.6 信息...
    32. 机器视觉基础知识汇总

      千次阅读 多人点赞 2018-05-11 14:10:45
      焦距(f):是光学系统中衡量光的聚集或发散的度量方式,指从透镜的光心到光聚焦之焦点的距离,也是照相机中,从镜片中心到底或CCD等成像平面的距离。 焦距大小的影响情况:焦距越小,景深越大;焦距越小,畸变越...
    33. 商业模式是利益相关者的交易结构

      千次阅读 2018-11-11 22:47:41
      商业模式是利益相关者的交易结构
    34. 商业计划书-智能导盲仗

      千次阅读 多人点赞 2021-02-01 15:55:44
      存在超声波避障、障碍物识别、信息交互、实时精准定位几大模块功能,可以更精准地进行及时信息反馈且反馈信息更加精准有效。 2、价格低。生产一个智能化导盲杖所需要的参考材料成本为**元,且在更好地对接上游供应商...
    35. 分布式商业的春天已来

      千次阅读 2019-03-16 12:05:00
      二、互联网经济时代:信息流、资金流和物流归属于商业组织,信任锚是法律和合同; 三、分布式商业时代:信息流、资金流和物流将归属于社区,信任锚变成了代码。 组织边界就着裂缝在疯狂生长,信任锚从有机物变成无机...
    36. 互联网商业模式

      千次阅读 2018-01-12 16:56:16
      随着互联网技术的发展,网络商务活动增多,门户网站越来越多地被用于商业活动中,对以信息服务为主的门户商业模式的探索也在日益白热化。各种应用系统、数据资源和互联网资源在这里可以快速地完成企业对客户、企业对...
    37. 好纠结啊,JEECG 商业版本和开源版本有什么区别呢
    38. 转折点:移动互联网时代的商业法则(失控、颠覆式、社交化和去中介化的自媒体时代作品,移动互联网商业的有趣杂谈) 许维 著 ISBN 978-7-121-22760-8 2014年5月出版 定价:49.00元 204页 16开 编辑推荐 一...
    39. 作者:TAVISH SRIVASTAVA翻译:Nicola校对:丁楠雅本文共3400字,建议阅读9分钟。本文将介绍商业分析领域里有哪些主要角色,并提出一个框架帮助你思考你...
    40. 最近由于要存储大规模结构化数据,想到了MongoDB的口号For giant ...比如mycat或者mysqlproxy这种数据库网关就可以放置在多个普通的mysql服务器前面,或者像腾讯退出的TDSQL这种商业版本也是有内置数据库网关的,...
    41. 互联网思维到底是什么——移动浪潮下的新商业逻辑(2014最不可错过的系统剖析互联网思维与新商业模式的真诚之作!通过30余个典型案例深刻解读互联网思维与新商业模式!抢占风口从本书开始!) 项建标 蔡华 柳...
    42. 应用区块链技术,商业银行支付结算体系、工具和服务、系统和标准、制度和管理等都将全面而深刻的变化,每家商业银行战略规划、市场定位、客户、风险偏好、产品与服务、系统、管理制度、业务基础等都不尽相同,因此,...
    43. 基于STC89C51单片机的温湿度检测系统

      万次阅读 多人点赞 2019-02-21 21:04:30
      其主要特性如下: 工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机) 工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz 用户应用程序空间为12K/10K/8K/6K/4K/2K字节 上集成512...
    44. 前言 capital one 作为全球消金、互金和银行信用卡中心学习的典范, ...下面将解析一下capital one 的商业模式和大数据风控模式,希望对你有所启发。 一、Capital One概况及成长史 1988年,美国的大部分信用卡...
    45. 数据库分区分(Shards)技术概览

      万次阅读 2018-01-05 14:23:59
      分区功能并不总是可用的(MySQL 直到 5.1 版本后才支持),而且其需要的商业系统的成本也让人望而却步。更重要的是,大部分分区实现在同一个物理机上存储数据,所以受到硬件基础的影响。除此之外,分区也不能鉴别...
    46. 社区或志愿者进行研究活动,发布研究成果——源代码,而商业公司根据公开的源代码继续开发,将源代码转变为软件产品、服务,从而获利。这样,既促进了知识的共享,同时又能确保知识转化为可靠的商品。 “开源软件...
    47. 隐私计算(Privacy Computing)又称隐私增强计算(Privacy-Enhancing Computation)或机密计算(Confidential Computing),隐私也即是信息安全中的机密性。 按照普遍定义,“隐私计算”是指在处理和分析计算数据的...

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 53,183
    精华内容 21,273
    关键字:

    商业信息片