精华内容
下载资源
问答
  • MyBatis面试题(2020最新版)

    万次阅读 多人点赞 2019-09-24 16:40:33
    6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储映射的 SQL 语句的 id、参数等信息。 7)输入参数映射:输入参数类型可以是 Map...

    Java面试总结(2021优化版)已发布在个人微信公众号【技术人成长之路】,优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结,删除了低频问题,添加了一些常见面试题,对文章进行了精简优化,欢迎大家关注!😊😊

    【技术人成长之路】,助力技术人成长!更多精彩文章第一时间在公众号发布哦!

    文章目录

    Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…

    序号内容链接地址
    1Java基础知识面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390612
    2Java集合容器面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588551
    3Java异常面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390689
    4并发编程面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104863992
    5JVM面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390752
    6Spring面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397516
    7Spring MVC面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397427
    8Spring Boot面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397299
    9Spring Cloud面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397367
    10MyBatis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/101292950
    11Redis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/103522351
    12MySQL数据库面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104778621
    13消息中间件MQ与RabbitMQ面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588612
    14Dubbo面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390006
    15Linux面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588679
    16Tomcat面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397665
    17ZooKeeper面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397719
    18Netty面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104391081
    19架构设计&分布式&数据结构与算法面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/105870730

    整理好的MyBatis面试题库,史上最全的MyBatis面试题,MyBatis面试宝典,特此分享给大家

    MyBatis简介

    MyBatis是什么?

    MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    ORM是什么

    ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。

    为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

    Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。

    而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

    传统JDBC开发存在的问题

    • 频繁创建数据库连接对象、释放,容易造成系统资源浪费,影响系统性能。可以使用连接池解决这个问题。但是使用jdbc需要自己实现连接池。
    • sql语句定义、参数设置、结果集处理存在硬编码。实际项目中sql语句变化的可能性较大,一旦发生变化,需要修改java代码,系统需要重新编译,重新发布。不好维护。
    • 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
    • 结果集处理存在重复代码,处理麻烦。如果可以映射成Java对象会比较方便。

    JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

    1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

    解决:在mybatis-config.xml中配置数据链接池,使用连接池管理数据库连接。

    2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

    解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

    3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

    解决: Mybatis自动将java对象映射至sql语句。

    4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

    解决:Mybatis自动将sql执行结果映射至java对象。

    Mybatis优缺点

    优点

    与传统的数据库访问技术相比,ORM有以下优点:

    • 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用
    • 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接
    • 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)
    • 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护
    • 能够与Spring很好的集成

    缺点

    • SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求
    • SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

    MyBatis框架适用场景

    • MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。
    • 对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

    Hibernate 和 MyBatis 的区别

    相同点

    都是对jdbc的封装,都是持久层的框架,都用于dao层的开发。

    不同点

    映射关系

    • MyBatis 是一个半自动映射的框架,配置Java对象与sql语句执行结果的对应关系,多表关联关系配置简单
    • Hibernate 是一个全表映射的框架,配置Java对象与数据库表的对应关系,多表关联关系配置复杂

    SQL优化和移植性

    • Hibernate 对SQL语句封装,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供 HQL(Hibernate Query Language)操作数据库,数据库无关性支持好,但会多消耗性能。如果项目需要支持多种数据库,代码开发量少,但SQL语句优化困难。
    • MyBatis 需要手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。开发工作量相对大些。直接使用SQL语句操作数据库,不支持数据库无关性,但sql语句优化容易。

    开发难易程度和学习成本

    • Hibernate 是重量级框架,学习使用门槛高,适合于需求相对稳定,中小型的项目,比如:办公自动化系统

    • MyBatis 是轻量级框架,学习使用门槛低,适合于需求变化频繁,大型的项目,比如:互联网电子商务系统

    总结

    MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,

    Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。

    MyBatis的解析和运行原理

    MyBatis编程步骤是什么样的?

    1、 创建SqlSessionFactory

    2、 通过SqlSessionFactory创建SqlSession

    3、 通过sqlsession执行数据库操作

    4、 调用session.commit()提交事务

    5、 调用session.close()关闭会话

    请说说MyBatis的工作原理

    在学习 MyBatis 程序之前,需要了解一下 MyBatis 工作原理,以便于理解程序。MyBatis 的工作原理如下图

    MyBatis工作原理

    1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。

    2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。

    3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。

    4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。

    5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。

    6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。

    7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。

    8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

    MyBatis的功能架构是怎样的

    Mybatis功能框架
    我们把Mybatis的功能架构分为三层:

    • API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
    • 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
    • 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

    MyBatis的框架架构设计是怎么样的

    Mybatis框架架构

    这张图从上往下看。MyBatis的初始化,会从mybatis-config.xml配置文件,解析构造成Configuration这个类,就是图中的红框。

    (1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

    (2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。

    (3)SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。

    (4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。

    为什么需要预编译

    1. 定义:
      SQL 预编译指的是数据库驱动在发送 SQL 语句和参数给 DBMS 之前对 SQL 语句进行编译,这样 DBMS 执行 SQL 时,就不需要重新编译。

    2. 为什么需要预编译
      JDBC 中使用对象 PreparedStatement 来抽象预编译语句,使用预编译。预编译阶段可以优化 SQL 的执行。预编译之后的 SQL 多数情况下可以直接执行,DBMS 不需要再次编译,越复杂的SQL,编译的复杂度将越大,预编译阶段可以合并多次操作为一个操作。同时预编译语句对象可以重复利用。把一个 SQL 预编译后产生的 PreparedStatement 对象缓存下来,下次对于同一个SQL,可以直接使用这个缓存的 PreparedState 对象。Mybatis默认情况下,将对所有的 SQL 进行预编译。

    Mybatis都有哪些Executor执行器?它们之间的区别是什么?

    Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。

    SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。

    ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。

    BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

    作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。

    Mybatis中如何指定使用哪一种Executor执行器?

    在Mybatis配置文件中,在设置(settings)可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数,如SqlSession openSession(ExecutorType execType)。

    配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。

    Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

    Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

    它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

    当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。

    映射器

    #{}和${}的区别

    • #{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理。

    • Mybatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值。

    • Mybatis在处理 时 , 是 原 值 传 入 , 就 是 把 {}时,是原值传入,就是把 {}替换成变量的值,相当于JDBC中的Statement编译

    • 变量替换后,#{} 对应的变量自动加上单引号 ‘’;变量替换后,${} 对应的变量不会加上单引号 ‘’

    • #{} 可以有效的防止SQL注入,提高系统安全性;${} 不能防止SQL 注入

    • #{} 的变量替换是在DBMS 中;${} 的变量替换是在 DBMS 外

    模糊查询like语句该怎么写

    (1)’%${question}%’ 可能引起SQL注入,不推荐

    (2)"%"#{question}"%" 注意:因为#{…}解析成sql语句时候,会在变量外侧自动加单引号’ ',所以这里 % 需要使用双引号" ",不能使用单引号 ’ ',不然会查不到任何结果。

    (3)CONCAT(’%’,#{question},’%’) 使用CONCAT()函数,推荐

    (4)使用bind标签

    <select id="listUserLikeUsername" resultType="com.jourwon.pojo.User">
      <bind name="pattern" value="'%' + username + '%'" />
      select id,sex,age,username,password from person where username LIKE #{pattern}
    </select>
    

    在mapper中如何传递多个参数

    方法1:顺序传参法

    public User selectUser(String name, int deptId);
    
    <select id="selectUser" resultMap="UserResultMap">
        select * from user
        where user_name = #{0} and dept_id = #{1}
    </select>
    

    #{}里面的数字代表传入参数的顺序。

    这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错。

    方法2:@Param注解传参法

    public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);
    
    <select id="selectUser" resultMap="UserResultMap">
        select * from user
        where user_name = #{userName} and dept_id = #{deptId}
    </select>
    

    #{}里面的名称对应的是注解@Param括号里面修饰的名称。

    这种方法在参数不多的情况还是比较直观的,推荐使用。

    方法3:Map传参法

    public User selectUser(Map<String, Object> params);
    
    <select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">
        select * from user
        where user_name = #{userName} and dept_id = #{deptId}
    </select>
    

    #{}里面的名称对应的是Map里面的key名称。

    这种方法适合传递多个参数,且参数易变能灵活传递的情况。

    方法4:Java Bean传参法

    public User selectUser(User user);
    
    <select id="selectUser" parameterType="com.jourwon.pojo.User" resultMap="UserResultMap">
        select * from user
        where user_name = #{userName} and dept_id = #{deptId}
    </select>
    

    #{}里面的名称对应的是User类里面的成员属性。

    这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑处理方便,推荐使用。

    Mybatis如何执行批量操作

    使用foreach标签

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach标签的属性主要有item,index,collection,open,separator,close。

    • item  表示集合中每一个元素进行迭代时的别名,随便起的变量名;
    • index  指定一个名字,用于表示在迭代过程中,每次迭代到的位置,不常用;
    • open  表示该语句以什么开始,常用“(”;
    • separator表示在每次进行迭代之间以什么符号作为分隔符,常用“,”;
    • close  表示以什么结束,常用“)”。

    在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:

    1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
    2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
    3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,
      map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

    具体用法如下:

    <!-- 批量保存(foreach插入多条数据两种方法)
           int addEmpsBatch(@Param("emps") List<Employee> emps); -->
    <!-- MySQL下批量保存,可以foreach遍历 mysql支持values(),(),()语法 --> //推荐使用
    <insert id="addEmpsBatch">
        INSERT INTO emp(ename,gender,email,did)
        VALUES
        <foreach collection="emps" item="emp" separator=",">
            (#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
        </foreach>
    </insert>
    
    <!-- 这种方式需要数据库连接属性allowMutiQueries=true的支持
     如jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true -->  
    <insert id="addEmpsBatch">
        <foreach collection="emps" item="emp" separator=";">                                 
            INSERT INTO emp(ename,gender,email,did)
            VALUES(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
        </foreach>
    </insert>
    

    使用ExecutorType.BATCH

    Mybatis内置的ExecutorType有3种,默认为simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优; 但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的

    具体用法如下

    //批量保存方法测试
    @Test  
    public void testBatch() throws IOException{
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        //可以执行批量操作的sqlSession
        SqlSession openSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
    
        //批量保存执行前时间
        long start = System.currentTimeMillis();
        try {
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            for (int i = 0; i < 1000; i++) {
                mapper.addEmp(new Employee(UUID.randomUUID().toString().substring(0, 5), "b", "1"));
            }
    
            openSession.commit();
            long end = System.currentTimeMillis();
            //批量保存执行后的时间
            System.out.println("执行时长" + (end - start));
            //批量 预编译sql一次==》设置参数==》10000次==》执行1次   677
            //非批量  (预编译=设置参数=执行 )==》10000次   1121
    
        } finally {
            openSession.close();
        }
    }
    

    mapper和mapper.xml如下

    public interface EmployeeMapper {   
        //批量保存员工
        Long addEmp(Employee employee);
    }
    
    <mapper namespace="com.jourwon.mapper.EmployeeMapper"
         <!--批量保存员工 -->
        <insert id="addEmp">
            insert into employee(lastName,email,gender)
            values(#{lastName},#{email},#{gender})
        </insert>
    </mapper>
    

    如何获取生成的主键

    对于支持主键自增的数据库(MySQL)

    <insert id="insertUser" useGeneratedKeys="true" keyProperty="userId" >
        insert into user( 
        user_name, user_password, create_time) 
        values(#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP})
    </insert>
    

    parameterType 可以不写,Mybatis可以推断出传入的数据类型。如果想要访问主键,那么应当parameterType 应当是java实体或者Map。这样数据在插入之后 可以通过ava实体或者Map 来获取主键值。通过 getUserId获取主键

    不支持主键自增的数据库(Oracle)

    对于像Oracle这样的数据,没有提供主键自增的功能,而是使用序列的方式获取自增主键。
    可以使用<selectKey>标签来获取主键的值,这种方式不仅适用于不提供主键自增功能的数据库,也适用于提供主键自增功能的数据库
    <selectKey>一般的用法

    <selectKey keyColumn="id" resultType="long" keyProperty="id" order="BEFORE">
    </selectKey> 
    
    属性描述
    keyPropertyselectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
    keyColumn匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
    resultType结果的类型,MyBatis 通常可以推算出来。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。
    order值可为BEFORE 或 AFTER。如果是 BEFORE,那么它会先执行selectKey设置 keyProperty 然后执行插入语句。如果为AFTER则相反。
    statementType使用何种语句类型,默认PREPARED。 有STATEMENT,PREPARED 和 CALLABLE 语句的映射类型。
    <insert id="insertUser" >
    	<selectKey keyColumn="id" resultType="long" keyProperty="userId" order="BEFORE">
    		SELECT USER_ID.nextval as id from dual 
    	</selectKey> 
    	insert into user( 
    	user_id,user_name, user_password, create_time) 
    	values(#{userId},#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP})
    </insert>
    

    此时会将Oracle生成的主键值赋予userId变量。这个userId 就是USER对象的属性,这样就可以将生成的主键值返回了。如果仅仅是在insert语句中使用但是不返回,此时keyProperty=“任意自定义变量名”,resultType 可以不写。
    Oracle 数据库中的值要设置为 BEFORE ,这是因为 Oracle中需要先从序列获取值,然后将值作为主键插入到数据库中。

    扩展
    如果Mysql 使用selectKey的方式获取主键,需要注意下面两点:

    order : AFTER
    获取递增主键值 :SELECT LAST_INSERT_ID()

    当实体类中的属性名和表中的字段名不一样 ,怎么办

    第1种: 通过在查询的SQL语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

    <select id="getOrder" parameterType="int" resultType="com.jourwon.pojo.Order">
           select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};
    </select>
    

    第2种: 通过<resultMap>来映射字段名和实体类属性名的一一对应的关系。

    <select id="getOrder" parameterType="int" resultMap="orderResultMap">
    	select * from orders where order_id=#{id}
    </select>
    
    <resultMap type="com.jourwon.pojo.Order" id="orderResultMap">
        <!–用id属性来映射主键字段–>
        <id property="id" column="order_id">
    
        <!–用result属性来映射非主键字段,property为实体类属性名,column为数据库表中的属性–>
        <result property ="orderno" column ="order_no"/>
        <result property="price" column="order_price" />
    </reslutMap>
    

    Mapper 编写有哪几种方式?

    第一种:接口实现类继承 SqlSessionDaoSupport:使用此种方法需要编写mapper 接口,mapper 接口实现类、mapper.xml 文件。

    (1)在 sqlMapConfig.xml 中配置 mapper.xml 的位置

    <mappers>
        <mapper resource="mapper.xml 文件的地址" />
        <mapper resource="mapper.xml 文件的地址" />
    </mappers>
    

    (2)定义 mapper 接口

    (3)实现类集成 SqlSessionDaoSupport

    mapper 方法中可以 this.getSqlSession()进行数据增删改查。

    (4)spring 配置

    <bean id=" " class="mapper 接口的实现">
        <property name="sqlSessionFactory"
        ref="sqlSessionFactory"></property>
    </bean>
    

    第二种:使用 org.mybatis.spring.mapper.MapperFactoryBean:

    (1)在 sqlMapConfig.xml 中配置 mapper.xml 的位置,如果 mapper.xml 和mappre 接口的名称相同且在同一个目录,这里可以不用配置

    <mappers>
        <mapper resource="mapper.xml 文件的地址" />
        <mapper resource="mapper.xml 文件的地址" />
    </mappers>
    

    (2)定义 mapper 接口:

    (3)mapper.xml 中的 namespace 为 mapper 接口的地址

    (4)mapper 接口中的方法名和 mapper.xml 中的定义的 statement 的 id 保持一致

    (5)Spring 中定义

    <bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="mapper 接口地址" />
        <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>
    

    第三种:使用 mapper 扫描器:

    (1)mapper.xml 文件编写:

    mapper.xml 中的 namespace 为 mapper 接口的地址;

    mapper 接口中的方法名和 mapper.xml 中的定义的 statement 的 id 保持一致;

    如果将 mapper.xml 和 mapper 接口的名称保持一致则不用在 sqlMapConfig.xml中进行配置。

    (2)定义 mapper 接口:

    注意 mapper.xml 的文件名和 mapper 的接口名称保持一致,且放在同一个目录

    (3)配置 mapper 扫描器:

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="mapper 接口包地址
        "></property>
        <property name="sqlSessionFactoryBeanName"
        value="sqlSessionFactory"/>
    </bean>
    

    (4)使用扫描器后从 spring 容器中获取 mapper 的实现对象。

    什么是MyBatis的接口绑定?有哪些实现方式?

    接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。

    接口绑定有两种实现方式

    通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;

    通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。当Sql语句比较简单时候,用注解绑定, 当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多。

    使用MyBatis的mapper接口调用时有哪些要求?

    1、Mapper接口方法名和mapper.xml中定义的每个sql的id相同。

    2、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同。

    3、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。

    4、Mapper.xml文件中的namespace即是mapper接口的类路径。

    最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗

    Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个<select><insert><update><delete>标签,都会被解析为一个MappedStatement对象。

    Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

    Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

    Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

    不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。

    原因就是namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

    简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?

    答:Mybatis将所有Xml配置信息都封装到All-In-One重量级对象Configuration内部。在Xml映射文件中,<parameterMap>标签会被解析为ParameterMap对象,其每个子元素会被解析为ParameterMapping对象。<resultMap>标签会被解析为ResultMap对象,其每个子元素会被解析为ResultMapping对象。每一个<select><insert><update><delete>标签均会被解析为MappedStatement对象,标签内的sql会被解析为BoundSql对象。

    Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

    第一种是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。

    第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。

    有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

    Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

    还有很多其他的标签,<resultMap><parameterMap><sql><include><selectKey>,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中<sql>为sql片段标签,通过<include>标签引入sql片段,<selectKey>为不支持自增的主键生成策略标签。

    Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?

    虽然Mybatis解析Xml映射文件是按照顺序解析的,但是,被引用的B标签依然可以定义在任何地方,Mybatis都可以正确识别。

    原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下的标签,包含B标签,待所有标签解析完毕,Mybatis会重新解析那些被标记为未解析的标签,此时再解析A标签时,B标签已经存在,A标签也就可以正常解析完成了。

    高级查询

    MyBatis实现一对一,一对多有几种方式,怎么操作的?

    有联合查询和嵌套查询。联合查询是几个表联合查询,只查询一次,通过在resultMap里面的association,collection节点配置一对一,一对多的类就可以完成

    嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过配置association,collection,但另外一个表的查询通过select节点配置。

    Mybatis是否可以映射Enum枚举类?

    Mybatis可以映射枚举类,不单可以映射枚举类,Mybatis可以映射任何对象到表的一列上。映射方式为自定义一个TypeHandler,实现TypeHandler的setParameter()和getResult()接口方法。

    TypeHandler有两个作用,一是完成从javaType至jdbcType的转换,二是完成jdbcType至javaType的转换,体现为setParameter()和getResult()两个方法,分别代表设置sql问号占位符参数和获取列查询结果。

    动态SQL

    Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

    Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签trim|where|set|foreach|if|choose|when|otherwise|bind。

    其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

    插件模块

    Mybatis是如何进行分页的?分页插件的原理是什么?

    Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

    分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

    举例:select * from student,拦截sql后重写为:select t.* from (select * from student) t limit 0, 10

    简述Mybatis的插件运行原理,以及如何编写一个插件。

    Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

    实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。

    缓存

    Mybatis的一级、二级缓存

    1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

    2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/>

    3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

    展开全文
  • verilog 综合注意事项

    万次阅读 多人点赞 2016-07-29 15:46:40
    *而且,书中都是讲语句的具体使用办法,例如always @(),但是什么时候用always,几个always之间、时序电路、逻辑电路、任务与函数什么时候用,却没有一本书能讲清楚。* *这个笔记详细写了这些思路的问题,分享给...

    对Verilog 初学者比较有用的整理(转自它处)

    ********************************************************************************************************************

    *作者: Ian11122840    时间: 2010-9-27 09:04                                                                                                                                                                *
    *标题: 菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记                                                                                                                                       *
    *所谓综合,就是把描述语言转化成能硬件实现的电路,学verilog的时候,没有人给我说要不要考虑能否综合的问题~~~                                                                            *
    *看了5本书,居然没有一本书讲到能否综合,所以设计出来的程序完全不能用~~~                                                                                                                             *
    *而且,书中都是讲语句的具体使用办法,例如always @(),但是什么时候用always,几个always之间、时序电路、逻辑电路、任务与函数什么时候用,却没有一本书能讲清楚。*
    *这个笔记详细写了这些思路的问题,分享给新手看看,学习一种思路~~
    *点击此处下载 ourdev_585849OJ54KV.doc(文件大小:720K) (原文件名:verilog_经验(适合初学者).doc)                                                                                   *

    ********************************************************************************************************************

    先记下来:
    1、不使用初始化语句;
    2、不使用延时语句;
    3、不使用循环次数不确定的语句,如:forever,while等;
    4、尽量采用同步方式设计电路;
    5、尽量采用行为语句完成设计;
    6、always过程块描述组合逻辑,应在敏感信号表中列出所有的输入信号;
    7、所有的内部寄存器都应该可以被复位;
    8、用户自定义原件(UDP元件)是不能被综合的。
    一:基本
    Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器,还有可能被优化掉。
    二:verilog语句结构到门级的映射
    1、连续性赋值:assign
    连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因此连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。
    2、过程性赋值:
    过程性赋值只出现在always语句中。
    阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。
    建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。
    过程性赋值的赋值对象有可能综合成wire, latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。
    过程性赋值语句中的任何延时在综合时都将忽略。
    建议同一个变量单一地使用阻塞或者非阻塞赋值。
    3、逻辑操作符:
    逻辑操作符对应于硬件中已有的逻辑门,一些操作符不能被综合:===、!==。
    4、算术操作符:
    Verilog中将reg视为无符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。
    5、进位:
    通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:
    Wire [3:0] A,B;
    Wire [4:0] C;
    Assign C=A+B;
    C的最高位用来存放进位。
    6、关系运算符:
    关系运算符:<,>,<=,>=
    和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。
    7、相等运算符:==,!=
    注意:===和!==是不可综合的。
    可以进行有符号或无符号操作,取决于数据类型
    8、移位运算符:
    左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。
    9、部分选择:
    部分选择索引必须是常量。
    10、BIT选择:
    BIT选择中的索引可以用变量,这样将综合成多路(复用)器。
    11、敏感表:Always过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。
    12、IF:
    如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。如果IF语句中产生了latch,则IF的条件中最好不要用到算术操作。Case语句类似。Case的条款可以是变量。
    如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch。如果先读取,后赎值,则会产生latch。
    13、循环:
    只有for-loop语句是可以综合的。
    14、设计时序电路时,建议变量在always语句中赋值,而在该always语句外使用,使综合时能准确地匹配。建议不要使用局部变量。
    15、不能在多个always块中对同一个变量赎值
    16、函数
    函数代表一个组合逻辑,所有内部定义的变量都是临时的,这些变量综合后为wire。
    17、任务:
    任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。
    18、Z:
    Z会综合成一个三态门,必须在条件语句中赋值
    19、参数化设计:
    优点:参数可重载,不需要多次定义模块
    四:模块优化
    1、资源共享:
    当进程涉及到共用ALU时,要考虑资源分配问题。可以共享的操作符主要有:关系操作符、加减乘除操作符。通常乘和加不共用ALU,乘除通常在其内部共用。
    2、共用表达式:
    如:C=A+B;
        D=G+(A+B);
    两者虽然有共用的A+B,但是有些综合工具不能识别.可以将第二句改为:D=G+C;这样只需两个加法器.
    3、转移代码:
    如循环语句中没有发生变化的语句移出循环.
    4、避免latch:
    两种方法:1、在每一个IF分支中对变量赋值。2、在每一个IF语句中都对变量赋初值。
    5:模块:
    综合生成的存储器如ROM或RAM不是一种好方法,只是成堆的寄存器,很费资源。最好用库自带的存储器模块。
    五、验证:
    1、敏感表:
    在always语句中,如果敏感表不含时钟,最好将所有的被读取的信号都放在敏感表中。
    2、异步复位:
    建议不要在异步时对变量读取,即异步复位时,对信号赋以常数值。

    Averilog的流行,有两方面的原因;
    B verilog与VHDL相比的优点
    C典型的verilog模块
    D verilog语法要点

    A) verilog的流行,有两方面的原因:
    1它是cadence的模拟器verilog-XL的基础,cadence的广泛流行使得verilog在90年代深入人心;
    2它在硅谷获得广泛使用;
    B) verilog与VHDL相比的优点二者的关系仿佛C与FORTRAN,具体而言:
    1 verilog的代码效率更高:
    比较明显的对比:
    VHDL在描述一个实体时采用entity/architecture模式,
    verilog在描述一个实体时只需用一个"module/edumodule"语句块.
    此外verilog的高效性还在很多地方体现出来;
    2 verilog支持二进制的加减运算:
    VHDL在进行二进制的加减运算时使用conv_***函数或者进行其他的定义,总之必须通知编译器;verilog直接用形如"c=a+b"的表示二进制的加减运算;
    3综合时可控制性好:
    VHDL对信号不加区分地定义为"signal",
    而verilog区分为register类型的和wire类型的;
    但是也有人支持VHDL,认为verilog和VHDL的关系仿佛C和C++.C)典型的verilog模块
    讨论以下典型电路的verilog描述:
    *与非门;
    *加法器;  //即全加器
    * D触发器;
    *计数器; //**分频的counter
    * latch;
    *时序机;
    *RAM;   //用synopsys的
    *模块引用;
    *预编译;
    *与非门的verilog描述如下:
    //verilog使用和C语言相同的注释方法
    module nd02(a1,a2,zn);//一个verilog模块总是以module开始,以endmodule   结束,nd02是模块名,a1,a2,zn是模块的3个输入输出信号
    input a1,a2;  //告诉编译器a1,a2对此模块而言是输入,并且数据类型是"bit"
    output zn;  //告诉编译器zn对此模块而言是输出,数据类型也是"bit"
    nand  (zn,a1,a2); //我理解nand是运算符,我们不必深究verilog中的正式术语是什
    么了吧,总之这种形式表示zn=~(a1 && a2);你一定已经想到类似的运算符还有"not","and","or","nor","xor"了吧;除了"not",括号里的信号数可以任意,例如or (z,f,g,h)表示z=f || g || h,并且延时是3个单位时间,#x表示延时x个单位时间;
    endmodule

    *加法器的verilog描述如下:
    module ad03d1(A,B,CI,S,CO) ;
    input [2:0] A,B;  //表示A,B是输入信号,并且是3位矢量,上界是2,下界是0
    input CI;
    output [2:0] S;
    output CO;
    assign {CO,S}=A+B+CI;//一对"{"和"}"表示链接,即将CO和S合并成4位矢量
    endmodule

    *带异步清零端的D触发器的verilog描述如下:
    module dfctnb (d,cp,cdn,q,qn);
    input d,cp,cdn;
    output q,qn;
    reg q,qn;    //关键字"reg"表示q和qn是"register"类型的信号;verilog中有两种类型的信号:"register"类型和"wire"类型.你可以简单地把register类型的信号想象为某个D触发器的输出,而wire类型的的信号是组合逻辑的输出.二者的最大区别在于:你可以对register类型的信号进行定时赋值(用wait语句在特定时刻的赋值,详见下面always语句),而对于wire类型的信号则不可.
    always wait (cdn==0) //表示每当cdn=0时,将要对D触发器清零,"always"和"wait"嵌套,"wait"和"@"是verilog的两个关键字,表示一旦有某事发生;则执行下面的语句块,"always"有点象C语言中的"if ... then...","wait"和"@"的区别:请参考本模块.wait表示本语句块的进程停止,直到"cdn=0"的条件出现才继续;我理解在verilog中,每个最外层语句块都是一个***的进程;"@"(请看下个always语句)也表示本语句块的进程停止,直到后面定义"posedge cp"(即出现cp的上升沿)的事件出现才继续;也许wait和@可以合二为一吧,但至少到目前verilog中wait表示"条件",@表示"事件";具体运用中,wait总是用于类似"wait(xxx=1)"之类的场合,@总是用于类似"@(xxx)"或"@(posedge/negedge xxx)"之类的场合整句话的意思是"每当cdn等于0时,则作以下事情"
    begin     //begin...end结构的用法类似于pascal语言
           q=0;
             qn=1;
            wait (cdn==1);
    end
    always @ (posedge cp)//"@(posedge cp)"中有两个关键字:"@ (x)"表示"每当事件x发
    生","posedge x"表示"x的上升沿,"negedge x"表示"x的下降沿",整句话的意思是"每当cp的上升沿,则作以下事情"
            if (cdn)  //如果cdn=1(意味着清零端无效)
            begin
                     q=d;
                     qn=~q;//"~"表示反相
            end
    endmodule
    *计数器的verilog描述如下:
    module count(in,set,cp,out) ;//此计数器,在cp的上升沿将输入赋给输出,在cp的上升沿使输出加一
    input [15:0] in;
    input set,cp;
    output [15:0] out;
    reg [15:0] out;
    always @ (posedge set)
    out = in;
    always @(posedge cp)
    out = out+1;  //verilog容许一个信号同时出现在等号两端,只要它是reg类型的
    endmodule

    *latch的描述如下:
    always @(clk or d)
        if (clk) q = d;

    *时序机的verilog描述如下:
    always @(posedge CLK)  //D是下一个状态,Q是当前状态,e1,e2是输入,a,b是输出
    Q=D;
    always @(Q or othercase) begin //当Q变化或输入e1,e2变化时D要相应变化
    D = Q; //note1
    a = 0;
    b = 0;
    ......
    case(Q)
      q1:begin
       q1 action;
       if(e1)D=d1;
       if(e2)D=d2;
       else D=d3;
       a = 1; //note 2
       end
      q2:begin
       b = 1;
       ......
       end
      default:begin
       a = 0;
       b = 0;
       ......
    end
    end
    ---annotations---
    note 1:
      This is a custom expression,after reset,D should be equal to Q;
    note 2:
      In this state machine,a is only equal to 1 at state q1,in
      other state,a is equal to 0;
    * RAM的verilog描述如下:
    module ram(din,ain,dout,aout,rd,wr);//这是一个双口RAM,分别有:输入端:输入地址ain;输入数据din;上升沿有效的写信号wr;/输出端:输出地址aout;输出数据dout;高电平有效的读信号rd;
      inout [7:0] din;
      input [7:0] ain,aout;
      input rd,wr;
      output [7:0] dout;
      reg [7:0] memory [0:255];   //请注意这是存储阵列的描述方法,描述了一个共有2
    56个字的存储阵列,每个字是8位
      assign dout = rd ? memory[aout] : 8'bz; //"assign"关键字表示并行赋值语句的
    开始"?"运算符的作用和在C语言中一样"8'bz"是一个常量,表示一个字节的高阻态,其中8表示长度是8bit,"'"是固定分割符,"b"表示后面的数据是以比特形式给出的,"z"表示高阻;举例:4'ha表示长4bit的数"1010"。类似的还可举出5'b10111,6'o33等等
      always @(posedge wr)
    memory[ain] = din;
    endmodule
    *模块引用
    假设在前面(可以是别的模块)定义了module ram(din,ain,dout,aout,rd,wr),则引用此
    模块时只需写
    ram myram(din_in_map,ain_in_map,dout_in_map,aout_in_map,rd_in_map,wr_in_map)
    ;
    //其中"ram"是所引用的module名,"myram"是你起的instance名,"din_in_map"等等是图中的节点名,和器件(module)中的"din..."进行"虚实结合";
    *预编译
    类似C语言,只需写
    `include "<pathname:filename>",反上撇号"`"是verilog的预编译符,类似C中的"#".
    D) verilog语法要点
    *基本原则
    设计时应该把你的系统划分为计数器,触发器,时序机,组合逻辑等等可综合的单元,对此不同的IC公司和EDA开发商可能根据自己的见解和经验提出不同的要求,并且对verilog程序的细节进行自己的规定,但有一点是对的:即写硬件描述语言不象写C语言那样符合语法就行.单单符合verilog语法的程序可能被拒绝综合,甚至被拒绝模拟;
    *最外层可以写什么?
    这里所说的最外层是指module语句后的第一层,在这一层可以写这些可执行语句:
    assign和nand等定义组合逻辑的语句,
    always语句,
    模块引用语句,
    一些以"$"开头的系统定义语句.
    特别注意不可以写if语句.if语句只能放在always内部.
    不推荐写wait语句,因为不能综合.
    *不可以在多个always语句中对一个信号赋值.


    1.        强烈建议用同步设计
    2.在设计时总是记住时序问题
    3.在一个设计开始就要考虑到地电平或高电平复位、同步或异步复位、上升沿或下降沿触发等问题,在所有模块中都要遵守它
    4.在不同的情况下用if和case,最好少用if的多层嵌套(1层或2层比较合适,当在3层以上时,最好修改写法,因为这样不仅可以reduce area,而且可以获得好的timing)
    5.在锁存一个信号或总线时要小心,对于整个design,尽量避免使用latch,因为在DFT时很难test。
    6.确信所有的信号被复位,在DFT时,所有的FlipFlop都是controllable,
    7.永远不要再写入之前读取任何内部存储器(如SRAM)
    8.从一个时钟到另一个不同的时钟传输数据时用数据缓冲,他工作像一个双时钟FIFO(是异步的),可以用Async SRAM搭建Async FIFO。
    9.在VHDL中二维数组可以使用,它是非常有用的。在VERILOG中他仅仅可以使用在测试模块中,不能被综合
    10.遵守register-in register-out规则
    11.像synopsys的DC的综合工具是非常稳定的,任何bugs都不会从综合工具中产生
    12.确保FPGA版本与ASIC的版本尽可能的相似,特别是SRAM类型,若版本一致是最理想的,但是在工作中FPGA版本一般用FPGA自带的SRAM,ASIC版本一般用厂商提供的SRAM。
    13.在嵌入式存储器中使用BIST
    14.虚单元和一些修正电路是必需的
    15.一些简单的测试电路也是需要的,经常在一个芯片中有许多测试模块
    16.除非低功耗不要用门控时钟,强烈建议不要在design中使用gate clock
    17.不要依靠脚本来保证设计。但是在脚本中的一些好的约束能够起到更好的性能(例如前向加法器)
    18.如果时间充裕,通过时钟做一个多锁存器来取代用MUX
    19.不要用内部tri-state, ASIC需要总线保持器来处理内部tri-state,如IO cell。
    20.在top level中作pad insertion
    21.选择pad时要小心(如上拉能力,施密特触发器,5伏耐压等),选择合适的IO cell
    22.小心由时钟偏差引起的问题
    23.不要试着产生半周期信号
    24.如果有很多函数要修正,请一个一个地作,修正一个函数检查一个函数
    25.在一个计算等式中排列每个信号的位数是一个好习惯,即使综合工具能做
    26.不要使用HDL提供的除法器
    27.削减不必要的时钟。它会在设计和布局中引起很多麻烦,大多数FPGA有1-4个专门的时钟通道

    良好代码编写风格可以满足信、达、雅的要求。在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。良好代码编写风格的通则概括如下:  
    (1) 对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写;  
    (2) 使用有意义的信号名、端口名、函数名和参数名;  
    (3) 信号名长度不要太长;  
    (4) 对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀;  
    (5) 对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字;  
    (6) 对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。注意在同一个设计中要使用同一个小写字母表示低电平有效;  
    (7) 对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n;  
    (8) 当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示;  
    (9) 尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等;  
    (10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;  
    (11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂;  
    (12)每一行语句独立成行。尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性;  
    (13)建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC 设计中心2 如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力;  
    (14)在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字;  
    (15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:  
    输入信号的clk、rst、enables other control signals、data and address signals。然后再申明输出信号的clk、rst、enalbes other control signals、data signals;  
    (16)在例化模块时,使用名字相关的显式映射而不要采用位置相关的映射,这样可以提高代码的可读性和方便debug 连线错误;  
    (17)如果同一段代码需要重复多次,尽可能使用函数,如果有可能,可以将函数通用化,以使得它可以复用。注意,内部函数的定义一般要添加注释,这样可以提高代码的可读性;  
    (18)尽可能使用循环语句和寄存器组来提高源代码的可读性,这样可以有效地减少代码行数;  
    (19)对一些重要的always 语句块定义一个有意义的标号,这样有助于调试。注意标号名不要与信号名、变量名重复;  
    (20)代码编写时的数据类型只使用IEEE 定义的标准类型,在VHDL 语言中,设计者可以定义新的类型和子类型,但是所有这些都必须基于IEEE 的标准;  
    (21)在设计中不要直接使用数字,作为例外,可以使用0 和1。建议采用参数定义代替直接的数字。同时,在定义常量时,如果一个常量依赖于另一个常量,建议在定义该常量时用表达式表示出这种关系;  
    (22)不要在源代码中使用嵌入式的dc_shell 综合命令。这是因为其他的综合工具并不认得这些隐含命令,从而导致错误的或较差的综合结果。即使使用Design Compiler,当综合策略改变时,嵌入式的综合命令也不如放到批处理综合文件中易于维护。这个规则有一个例外的综合命令,即编译开关的打开和关闭可以嵌入到代码中;  
    (23)在设计中避免实例化具体的门级电路。门级电路可读性差,且难于理解和维护,如果使用特定工艺的门电路,设计将变得不可移植。如果必须实例化门电路,我们建议采用独立于工艺库的门电路,如SYNOPSYS 公司提供的GTECH 库包含了高质量的常用的门级电路;  
    (24)避免冗长的逻辑和子表达式;  
    (25)避免采用内部三态电路,建议用多路选择电路代替内部三态电路。

    规则 #1: 建立时序逻辑模型时,采用非阻塞赋值语句。
    规则 #2: 建立latch模型时,采用非阻塞赋值语句。
    规则 #3: 在always块中建立组合逻辑模型时,采用阻塞赋值语句。
    规则 #4: 在一个always块中同时有组合和时序逻辑时时,采用非阻塞赋值语句。
    规则 #5: 不要在一个always块中同时采用阻塞和非阻塞赋值语句。
    规则 #6: 同一个变量不要在多个always块中赋值。
    规则 #7: 调用$strobe系统函数显示用非阻塞赋值语句赋的值。
    规则 #8: 不要使用#0延时赋值。
    组合逻辑
    1,敏感变量的描述完备性
    Verilog中,用always块设计组合逻辑电路时,在赋值表达式右端参与赋值的所有信号都必须在always @(敏感电平列表)中列出,always中if语句的判断表达式必须在敏感电平列表中列出。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,在综合时将会为没有列出的信号隐含地产生一个透明锁存器。这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中的某一个信号变化时,它的作用才表现出来,即相当于存在一个透明锁存器,把该信号的变化暂存起来,待敏感电平列表中的某一个
    信号变化时再起作用,纯组合逻辑电路不可能作到这一点。综合器会发出警告。
    Example1:
    input a,b,c;
    reg e,d;
    always @(a or b or c)
        begin
        e=d&a&b; /*d没有在敏感电平列表中,d变化时e不会立刻变化,直到a,b,c中某一个变化*/
        d=e |c;
        end
    Example2:
    input a,b,c;
    reg e,d;
    always @(a or b or c or d)
        begin
        e=d&a&b; /*d在敏感电平列表中,d变化时e立刻变化*/
        d=e |c;
        end
    2,条件的描述完备性
    如果if语句和case语句的条件描述不完备,也会造成不必要的锁存器。
    Example1:
    if (a==1'b1) q=1'b1;//如果a==1'b0,q=? q将保持原值不变,生成锁存器!
    Example2:
    if (a==1'b1) q=1'b1;
    else         q=1'b0;//q有明确的值。不会生成锁存器!
    Example3:
       reg[1:0] a,q;
       ....
       case (a)
          2'b00 : q=2'b00;
          2'b01 : q=2'b11;//如果a==2'b10或a==2'b11,q=? q将保持原值不变,锁存器!
       endcase
    Example4:
       reg[1:0] a,q;
       ....
       case (a)
          2'b00 : q=2'b00;
          2'b01 : q=2'b11;
          default: q=2'b00;//q有明确的值。不会生成锁存器!
       endcase
         Verilog中端口的描述
    1,端口的位宽最好定义在I/O说明中,不要放在数据类型定义中;
    Example1:
    module test(addr,read,write,datain,dataout)
    input[7:0]  datain;
    input[15:0] addr;
    input       read,write;
    output[7:0] dataout;  //要这样定义端口的位宽!
    wire addr,read,write,datain;
    reg  dataout;
    Example2:
    module test(addr,read,write,datain,dataout)
    input  datain,addr,read,write;
    output dataout;
    wire[15:0] addr;
    wire[7:0]  datain;
    wire       read,write;
    reg[7:0]   dataout;   //不要这样定义端口的位宽!!
    2,端口的I/O与数据类型的关系:
        端口的I/O           端口的数据类型
                           module内部     module外部
          input              wire          wire或reg
          output         wire或reg           wire
          inout            wire              wire
    3,assign语句的左端变量必须是wire;直接用"="给变量赋值时左端变量必须是reg!
    Example:
    assign a=b; //a必须被定义为wire!!
    ********
    begin
       a=b; //a必须被定义为reg!
    end
      VHDL中STD_LOGIC_VECTOR和INTEGER的区别
    例如A是INTEGER型,范围从0到255;B是STD_LOGIC_VECTOR,定义为8位。A累加到255时,再加1就一直保持255不变,不会自动反转到0,除非令其为0;而B累加到255时,再加1就会自动反转到0。所以在使用时要特别注意!
    以触发器为例说明描述的规范性
    1,无置位/清零的时序逻辑
        always @( posedge CLK)
           begin
           Q<=D;
           end
    2,有异步置位/清零的时序逻辑
      异步置位/清零是与时钟无关的,当异步置位/清零信号到来时,触发器的输出立即  被置为1或0,不需要等到时钟沿到来才置位/清零。所以,必须要把置位/清零信号  列入always块的事件控制表达式。
        always @( posedge CLK or negedge RESET)
           begin
           if (!RESET)
              Q=0;
           else
              Q<=D;
           end
    3,有同步置位/清零的时序逻辑
       同步置位/清零是指只有在时钟的有效跳变时刻置位/清零,才能使触发器的输出分   别转换为1或0。所以,不要把置位/清零信号列入always块的事件控制表达式。但是   必须在always块中首先检查置位/清零信号的电平。
        always @( posedge CLK )
        begin
           if (!RESET)
              Q=0;
           else
              Q<=D;
           end
    结构规范性
    在整个芯片设计项目中,行为设计和结构设计的编码是最重要的一个步骤。 它对逻辑综合和布线结果、时序测定、校验能力、测试能力甚至产品支持 都有重要的影响。考虑到仿真器和真实的逻辑电路之间的差异,为了有效的
    进行仿真测试:
      1,避免使用内部生成的时钟
        内部生成的时钟称为门生时钟(gated clock)。如果外部输入时钟和门生时钟同时驱动,    则不可避免的两者的步调不一致,造成逻辑混乱。而且,门生时钟将会增加测试的难度    和时间。
      2,绝对避免使用内部生成的异步置位/清零信号
        内部生成的置位/清零信号会引起测试问题。使某些输出信号被置位或清零,无法正常    测试。
    3,避免使用锁存器
        锁存器可能引起测试问题。对于测试向量自动生成(ATPG),    为了使扫描进行,锁存器需要置为透明模式(transparent mode),    反过来,测试锁存器需要构造特定的向量,这可非同一般。
      4,时序过程要有明确的复位值
        使触发器带有复位端,在制造测试、ATPG以及模拟初始化时,可以对整个电路进行    快速复位。
      5,避免模块内的三态/双向
        内部三态信号在制造测试和逻辑综合过程中难于处理.

    近日读 J.Bhasker 的<verilog synthesis practical primer> , 受益匪浅,理清了不少基础电路知识 , 记下一些 tips :
    1. 过程赋值(always 中触发赋值)的变量,可能会被综合成连线 或触发器 或锁存器.
    2.综合成锁存器的规则:
    a. 变量在条件语句(if 或case)中,被赋值.
    b. 变量未在条件语句的所有分支中被赋值.
    c. 在always语句多次调用之间需要保持变量值 .
    以上三个条件必须同时满足.
    3.综合成触发器的规则:
    变量在时钟沿的控制下被赋值。
    例外情况:变量的赋值和引用都仅出现在一条always语句中,则该变量被视为中
    间变量而不是触发器。
    4. 对于无时钟事情的always语句(即组合逻辑建模),其时间表应包括该alwa语
    句引用的所有变量,否则会出现RTL与Netlist的不一致
    芯片外部引脚很多都使用inout类型的,为的是节省管腿。一般信号线用做总线等双向数据传输的时候就要用到INOUT类型了。就是一个端口同时做输入和输出。 inout在具体实现上一般用三态门来实现。三态门的第三个状态就是高阻'Z'。 当inout端口不输出时,将三态门置高阻。这样信号就不会因为两端同时输出而出错了,更详细的内容可以搜索一下三态门tri-state的资料.
    1 使用inout类型数据,可以用如下写法:
    inout data_inout;
    input data_in;
    reg data_reg;//data_inout的映象寄存器
    reg link_data;
    assign data_inout=link_data?data_reg:1’bz;//link_data控制三态门
    //对于data_reg,可以通过组合逻辑或者时序逻辑根据data_in对其赋值.通过控制link_data的高低电平,从而设置data_inout是输出数据还是处于高阻态,如果处于高阻态,则此时当作输入端口使用.link_data可以通过相关电路来控制.
    2 编写测试模块时,对于inout类型的端口,需要定义成wire类型变量,而其它输入端口都定义成reg类型,这两者是有区别的.
    当上面例子中的data_inout用作输入时,需要赋值给data_inout,其余情况可以断开.此时可以用assign语句实现:assign data_inout=link?data_in_t:1’bz;其中的link ,data_in_t是reg类型变量,在测试模块中赋值.
    另外,可以设置一个输出端口观察data_inout用作输出的情况:
    Wire data_out;
    Assign data_out_t=(!link)?data_inout:1’bz;
    else,in RTL
    inout use in top module(PAD)
    dont use inout(tri) in sub module
    也就是说,在内部模块最好不要出现inout,如果确实需要,那么用两个port实现,到顶层的时候再用三态实现。理由是:在非顶层模块用双向口的话,该双向口必然有它的上层跟它相连。既然是双向口,则上层至少有一个输入口和一个输出口联到该双向口上,则发生两个内部输出单元连接到一起的情况出现,这样在综合时往往会出错。
    对双向口,我们可以将其理解为2个分量:一个输入分量,一个输出分量。另外还需要一个控制信号控制输出分量何时输出。此时,我们就可以很容易地对双向端口建模。
    例子:
    CODE:
    module dual_port (
    ....
    inout_pin,
    ....
    );
    inout inout_pin;
    wire inout_pin;
    wire input_of_inout;
    wire output_of_inout;
    wire out_en;
    assign input_of_inout = inout_pin;
    assign inout_pin = out_en ? output_of_inout : 高阻;
    endmodule
    可见,此时input_of_inout和output_of_inout就可以当作普通信号使用了。
    在仿真的时候,需要注意双向口的处理。如果是直接与另外一个模块的双向口连接,那么只要保证一个模块在输出的时候,另外一个模块没有输出(处于高阻态)就可以了。
    如果是在ModelSim中作为单独的模块仿真,那么在模块输出的时候,不能使用force命令将其设为高阻态,而是使用release命令将总线释放掉
    很多初学者在写testbench进行仿真和验证的时候,被inout双向口难住了。仿真器老是提示错误不能进行。下面是我个人对inout端口写testbench仿真的一些总结,并举例进行说明。在这里先要说明一下inout口在testbench中要定义为wire型变量。
    先假设有一源代码为:
    module xx(data_inout , ........);
    inout data_inout;
    ........................
    assign data_inout=(! link)?datareg:1'bz;
    endmodule
    方法一:使用相反控制信号inout口,等于两个模块之间用inout双向口互连。这种方法要注意assign 语句只能放在initial和always块内。
    module test();
    wire data_inout;
    reg data_reg;
    reg link;
    initial begin
    ..........
    end
    assign data_inout=link?data_reg:1'bz;
    endmodule
    方法二:使用force和release语句,但这种方法不能准确反映双向端口的信号变化,但这种方法可以反在块内。
    module test();
    wire data_inout;
    reg data_reg;
    reg link;
    #xx;        //延时
    force data_inout=1'bx;           //强制作为输入端口
    ...............
    #xx;
    release data_inout;          //释放输入端口
    endmodule
    很多读者反映仿真双向端口的时候遇到困难,这里介绍一下双向端口的仿真方法。一个典型的双向端口如图1所示。

    其中inner_port与芯片内部其他逻辑相连,outer_port为芯片外部管脚,out_en用于控制双向端口的方向,out_en为1时,端口为输出方向,out_en为0时,端口为输入方向。

    用Verilog语言描述如下:
    module bidirection_io(inner_port,out_en,outer_port);
    input out_en;
    inout[7:0] inner_port;
    inout[7:0] outer_port;
    assign outer_port=(out_en==1)?inner_port:8'hzz;
    assign inner_port=(out_en==0)?outer_port:8'hzz;
    endmodule

    用VHDL语言描述双向端口如下:
    library ieee;
    use IEEE.STD_LOGIC_1164.ALL;
    entity bidirection_io is
    port ( inner_port : inout std_logic_vector(7 downto 0);
    out_en : in std_logic;
    outer_port : inout std_logic_vector(7 downto 0) );
    end bidirection_io;
    architecture behavioral of bidirection_io is
    begin
    outer_port<=inner_port when out_en='1' else (OTHERS=>'Z');
    inner_port<=outer_port when out_en='0' else (OTHERS=>'Z');
    end behavioral;

    仿真时需要验证双向端口能正确输出数据,以及正确读入数据,因此需要驱动out_en端口,当out_en端口为1时,testbench驱动inner_port端口,然后检查outer_port端口输出的数据是否正确;当out_en端口为0时,testbench驱动outer_port端口,然后检查inner_port端口读入的数据是否正确。由于inner_port和outer_port端口都是双向端口(在VHDL和Verilog语言中都用inout定义),因此驱动方法与单向端口有所不同。
    验证该双向端口的testbench结构如图2所示。

    这是一个self-checking testbench,可以自动检查仿真结果是否正确,并在Modelsim控制台上打印出提示信息。图中Monitor完成信号采样、结果自动比较的功能。
    testbench的工作过程为
    1)out_en=1时,双向端口处于输出状态,testbench给inner_port_tb_reg信号赋值,然后读取outer_port_tb_wire的值,如果两者一致,双向端口工作正常。
    2)out_en=0时,双向端口处于输如状态,testbench给outer_port_tb_reg信号赋值,然后读取inner_port_tb_wire的值,如果两者一致,双向端口工作正常。

    用Verilog代码编写的testbench如下,其中使用了自动结果比较,随机化激励产生等技术。

    `timescale 1ns/10ps
    module tb();
    reg[7:0] inner_port_tb_reg;
    wire[7:0] inner_port_tb_wire;
    reg[7:0] outer_port_tb_reg;
    wire[7:0] outer_port_tb_wire;
    reg out_en_tb;
    integer i;

    initial
    begin
    out_en_tb=0;
    inner_port_tb_reg=0;
    outer_port_tb_reg=0;
    i=0;
    repeat(20)
    begin
    #50
    i=$random;
    out_en_tb=i[0]; //randomize out_en_tb
    inner_port_tb_reg=$random; //randomize data
    outer_port_tb_reg=$random;
    end
    end

    //**** drive the ports connecting to bidirction_io
    assign inner_port_tb_wire=(out_en_tb==1)?inner_port_tb_reg:8'hzz;
    assign outer_port_tb_wire=(out_en_tb==0)?outer_port_tb_reg:8'hzz;

    //instatiate the bidirction_io module
    bidirection_io bidirection_io_inst(.inner_port(inner_port_tb_wire),
    .out_en(out_en_tb),
    .outer_port(outer_port_tb_wire));

    //***** monitor ******
    always@(out_en_tb,inner_port_tb_wire,outer_port_tb_wire)
    begin
    #1;
    if(outer_port_tb_wire===inner_port_tb_wire)
    begin
    $display("\n **** time=%t ****",$time);
    $display("OK! out_en=%d",out_en_tb);
    $display("OK! outer_port_tb_wire=%d,inner_port_tb_wire=%d",
    outer_port_tb_wire,inner_port_tb_wire);
    end
    else
    begin
    $display("\n **** time=%t ****",$time);
    $display("ERROR! out_en=%d",out_en_tb);
    $display("ERROR! outer_port_tb_wire != inner_port_tb_wire" );
    $display("ERROR! outer_port_tb_wire=%d, inner_port_tb_wire=%d",
    outer_port_tb_wire,inner_port_tb_wire);
    end
    end
    endmodule

    今天重新回顾了一下阻塞赋值和非阻塞赋值的概念,感觉又有所收获。 
    一、特点:
        阻塞赋值:1、RHS的表达式计算和LHS的赋值更新,这两个动作之间不能插入其他动作,即所谓计算完毕,立即更新。
                 2、所谓阻塞就是指在一个“begin...end”块中的多个阻塞赋值语句内,只有上一句完全执行完毕后,才会执行下一语句,否则阻塞程序的执行。
        非阻塞赋值:RHS的表达式计算和LHS的赋值更新分两个节拍执行,首先,应该是RHS的表达式计算,得到新值后并不立即赋值,而是放在事件队列中等待,直到
                  当前仿真时刻的后期才执行(原因下文会提到)。
    二、Verilog的分层事件队列:
        在Verilog中,事件队列可以划分为5个不同的区域,不同的事件根据规定放在不同的区域内,按照优先级的高低决定执行的先后顺序,下表就列出了部分Verilog分层事件队列。其中,活跃事件的优先级最高(最先执行),而监控事件的优先级最低,而且在活跃事件中的各事件的执行顺序是随机的(注:为方便起见,在一般的仿真器中,对同一区域的不同事件是按照调度的先后关系执行的)。
       

    当前仿真
    时间事件

    活跃事件         阻塞赋值,非阻塞赋值的RHS计算……

    非活跃事件

    显式0延时的阻塞赋值……




    非阻塞赋值更新事件

    由非阻塞语句产生的一个非阻塞赋值更新事件,并被调入当前仿真时刻。



    监控事件

    $monitor和$strobe等系统任务


    将来仿真
    时间事件                  被调度到将来仿真时间的事件

    三、结论:
        由上表就可以知道,阻塞赋值属于活跃事件,会立刻执行,这就是阻塞赋值“计算完毕,立刻更新”的原因。此外,由于在分层事件队列中,只有将活跃事件中排在前面的事件调出,并执行完毕后,才能够执行下面的事件,这就可以解释阻塞赋值的第二个特点。
        同样是由上表知,非阻塞赋值的RHS计算属于活跃事件,而非阻塞赋值更新事件排在非活跃事件之后,因此只有仿真队列中所有的活跃事件和非活跃事件都执行完毕后,才轮到非阻塞赋值更新事件,这就是非阻塞赋值必须分两拍完成的原因。

    以上就是我今天的读书笔记,写得仓促,如有不对,敬请指出 。


    一. 强调Verilog代码编写风格的必要性。
    强调Verilog代码编写规范,经常是一个不太受欢迎的话题,但却是非常有必要的。
    每个代码编写者都有自己的编写习惯,而且都喜欢按照自己的习惯去编写代码。与自己编写风格相近的代码,阅读起来容易接受和理解。相反和自己编写风格差别较大的代码,阅读和接受起来就困难一些。
    曾有编程大师总结说,一个优秀的程序员,能维护的代码长度大约在1万行数量级。代码的整洁程度,很大程度上影响着代码的维护难度。
    遵循代码编写规范书写的代码,很容易阅读、理解、维护、修改、跟踪调试、整理文档。相反代码编写风格随意的代码,通常晦涩、凌乱,会给开发者本人的调试、修改工作带来困难,也会给合作者带来很大麻烦。
    (实际上英文Coding Style有另一层涵义,更偏重的是,某一个电路,用那一种形式的语言描述,才能将电路描述得更准确,综合以后产生的电路更合理。本文更偏重的是,编写Verilog代码时的书写习惯。)

    二. 强调编写规范的宗旨。
    缩小篇幅
    提高整洁度
    便于跟踪、分析、调试
    增强可读性,帮助阅读者理解
    便于整理文档
    便于交流合作
    三. 变量及信号命名规范。
    1. 系统级信号的命名。
    系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys开头。
    2. 低电平有效的信号后一律加下划线和字母n。如:SysRst_n;FifoFull_n;
    3. 经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。如CpuRamRd信号,经锁存后应命名为CpuRamRd_r。
    低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。如CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr
    多级锁存的信号,可多加r以标明。如CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。
    4. 模块的命名。
    在系统设计阶段应该为每个模块进行命名。命名的方法是,将模块英文名称的各个单词首字母组合起来,形成3到5个字符的缩写。若模块的英文名只有一个单词,可取该单词的前3个字母。各模块的命名以3个字母为宜。例如:
    Arithmatic Logical Unit模块,命名为ALU。
    Data Memory Interface模块,命名为DMI。
    Decoder模块,命名为DEC。

    5. 模块之间的接口信号的命名。
    所有变量命名分为两个部分,第一部分表明数据方向,其中数据发出方在前,数据接收方在后,第二部分为数据名称。
    两部分之间用下划线隔离开。
    第一部分全部大写,第二部分所有具有明确意义的英文名全部拼写或缩写的第一个字母大写,其余部分小写。
    举例:CPUMMU_WrReq,下划线左边是第一部分,代表数据方向是从CPU模块发向存储器管理单元模块(MMU)。下划线右边Wr为Write的缩写,Req是Request的缩写。两个缩写的第一个字母都大写,便于理解。整个变量连起来的意思就是CPU发送给MMU的写请求信号。
    模块上下层次间信号的命名也遵循本规定。
    若某个信号从一个模块传递到多个模块,其命名应视信号的主要路径而定。
    6. 模块内部信号:
    模块内部的信号由几个单词连接而成,缩写要求能基本表明本单词的含义;
    单词除常用的缩写方法外(如:Clock->Clk, Write->Wr, Read->Rd等),一律取该单词的前几个字母( 如:Frequency->Freq, Variable->Var 等);
    每个缩写单词的第一个字母大写;
    若遇两个大写字母相邻,中间添加一个下划线(如DivN_Cntr);
    举例:SdramWrEn_n;FlashAddrLatchEn;
    四. 编码格式规范。
    1. 分节书写,各节之间加1到多行空格。如每个always,initial语句都是一节。每节基本上完成一个特定的功能,即用于描述某几个信号的产生。在每节之前有几行注释对该节代码加以描述,至少列出本节中描述的信号的含义。
    2. 行首不要使用空格来对齐,而是用Tab键,Tab键的宽度设为4个字符宽度。行尾不要有多余的空格。
    3. 注释。
    使用//进行的注释行以分号结束;
    使用/* */进行的注释,/*和*/各占用一行,并且顶头;
    例:
    // Edge detector used to synchronize the input signal;
    4. 空格的使用:
    不同变量,以及变量与符号、变量与括号之间都应当保留一个空格。
    Verilog关键字与其它任何字符串之间都应当保留一个空格。如:
    Always @ (……)
    使用大括号和小括号时,前括号的后边和后括号的前边应当留有一个空格。
    逻辑运算符、算术运算符、比较运算符等运算符的两侧各留一个空格,与变量分隔开来;单操作数运算符例外,直接位于操作数前,不使用空格。
    使用//进行的注释,在//后应当有一个空格;注释行的末尾不要有多余的空格。
    例:
    assign SramAddrBus = { AddrBus[31:24], AddrBus[7:0] };
    assign DivCntr[3:0] = DivCntr[3:0] + 4’b0001;
    assign Result = ~Operand;

    5. 同一个层次的所有语句左端对齐;Initial、always等语句块的begin关键词跟在本行的末尾,相应的end关键词与Initial、always对齐;这样做的好处是避免因begin独占一行而造成行数太多;
    例:
    always @ ( posedge SysClk or negedge SysRst ) begin
    if( !SysRst ) DataOut <= 4'b0000;
    else if( LdEn ) begin
    DataOut <= DataIn;
    End
    else DataOut <= DataOut + 4'b0001;
    end
    6. 不同层次之间的语句使用Tab键进行缩进,每加深一层缩进一个Tab;
    8. 在endmodule,endtask,endcase等标记一个代码块结束的关键词后面要加上一行注释说明这个代码块的名称;
    9. 在task名称前加tsk以示标记。在function的名称前加func以示标记。例如:
    task tskResetSystem;
    ……
    endtask //of tskResetSystem
    五.小结:
    以上列出的代码编写规范无法覆盖代码编写的方方面面,还有很多细节问题,需要在实际编写过程中加以考虑。并且有些规定也不是绝对的,需要灵活处理。并不是律条,但是在一个项目组内部、一个项目的进程中,应该有一套类似的代码编写规范来作为约束。
    总的方向是,努力写整洁、可读性好的代码


    二.reg型
    在“always”块内被赋值的每一个信号都必须定义成reg型。
    reg型数据的缺省初始值是不定值。
    reg型只表示被定义的信号将用在“always”块内,理解这一点很重要。并不是说reg型信号一定是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出,但并不一定总是这样。

    三.memory型
    memory型数据是通过扩展reg型数据的地址范围来生成的。其格式如下:

    reg [n-1:0] 存储器名[m-1:0];
    或        reg [n-1:0] 存储器名[m:1];

    在这里,reg[n-1:0]定义了存储器中每一个存储单元的大小,即该存储单元是一个n位的寄存器。存储器名后的[m-1:0]或[m:1]则定义了该存储器中有多少个这样的寄存器。
    reg [7:0] mema[255:0];

    这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0到255。注意:对存储器进行地址索引的表达式必须是常数表达式。
    尽管memory型数据和reg型数据的定义格式很相似,但要注意其不同之处。如一个由n个1位寄存器构成的存储器组是不同于一个n位的寄存器的。见下例:

    reg [n-1:0] rega;    //一个n位的寄存器
    reg mema [n-1:0];    //一个由n个1位寄存器构成的存储器组

    一个n位的寄存器可以在一条赋值语句里进行赋值,而一个完整的存储器则不行。见下例:

    rega =0;        //合法赋值语句
    mema =0;        //非法赋值语句

    如果想对memory中的存储单元进行读写操作,必须指定该单元在存储器中的地址。下面的写法是正确的。
    mema[3]=0;        //给memory中的第3个存储单元赋值为0。
    3.3.1.基本的算术运算符

    在Verilog HDL语言中,算术运算符又称为二进制运算符,共有下面几种:
    1)      + (加法运算符,或正值运算符,如 rega+regb,+3)
    2)      -(减法运算符,或负值运算符,如 rega-3,-3)
    3)      ×(乘法运算符,如rega*3)
    4)      / (除法运算符,如5/3)
    5)      % (模运算符,或称为求余运算符,要求%两侧均为整型数据。如7%3的值为1)

    注意:        在进行算术运算操作时,如果某一个操作数有不确定的值x,则整个结果也为不定值x。
    1)      ~          //取反
    2)      &          //按位与
    3)      |          //按位或
    4)      ^          //按位异或
    5)      ^~         //按位同或(异或非)
    在Verilog HDL语言中存在三种逻辑运算符:
    1)      && 逻辑与
    2)      || 逻辑或
    3)      ! 逻辑非

    关系运算符共有以下四种:

    a < b       a小于b
    a > b       a大于b
    a <= b      a小于或等于b
    a >= b      a大于或等于b

    3.3.5.等式运算符
    3.3.6.移位运算符
    3.3.7.位拼接运算符(Concatation)
    3.3.10.关键词
    在Verilog HDL中,所有的关键词是事先定义好的确认符,用来组织语言结构。关键词是用小写字母定义的,因此在编写原程序时要注意关键词的书写,以避免出错。下面是Verilog HDL中使用的关键词(请参阅附录:Verilog语言参考手册):

    always, and, assign,begin,buf,bufif0,bufif1,case,casex,casez,cmos,deassign,default,defparam,disable,edge,else,end,endcase,endmodule,endfunction,endprimitive, endspecify, endtable, endtask, event, for, force, forever, fork, function,highz0, highz1, if,initial, inout, input,integer,join,large,macromodule,medium,module,nand,negedge,nmos,nor,not,notif0,notifl, or, output, parameter, pmos, posedge, primitive, pull0, pull1, pullup, pulldown, rcmos, reg, releses, repeat, mmos, rpmos, rtran, rtranif0,rtranif1,scalared,small,specify,specparam,strength,strong0, strong1, supply0, supply1, table, task, time, tran, tranif0, tranif1, tri, tri0, tri1, triand, trior, trireg,vectored,wait,wand,weak0,weak1,while, wire,wor, xnor, xor



    (1).非阻塞(Non_Blocking)赋值方式( 如 b <= a; )
    1)      块结束后才完成赋值操作。
    2)      b的值并不是立刻就改变的。
    3)      这是一种比较常用的赋值方法。(特别在编写可综合模块时)

    (2).阻塞(Blocking)赋值方式( 如 b = a; )
    1)      赋值语句执行完后,块才结束。
    2)      b的值在赋值语句执行完后立刻就改变的。
    3)      可能会产生意想不到的结果。

    一.顺序块
    顺序块有以下特点:
    1)      块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。
    2)      每条语句的延迟时间是相对于前一条语句的仿真时间而言的。
    3)      直到最后一条语句执行完,程序流程控制才跳出该语句块。
    顺序块的格式如下:
    begin
    语句1;
    语句2;
    ......
    语句n;
    end
    其中:
            块名即该块的名字,一个标识名。其作用后面再详细介绍。
            块内声明语句可以是参数声明语句、reg型变量声明语句、integer型变量声明语句、real型变量声明语句。

    二. 并行块
    并行块有以下四个特点:
    1)      块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行。
    2)      块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间的。
    3)      延迟时间是用来给赋值语句提供执行时序的。
    4)      当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。

    并行块的格式如下:
    fork
    语句1;
    语句2;
    .......
    语句n;
    join
    其中:
    •        块名即标识该块的一个名字,相当于一个标识符。
    •        块内说明语句可以是参数说明语句、reg型变量声明语句、integer型变量声明语句、real型变量声明语句、time型变量声明语句、事件(event)说明语句。

    在fork_join块内,各条语句不必按顺序给出,因此在并行块里,各条语句在前还是在后是无关紧要的。见下例:

    三. 块名
    在VerilgHDL语言中,可以给每个块取一个名字,只需将名字加在关键词begin或fork后面即可。这样做的原因有以下几点。
    1)      这样可以在块内定义局部变量,即只在块内使用的变量。
    2)      这样可以允许块被其它语句调用,如被disable语句。
    3)      在Verilog语言里,所有的变量都是静态的,即所有的变量都只有一个唯一的存储地址,因此进入或跳出块并不影响存储在变量内的值。
    基于以上原因,块名就提供了一个在任何仿真时刻确认变量值的方法。





    casez语句用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况。

    如果用到if语句,最好写上else项。如果用case语句,最好写上default项。遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,同时也增强了Verilog程序的可读性。
    3.6.循环语句

    在Verilog HDL中存在着四种类型的循环语句,用来控制执行语句的执行次数。

    1)    forever        连续的执行语句。
    2)    repeat        连续执行一条语句 n 次。
    3)    while        执行一条语句直到某个条件不满足。如果一开始条件即不满足(为假),
                 则语句一次也不能被执行。
    4)    for通过以下三个步骤来决定语句的循环执行。
    a)      先给控制循环次数的变量赋初值。
    b)      判定控制循环的表达式的值,如为假则跳出循环语句,如为真则执行指定的语句后,转到第三步。
    c) 


    #1:当为时序逻辑建模,使用“非阻塞赋值”。
    #2:当为锁存器(latch)建模,使用“非阻塞赋值”。
    #3:当用always块为组合逻辑建模,使用“阻塞赋值”
    #4:当在同一个always块里面既为组合逻辑又为时序逻辑建模,使用“非阻塞赋值”。
    #5:不要在同一个always块里面混合使用“阻塞赋值”和“非阻塞赋值”。
    #6:不要在两个或两个以上always块里面对同一个变量进行赋值。
    #7:使用$strobe以显示已被“非阻塞赋值”的值。
    #8:不要使用#0延迟的赋值。
    #9:在VERILOG语法中, if...else if ... else 语句是有优先级的,一般说来第一个IF的优先级最高,最后一个ELSE的优先级最低。如果描述一个编码器,在XILINX的XST综合参数就有一个关于优先级编码器硬件原语句的选项Priority Encoder Extraction. 而CASE语句是"平行"的结构,所有的CASE的条件和执行都没有“优先级”。而建立优先级结构会消耗大量的组合逻辑,所以如果能够使用CASE语句的地方,尽量使用CASE替换IF...ELSE结构。
    #10:XILINX的底层可编程硬件资源叫SLICE,由2个FF和2个LUT组成。 FF触发器  LUT查找表
    ALTERA的底层可编程硬件资源叫LE,  由1个FF和1个LUT组成。
    #11:慎用锁存器(latch),同步时序设计要尽量避免使用锁存器,综合出非目的性latch的主要原因在于不完全的条件判断句。另外一种情况是设计中有组合逻辑的反馈环路(combinatorial feedback loops)。
    #12:状态机的一般设计原则,Biary, gray-code 编码使用最少的触发器,较多的组合逻辑。而one-hot编码反之。所以CPLD多使用GRAY-CODE, 而FPGA多使用ONE-HOT编码。另一方面,小型设计使用GRAY-CODE和BINARY编码更有效,而大型状态机使用ONE-HOT更有效。
    #13:业界主流CPLD产品是lattice的LC4000系列和ALTERA的MAX3000系列。
    #14:复位使初始状态可预测,防止出现禁用状态。FPGA 和CPLD 的复位信号采用异步低电平有效信号,连接到其全局复位输入端,使用专用路径通道,复位信号必须连接到FPGA 和CPLD 的全局复位管脚。。
    #15:不要用时钟或复位信号作数据或使能信号,也不能用数据信号作为时钟或复位信号,否则HDL 综合时会出现时序验证问题。信号穿过时钟的两半个周期时,要在前后分别取样;防止出现半稳定状态。
    #16:fpga设计中 不要使用门时钟(don't use gated clock)。时钟信号必须连接到全局时钟管脚上。
    #17:不要使用内部三态信号,否则增加功耗。
    #18:只使用同步设计,不要使用延时单元。
    #19:避免使用负延触发的双稳态多谐振荡器(flip flop)。
    #20:不要使用信号和变量的默认值(或初始值),用复位脉冲初始化
    信号和变量。
    #21:不要在代码中使用buffer 类型的端口读取输出数据;要使用out 类型,再增加另外变量或信号,以获取输出值。
    这是因为buffer 类型的端口不能连接到其他类型的端口上,因此buffer 类型就会在整个设计的端口中传播下去。
    #22:对变量要先读后写;如果先写后读,就会产生长的组合逻辑和锁存器(或寄存器)。这是因为变量值是立即获取的。
    #23:在组合逻辑进程中,其敏感向量标中要包含所有要读取得信号;这是为了防止出现不必要的锁存器。

    近期,在stephen Brown的一本书数字逻辑基础与verilog设计一书中看到关于触发器电路的时序分析。以前一直没有搞明白这个问题,现在觉得豁然开朗。怕忘记了,特地摘抄与此与edacn网友分享。
    触发器电路的时序分析:
    图7-84给出了一个使用D触发器的简单电路。我们想要计算该电路能正常工作的最大的时钟频率Fmax,并且想确定该电路的保持时间是否不够长。在技术文献中,这种类型的电路分析通常叫做时序分析。假设该触发器的时序参数为:tsu=0.6ns,th=0.4ns,0.8ns<=tcQ<=1.0ns。给tcq参数规定一个范围是因为延迟参数分布在一定范围内,这样处理是现成集成电路芯片常用的方法。为了计算最小的时钟信号周期Tmin=1/Fmax,我们必须考虑在触发器中从开始到结束的所有路径。在这个简单的电路中,只有一条这样的路径,这条路径开始于数据被时钟信号的正跳变沿加载进入触发器,经过tcQ的延迟后传播到Q的输出端,再传播通过非门,同时必须满足D输入端的建立时间要求。因此:
    Tmin=tcQ+tNOT+tsu
    由于我们关注的只是计算出最长的延迟时间,所以应该用tcQ的最大值。为了计算出tNOT,我们将假设通过任何逻辑门的延迟都可以用1+0.1k进行计算,其中k是该门的输入信号的个数。对非门而言,k=1,因此得到如下Tmin和Fmax的值:Tmin=1.0+1.1+0.6=2.7ns
    Fmax=1/2.7ns=370.37MHz
    当然,有必要检查电路中的保持时间是否违反规定。在这种场合,我们必须核查从时钟信号的正跳变沿到D输入值改变的最短延迟。该延迟由tcQ+tNOT=0.8+1.1=1.9ns给定。因为1.9ns>0.4ns,所以保持时间够长,没有违反规定。再举一个触发器电路时序分析的例子,请考虑图7-85所示的计数器电路。假设所用的触发器的时序参数与图7-84中用过的触发器相同,请计算该电路能正常运行的最高频率。再次假设通过逻辑门的传播延迟可以用1+0.1k来计算。
    在这个电路中,存在着四个触发器从开始到结束的许多路径。最长的路径从触发器Q0起到触发器Q3结束。在某个电路中最长的路径成为关键路径。关键路径的延迟包括触发器Q0的时钟信号到Q的延迟、通过三个与门的传播延迟和一个异或门的延迟。我们还必须考虑触发器Q3的建立时间。因此,得到
    Tmin=tcQ+3(tAND)+tXOR+tsu
    用tcQ的最大值,得到
    Tmin=1.0+3(1.2)+1.2+0.6=6.4ns
    Fmax=1/6.4ns=156.25MHz
    该电路的最短路径是从每个触发器通过异或门反馈到该触发器本身的输入端。沿每个这样路径的最小延迟为tcQ+tXOR=0.8+1.2=2.0ns。因为2.0ns>th=0.4ns,因此保持时间足够长,没有违反规定。
           在上面的分析中,假设时钟信号同时到达所有四个触发器。我们现在将重复这个分析,假设时钟信号同时到达触发器Q0,Q1,Q2,但到达触发器Q3有一些延迟。始终到达不同的触发器之间的时间差称为时钟偏差(clock skew),记作tskew,时钟偏差可以由许多原因引起。
           在图7-85中,电路的关键路径是从触发器Q0起到触发器Q3。然而,Q3的时钟偏差使得这个延迟减少,因为时钟偏差在数据被加载进该触发器前提供了附加的时间。如果考虑增加1.5ns的时钟偏差,则从触发器Q0到触发器Q3的路径延迟由tcQ+3(tAND)+tXOR+tsu-tskew=6.4-1.5ns=4.9ns给定。该电路现在还存在一个不同的关键路径,该路径从触发器Q0起到触发器Q2结束。这条路径的延迟为
    Tmin=tcQ+2(tAND)+tXOR+tsu=1.0+2(1.2)+1.2+0.6ns=5.2ns
    Fmax=1/5.2ns=192.31MHz
           在这种场合,时钟偏差导致电路的最高时钟频率提高。但是,如果时钟偏差是负的,即触发器Q3的时钟到达时间比其他触发器更早一些,则会造成该电路的最高时钟频率Fmax降低。
           因为数据加载到触发器Q3被时钟偏差延迟了,所以对所有起始于Q0,Q1,Q2而以Q3为结束点的路径,都会产生使触发器Q3的保持时间需要增加到th+tskew的影响。在该电路中,这种最短的路径是从触发器Q2到Q3的路径,其延迟时间为TcQ+tAND+tXOR=0.8+1.2+1.2=3.2ns。因为3.2ns>th+tskew=1.9ns,所以保持时间足够长,没有违反规定。
    如果对时钟偏差值tskew>=3.2-th=2.8ns,重复以上保持时间的分析,则会出现保持时间不够的情况。当tskew>=2.8ns时,该电路将不可能在任何频率下可靠地运行。由于时钟偏差的存在会引起电路时序问题,所以好的电路设计方法必须保证时钟信号到达所有触发器的偏差尽可能小。
    最后是我的总结:确定最小周期是找关键路径即最长路径。确定Th是否违例是找最短路径。最短路径要大于Th。如果有Tskew的情况则要大于Th+Tskew(有skew的寄存器为最短路径的终点的时候)
    还有就是我对有Tskew的情况的时候为什么防止违例要最短路径>Th+Tskew。因为Q0,Q1和Q2时钟比Q3早,以他们为起点的路径已经开始走了一段时间后Q3的时钟才到才开始打入数据。所以保持时间上要加上这段skew

    ISE 约束文件的基本操作
    1.约束文件的概念

    FPGA设计中的约束文件有3类:用户设计文件(.UCF文件)、网表约束文件(.NCF文件)以及物理约束文件(.PCF文件),可以完成时序约束、管脚约束以及区域约束。3类约束文件的关系为:用户在设计输入阶段编写UCF文件,然后UCF文件和设计综合后生成NCF文件,最后再经过实现后生成PCF 文件。本节主要介绍UCF文件的使用方法。

    UCF文件是ASC 2码文件,描述了逻辑设计的约束,可以用文本编辑器和Xilinx约束文件编辑器进行编辑。NCF约束文件的语法和UCF文件相同,二者的区别在于: UCF文件由用户输入,NCF文件由综合工具自动生成,当二者发生冲突时,以UCF文件为准,这是因为UCF的优先级最高。PCF文件可以分为两个部分:一部分是映射产生的物理约束,另一部分是用户输入的约束,同样用户约束输入的优先级最高。一般情况下,用户约束都应在UCF文件中完成,不建议直接修改 NCF文件和PCF文件。

    2.创建约束文件

    约束文件的后缀是.ucf,所以一般也被称为UCF文件。创建约束文件有两种方法,一种是通过新建方式,另一种则是利用过程管理器来完成。

    第一种方法:新建一个源文件,在代码类型中选取“Implementation Constrains File”,在“File Name”中输入“one2two_ucf”。单击“Next”按键进入模块选择对话框,选择模块“one2two”,然后单击“Next”进入下一页,再单击“Finish”按键完成约束文件的创建。

    第二种方法:在工程管理区中,将“Source for”设置为“Synthesis/Implementation”。“Constrains Editor”是一个专用的约束文件编辑器,双击过程管理区中“User Constrains”下的“Create Timing Constrains”就可以打开“Constrains Editor”,其界面如图所示:


    图 启动Constrains Editor引脚约束编辑

    在“Ports”选项卡中可以看到,所有的端口都已经罗列出来了,如果要修改端口和FPGA管脚的对应关系,只需要在每个端口的“Location”列中填入管脚的编号即可。例如在UCF文件中描述管脚分配的语法为:

            NET “端口名称” LOC = 引脚编号;

    需要注意的是,UCF文件是大小敏感的,端口名称必须和源代码中的名字一致,且端口名字不能和关键字一样。但是关键字NET是不区分大小写的。

    3.编辑约束文件

    在工程管理区中,将“Source for”设置为“Synthesis/Implementation”,然后双击过程管理区中“User Constrains”下的“Edit Constraints (Text)”就可以打开约束文件编辑器,如下图所示,就会新建当前工程的约束文件。
      

    图 用户约束管理窗口

    UCF文件的语法说明
    1.语法 
            UCF文件的语法为:
    {NET|INST|PIN} "signal_name" Attribute;
    其中,“signal_name”是指所约束对象的名字,包含了对象所在层次的描述;“Attribute”为约束的具体描述;语句必须以分号“;”结束。可以用“#”或“/* */”添加注释。需要注意的是:UCF文件是大小写敏感的,信号名必须和设计中保持大小写一致,但约束的关键字可以是大写、小写甚至大小写混合。例如:
    NET "CLK" LOC = P30;
    “CLK”就是所约束信号名,LOC = P30;是约束具体的含义,将CLK信号分配到FPGA的P30管脚上。

    对于所有的约束文件,使用与约束关键字或设计环境保留字相同的信号名会产生错误信息,除非将其用" "括起来,因此在输入约束文件时,最好用" "将所有的信号名括起来。

    2.通配符
    在UCF文件中,通配符指的是“*”和“?”。“*”可以代表任何字符串以及空,“?”则代表一个字符。在编辑约束文件时,使用通配符可以快速选择一组信号,当然这些信号都要包含部分共有的字符串。例如:
    NET "*CLK?" FAST;
    将包含“CLK”字符并以一个字符结尾的所有信号,并提高了其速率。
    在位置约束中,可以在行号和列号中使用通配符。例如:
    INST "/CLK_logic/*" LOC = CLB_r*c7;
    把CLK_logic层次中所有的实例放在第7列的CLB中。

    3.定义设计层次
           在UCF文件中,通过通配符*可以指定信号的设计层次。其语法规则为:
    * 遍历所有层次
    Level1/* 遍历level1及以下层次中的模块
    Level1/*/ 遍历level1种的模块,但不遍历更低层的模块

    例4-5 根据图4-75所示的结构,使用通配符遍历表4-3所要求的各个模块。


    图 层次模块示意图
    表 要求遍历的符号列表

    管脚和区域约束语法

    LOC约束是FPGA设计中最基本的布局约束和综合约束,能够定义基本设计单元在FPGA芯片中的位置,可实现绝对定位、范围定位以及区域定位。此外, LOC还能将一组基本单元约束在特定区域之中。LOC语句既可以书写在约束文件中,也可以直接添加到设计文件中。换句话说,ISE中的FPGA底层工具编辑器(FPGA Editor)、布局规划器(Floorplanner)和引脚和区域约束编辑器的主要功能都可以通过LOC语句完成。 
    •         LOC语句语法
    INST "instance_name " LOC = location;

    其中“location”可以是FPGA芯片中任一或多个合法位置。如果为多个定位,需要用逗号“,”隔开,如下所示:
    LOC = location1,location2,...,locationx;
    目前,还不支持将多个逻辑置于同一位置以及将多个逻辑至于多个位置上。需要说明的是,多位置约束并不是将设计定位到所有的位置上,而是在布局布线过程中,布局器任意挑选其中的一个作为最终的布局位置。

    范围定位的语法为:
    INST “instance_name” LOC=location:location [SOFT];

    常用的LOC定位语句如表4-4所列。
    表 常用的LOC定位语句

    使用LOC完成端口定义时,其语法如下:
    NET "Top_Module_PORT" LOC = "Chip_Port";

    其中,“Top_Module_PORT”为用户设计中顶层模块的信号端口,“Chip_Port”为FPGA芯片的管脚名。

    LOC语句中是存在优先级的,当同时指定LOC端口和其端口连线时,对其连线约束的优先级是最高的。例如,在图4-76中,LOC=11的优先级高于LOC=38。


    图 LOC优先级示意图
    2.LOC属性说明

    LOC语句通过加载不同的属性可以约束管脚位置、CLB、Slice、TBUF、块RAM、硬核乘法器、全局时钟、数字锁相环(DLL)以及DCM模块等资源,基本涵盖了FPGA芯片中所有类型的资源。由此可见,LOC语句功能十分强大,表4-5列出了LOC的常用属性。
    表 LOC语句常用属性列表



    Verilog HDL代码描述对状态机综合的研究
    2007-11-25 16:59
    1 引言
        Verilog HDL作为当今国际主流的HDL语言,在芯片的前端设计中有着广泛的应用。它的语法丰富,成功地应用于设计的各个阶段:建模、仿真、验证和综合等。可综合是指综合工具能将Verilog HDL代码转换成标准的门级结构网表,因此代码的描述必须符合一定的规则。大部分数字系统都可以分为控制单元和数据单元两个部分,控制单元的主体是一个状态机,它接收外部信号以及数据单元产生的状态信息,产生控制信号,因而状态机性能的好坏对系统性能有很大的影响。
        有许多可综合状态机的Verilog代码描述风格,不同代码描述风格经综合后得到电路的物理实现在速度和面积上有很大差别。优秀的代码描述应当易于修改、易于编写和理解,有助于仿真和调试,并能生成高效的综合结果。
    2 有限状态机
        有限状态机(Finite State Machine,FSM)在数字系统设计中应用十分广泛。根据状态机的输出是否与输入有关,可将状态机分为两大类:摩尔(Moore)型状态机和米莉(Mealy)型状态机。Moore型状态机的输出仅与现态有关;Mealy型状态机的输出不仅与现态有关,而且和输入也有关。图1是有限状态机的一般结构图,它主要包括三个部分,其中组合逻辑部分包括状态译码器和输出译码器,状态译码器确定状态机的下一个状态,输出译码器确定状态机的输出,状态寄存器属于时序逻辑部分,用来存储状态机的内部状态。

    图1 状态机的结构框图
    2.1 好的状态机标准
        好的状态机的标准很多,最重要的几个方面如下:
    第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义。其一要求该FSM的综合实现结果无_毛刺等异常扰动,其二要求FSM要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态。
    第二,状态机的设计要满足设计的面积和速度的要求。
    第三,状态机的设计要清晰易懂、易维护。
        需要说明的是,以上各项标准,不是割裂的,它们有着直接紧密的内在联系。在芯片设计中,对综合结果评判的两个基本标准为:面积和速度。“面积”是指设计所占用的逻辑资源数量;“速度”指设计在芯片上稳定运行所能够达到的最高频率。两者是对立统一的矛盾体,要求一个设计同时具备设计面积最小,运行频率最高,这是不现实的。科学的设计目标应该是:在满足设计时序要求(包含对设计最高频率的要求)的前提下,占用最小的芯片面积,或者在所规定的面积下,使设计的时序余量更大,频率更高。另外,如果要求FSM安全,则很多时候需要使用“full case”的编码方式,即将状态转移变量的所有向量组合情况都在FSM 中有相应的处理,这经常势必意味着要多花更多的设计资源,有时也会影响FSM的频率所以,上述的标准要综合考虑,根据设计的要求进行权衡。

    2.2 状态机描述方法
        状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式:
    第一,整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;
    第二,用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
    第三,在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态的输出(可以用组合电路输出,也可以时序电路输出)。
        一般而言,推荐的FSM 描述方法是后两种。这是因为:FSM和其他设计一样,最好使用同步时序方式设计,以提高设计的稳定性,消除毛刺。状态机实现后,一般来说,状态转移部分是同步时序电路而状态的转移条件的判断是组合逻辑。
        第二种描述方法同第一种描述方法相比,将同步时序和组合逻辑分别放到不同的always模块中实现,这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。在第二种方式的描述中,描述当前状态的输出用组合逻辑实现,组合逻辑很容易产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计。第三种描述方式与第二种相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。

    2.3 状态机的编码
        二进制编码(Binary)、格雷码(Gray-code)编码使用最少的触发器,较多的组合逻辑,而独热码(One-hot)编码反之。独热码编码的最大优势在于状态比较时仅仅需要比较一个位,从而一定程度上简化了比较逻辑,减少了毛刺产生的概率。由于CPLD更多地提供组合逻辑资源,而FPGA更多地提供触发器资源,所以CPLD多使用二进制编码或格雷码,而FPGA多使用独热码编码。另一方面,对于小型设计使用二进制和格雷码编码更有效,而大型状态机使用独热码更高效。
    3 实例说明
        下面通过实例来说明Verilog HDL代码描述对状态机综合结果的影响。
        设计一个序列检测器,用于检测串行的二进制序列,每当连续输入三个或三个以上的1时,序列检测器的输出为1,其它情况下输出为0。
        假设初始的状态为s0,输入一个1的状态记为s1,连续输入二个1后的状态记为s2,输入三个或以上1的状态记为s3,不论现态是何种状态一旦输入0的话,就返回到初始状态。根据题意,可画出状态图如图2所示。

    图2 状态图
    根据状态图以及前面状态机的介绍,可以采用一个always模块来描述,状态编码采用二进制编码,程序如下:
    module fsm(clk,ina,out);
    input clk,ina;
    output out;
    reg out;
    parameter s0 = 3'bOO,s1 =3'b01,s2 =3'b10,s3=3'b11;
    reg[0:1]state;
    always @ (posedge clk)
    begin
    state<=s0;
    out =0;
    case(state)
    s0:begin
    state<=(ina)?s1:s0;out=0;
    end
    s1:begin
    state<=(ina)?s2:s0;out=0;
    end
    s2:begin
    state<=(ina)?s3:s0;out=0;
    end
    s3:begin
    state<=(ina)?s3:s0;out=1;
    end
    endcase
    end
    endmodule
        采用Synplify Pro工具在Altera EPF10K10系列器件上进行综合,其综合的结果如图3所示。

        如果采用两个always来描述,程序的模块声明、端口定义和信号类型部分不变,只是改动逻辑功能描述部分,改动部分的程序如下:
    alwys @ (posedge dk)
    state fsm <=next_state;
    always @ (state_fsm or ina)
    begin
    state<=s0;out =0;
    case(state_fsm )
    s0:begin
    next_state=(ina)?s1:s0;out=0;
    end
    s1:begin
    next state=(ina)?s2:s0;out=0:
    end
    s2:begin
    next_state=(ina)?s3:s0;out=0;
    end
    s3:begin
    next_state=(ina)?s3:s0;out=1;
    end
    endcase
    end
    endmodule
        在相同的器件上其综合的结果如图4所示,比较图3与图4的综合结果,可以看出。两种综合结果都是采用了两个触发器来存储状态。其不同的地方是输出部分,采用一个always模块的输出结果是寄存器输出。采用两个always模块描述的是组合逻辑直接输出,这是因为代码中的输出赋值也放在了时钟的上升沿(always @ (posedge clk))。其综合的结果是寄存器,因此它比直接组合逻辑输出延迟一个时钟周期。

    图4
        如果采用一位hot编码,仅改动参数设置的两行程序。采用一个always模块描述,改动部分的程序如下:
    parameter s0 = 3'b0001,s1 =3'b0010,s2 =3'b0100,s3=3'b1000;
    reg[0:3] state;

    图5
        综合的结果如图5所示。将图5与图3相比,可以看出:
        图5中状态寄存器采用了4个触发器来存储状态,而图3采用了两个触发器来存储状态,这是由于它们的状态编码的不同而得到的不同的综合结果,采用二进制编码综合得到的触发器要比采用独热码综合得到的触发器少。它们的共同之处都是采用了寄存器来输出的。
    3 结束语
        有多种可综合状态机的Verilog HDL代码描述风格。其综合的结果是不同的。其中广泛采用的是两个或三个always模块描述。组合逻辑输出型状态机不适合应用在高速复杂系统设计中,在高速系统中应当采用寄存器输出型状态机。寄存器类型信号不会产生毛刺,并且输出不含组合逻辑。会减少组合逻辑门延时。容易满足高速系统设计要求。总之,状态机的设计是数字系统设计中的关键部分,设计时做到心中有电路。充分考虑其综合的结果,才能编写出高质量的综合代码。进而提高设计水平。


    模块划分非常重要,除了关系到是否最大程度上发挥项目成员的协同设计能力,而且直接决定着设计的综合、实现时间。下面是一些模块划分的原则。
         a.对每个同步设计的子模块的输出使用寄存器(registering)。也即用寄存器分割同步时序模块的原则。) @( F3 f+ D" j
         使用寄存器的好处有:综合工具在编译综合时会将所分割的子模块中的组合电路和同步时序电路整体考虑。而且这种模块结构符合时序约束的习惯,便于使用时序约束熟悉进行约束。) q9 t/ |# a  \7 p0 C
         b.将相关的逻辑或者可以复用的逻辑划分在同一模块内。
         这样做的好处有,一方面将相关的逻辑和可以复用的逻辑划分在同一模块,可以最大程度的复用资源,减少设计消耗的面积。同时也更利于综合工具优化一个具体功能(操作)在时序上的关键路径。其原因是,综合工具只能同时考虑一部分逻辑,而所同时优化的逻辑单元就是模块,所以将相关功能划分在同一模块更有利于综合器的优化。; l/ w" k5 r9 G4 X4 x
         c.将不同优化目标的逻辑分开。
         好的设计,在规划阶段,设计者就已经思考了设计的大概规模和关键路径,并对设计的优化目标有一个整体上的把握。对于时序紧张的部分,应该独立划分为一个模块,其优化目标为“speed”,这种划分方法便于设计者进行时序约束,也便于综合和实现工具进行优化。比如时序优化的利器Amplify,使用模块进行区域优化更方便一些。另一类矛盾集中在面积的设计,也应该划分成独立的模块,这类模块的优化目标是“Area”,同样将他们规划到一起,更有利于区域布局与约束。这种根据优化目标进行优化的方法的最大好处是,对于某个模块综合器仅仅需要考虑一种优化目标和策略,从而比较容易达到较好的优化效果。相反的如果同时考虑两种优化目标,会使综合器陷入互相制约的困境。
         d.将松约束的逻辑归到同一模块。
         有些逻辑的时序非常宽松,不需要较高的时序约束,可以将这类逻辑归入同一模块,如多周期路径“multi-cycle”等。将这些模块归类,并指定松约束,则可以让综合器尽量的节省面积资源。
         e.将RAM/ROM/FIFO等逻辑独立划分成模块。
         这样做的好处是便于综合器将这类资源类推为器件的硬件原语,同时仿真时消耗的内存也会少些,便于提高仿真速度。(大多数仿真器对大面积的RAM都有独特的内存管理方式)0 o4 B! p5 Q- D) O) Y7 M/ ]
         f.合适的模块规模。
         规模大,利于“Resource Sharing”。但是对综合器同时处理的逻辑量太大,不利于多模块和增量编译模式。


    关于约束,时序分析的问题汇总
    很多人发贴,来信询问关于约束、时序分析的问题,比如:如何设置setup,hold时间?如何使用全局时钟和第二全局时钟(长线资源)?如何进行分组约束?如何约束某部分组合逻辑?如何通过约束保证异步时钟域之间的数据交换可靠?如何使用I/O逻辑单元内部的寄存器资源?如何进行物理区域约束,完成物理综合和物理实现?等等。。。
    为了解决大家的疑难,我们将逐一讨论这些问题。

    今天先讨论一下约束的作用?
    有些人不知道何时该添加约束,何时不需要添加?有些人认为低速设计不需要时序约束?关于这些问题,希望下面关于约束作用的论述能够有所帮助!
    附加约束的基本作用有3:
    (1)提高设计的工作频率
    对很多数字电路设计来说,提高工作频率非常重要,因为高工作频率意味着高处理能力。通过附加约束可以控制逻辑的综合、映射、布局和布线,以减小逻辑和布线延时,从而提高工作频率。
    (2)获得正确的时序分析报告
    几乎所有的FPGA设计平台都包含静态时序分析工具,利用这类工具可以获得映射或布局布线后的时序分析报告,从而对设计的性能做出评估。静态时序分析工具以约束作为判断时序是否满足设计要求的标准,因此要求设计者正确输入约束,以便静态时序分析工具输出正确的时序分析报告。
    (3)指定FPGA/CPLD引脚位置与电气标准
    FPGA/CPLD的可编程特性使电路板设计加工和FPGA/CPLD设计可以同时进行,而不必等FPGA/CPLD引脚位置完全确定,从而节省了系统开发时间。这样,电路板加工完成后,设计者要根据电路板的走线对FPGA/CPLD加上引脚位置约束,使FPGA/CPLD与电路板正确连接。另外通过约束还可以指定IO引脚所支持的接口标准和其他电气特性。为了满足日新月异的通信发展,Xilinx新型FPGA/CPLD可以通过IO引脚约束设置支持诸如AGP、BLVDS、CTT、GTL、GTLP、HSTL、LDT、LVCMOS、LVDCI、LVDS、LVPECL、LVDSEXT、LVTTL、PCI、PCIX、SSTL、ULVDS等丰富的IO接口标准。

    另外通过区域约束还能在FPGA上规划各个模块的实现区域,通过物理布局布线约束,完成模块化设计等。

    贴2:时序约束的概念和基本策略!
    时序约束主要包括周期约束(FFS到FFS,即触发器到触发器)和偏移约束(IPAD到FFS、FFS到OPAD)以及静态路径约束(IPAD到OPAD)等3种。通过附加约束条件可以使综合布线工具调整映射和布局布线过程,使设计达到时序要求。例如用OFFSET_IN_BEFORE约束可以告诉综合布线工具输入信号在时钟之前什么时候准备好,综合布线工具就可以根据这个约束调整与IPAD相连的Logic Circuitry的综合实现过程,使结果满足FFS的建立时间要求。
    附加时序约束的一般策略是先附加全局约束,然后对快速和慢速例外路径附加专门约束。附加全局约束时,首先定义设计的所有时钟,对各时钟域内的同步元件进行分组,对分组附加周期约束,然后对FPGA/CPLD输入输出PAD附加偏移约束、对全组合逻辑的PAD TO PAD路径附加约束。附加专门约束时,首先约束分组之间的路径,然后约束快、慢速例外路径和多周期路径,以及其他特殊路径。

    贴3:周期(PERIOD)的含义
    周期的含义是时序中最简单也是最重要的含义,其它很多时序概念会因为软件商不同略有差异,而周期的概念确是最通用的,周期的概念是FPGA/ASIC时序定义的基础概念。后面要讲到的其它时序约束都是建立在周期约束的基础上的,很多其它时序公式,可以用周期公式推导。
    周期约束是一个基本时序和综合约束,它附加在时钟网线上,时序分析工具根据PERIOD约束检查时钟域内所有同步元件的时序是否满足要求。PERIOD约束会自动处理寄存器时钟端的反相问题,如果相邻同步元件时钟相位相反,那么它们之间的延迟将被默认限制为PERIOD约束值的一半。
    如下图所示,时钟的最小周期为:
    TCLK = TCKO +TLOGIC +TNET +TSETUP -TCLK_SKEW
    TCLK_SKEW =TCD2 -TCD1
    其中TCKO为时钟输出时间,TLOGIC为同步元件之间的组合逻辑延迟,TNET为网线延迟,TSETUP为同步元件的建立时间,TCLK_SKEW为时钟信号延迟的差别。

    这个帖子打算先澄清一些时序约束的基本概念,然后将在综合工具(Synplify Pro为例),设计平台(ISE5.x 和Quartus 2.2为例)的具体约束方法和技巧,然后将如何利用时序分析工具分析关键路径。如果没有意外,应该30多个帖子吧。
    仿真时序本来是Deve的老本行,随时需要Deve加入一起把这个帖子办好。欢迎大家畅谈观点,本站的版主,冲锋啊,嘻嘻。

    贴4:数据和时钟之间的约束:OFFSET和SETUP、HOLD时间。
    为了确保芯片数据采样可靠和下级芯片之间正确的交换数据,需要约束外部时钟和数据输入输出引脚之间的时序关系(或者内部时钟和外部输入/输出数据之间的关系,这仅仅是从采用了不同的参照系罢了)。约束的内容为告诉综合器、布线器输入数据到达的时刻,或者输出数据稳定的时刻,从而保证与下一级电路的时序关系。
    这种时序约束在Xilinx中用Setup to Clock(edge),Clock(edge) to hold等表示。在Altera里常用tsu (Input Setup Times)、th (Input Hold Times)、tco (Clock to Out Delays)来表示。很多其它时序工具直接用setup和hold表示。其实他们所要描述的是同一个问题,仅仅是时间节点的定义上略有不同。下面依次介绍。

    贴5:关于输入到达时间,这一贴估计问题比较多,看起来也比较累,但是没有办法,这些都是时序的基本概念啊。搞不清楚,永远痛苦,长痛不如短痛了,呵呵。

    Xilinx的"输入到达时间的计算"时序描述如图所示:

    定义的含义是输入数据在有效时钟沿之后的TARRIVAL时刻到达。则,
    TARRIVAL=TCKO+TOUTPUT+TLOGIC     公式1
    根据”贴3“介绍的周期(Period)公式,我们可以得到:
    Tcko+Toutput+Tlogic+Tinput+Tsetup-Tclk_skew=Tclk; 公式2
    将公式1代入公式2:
    Tarrival+Tinput+Tsetup-Tclk_skew=Tclk, 而Tclk_skew满足时序关系后为负,所以
    TARRIVAL +TINPUT+TSETUP <TCLK  公式3,
    这就是Tarrival应该满足的时序关系。其中TINPUT为输入端的组合逻辑、网线和PAD的延迟之和,TSETUP为输入同步元件的建立时间。

    贴6 数据延时和数据到达时间的关系:
    TDELAY为要求的芯片内部输入延迟,其最大值TDELAY_MAX与输入数据到达时间TARRIVAL的关系如图2所示。也就是说:
    TDELAY_MAX+TARRIVAL=TPERIOD 公式4
    所以:
    TDELAY<TDELAY_MAX=TPERIOD-TARRIVAL
    帖7 要求输出的稳定时间
    从下一级输入端的延迟可以计算出当前设计输出的数据必须在何时稳定下来,根据这个数据对设计输出端的逻辑布线进行约束,以满足下一级的建立时间要求,保证下一级采样的数据是稳定的。
    计算要求的输出稳定时间如图所示。
    公式的推导如下:
    定义:TSTABLE = TLOGIC +TINPUT +TSETUP
    从前面帖子介绍的周期(Period)公式,可以得到(其中TCLK_SKEW=TCLK1-TCLK2):
    TCLK=TCKO+TOUTPUT+TLOGIC+TINPUT+TSETUP+TCLK_SKEW
    将TSTABLE的定义代入到周期公式,可以得到:
    TCLK=TCKO+TOUTPUT+TSTABLE+TCLK_SKEW
    所以,
    TCKO +TOUTPUT+TSTABLE<TCLK
    这个公式就是TSTABLE必须要满足的基本时序关系,即本级的输出应该保持怎么样的稳定状态,才能保证下级芯片的采样稳定。有时我们也称这个约束关系是输出数据的保持时间的时序约束关系。只要满足上述关系,当前芯片输出端的数据比时钟上升沿提早TSTABLE 时间稳定下来,下一级就可以正确地采样数据。
    其中TOUTPUT为设计中连接同步元件输出端的组合逻辑、网线和PAD的延迟之和,TCKO为同步元件时钟输出时间。

    /*******************************************************************/
    这里的概念介绍比较繁复,但是如果想掌握数据与时钟关系的基本约束,就必须搞清楚这些概念,下一帖介绍这些概念的具体应用,实施上述约束的方法和具体命令。

    转贴lipple的问题:
    请问斑竹上面几贴那些延时属于setup,哪些属于hold啊
    周期=Tsetup+Tlogic+Thold这个公式对比斑竹的公式,区别在于是不是划分的不够细啊?
    westor的答复:
    基本是哪个意思。这些公式描述的对象是意义的,只是每个变量的定义略有区别罢了,换句话说,变量定义的节点不同。
    这个公式是altera等采用的描述方法,一些工具为了便于理解用
    周期=Tsetup+Tlogic+Thold约束时序。
    和我前面介绍的公式:
    TCLK = TCKO +TLOGIC +TNET +TSETUP -TCLK_SKEW
    相比,他把到寄存器前的所有组合逻辑logic和线延时都归在Tsetup里面了,而且上面公式忽略了Tclk_skew。

    帖8 实施上述约束的方法和命令。
    实施上述约束的基本方法是,根据已知时序信息,推算需要约束的时间值,实施约约束。具体的说是这样的,首先对于一般设计,首先掌握的是TCLK,这个对于设计者来说是个已知量。前面介绍公式和图中的TCKO和TSETUP(注:有的工具软件对TCKO和TSETUP的定义与前面图形不同,还包含了到达同步器件的一段logic的时延)是器件内部固有的一个时间量,一般我们选取典型值,对于FPGA,这个量值比较小,一般不大于1~2ns。比较难以确定的是TINPUT和TOUTPUT两个时间量。
    约束输入时间偏移,需要知道TINPUT,TINPUT为输入端的组合逻辑、网线和PAD的延迟之和(详细定义见帖5),PAD的延时也根据器件型号也有典型值可选,但是到达输入端的组合逻辑电路和网线的延时就比较难以确定了,只能通过静态时序分析工具分析,或者通过底层布局布线工具量取,有很大的经验和试探的成分在里面。
    约束输出时间偏移,需要知道TOUTPUT,TOUTPUT为设计中连接同步元件输出端的组合逻辑、网线和PAD的延迟之和(见帖7),仍然是到达输出端的组合逻辑电路和网线的延时就比较难以确定,需要通过静态时序分析工具分析,或者通过底层布局布线工具量取,有很大的经验和试探的成分在里面。
    约束的具体命令根据约束工具不同而异,首先说使用Xilinx器件的情况下,实施上述约束的命令和方法。Xilinx把上述约束统称为:OFFSET约束(偏移约束),一共有4个相关约束属性:OFFSET_IN_BEFORE、OFFSET_IN_AFTER、OFFSET_OUT_BEFORE和OFFSET_OUT_AFTER。
    其中前两个属性叫做输入偏移(OFFSET_IN)约束,基本功能相似,仅仅是约束取的参考对象不同而已。后两个属性叫做输出偏移(OFFSET_OUT)约束,基本功能相似,也是约束取的参考对象不同而已。
    为了便于理解,举例说明。
    输入偏移约束例:时钟周期为20ns,前级寄存器的TCKO选则1ns,前级输出逻辑延时TOUTPUT为3ns,中间逻辑TLOGIC的延时为10ns,那么TARRIVAL=14ns,于是可以在数据输入引脚附加
    NET DATA_IN FFET=IN  14ns  AFTER CLK
    约束,也可以使用OFFSET_IN_BEFORE对芯片内部的输入逻辑进行约束,其语法如下:
    NET DATA_IN FFET=IN  TDELAY   BEFORE CLK
    其中TDELAY为要求的芯片内部输入延迟,其最大值与输入数据到达时间TARRIVAL的关系如帖6所述:TDELAY_MAX + TARRIVAL = TPERIOD,所以
    TDELAY < TPERIOD - TARRIVAL = 20 - 14 =6 ns.
    输出偏移约束例:设时钟周期为20ns,后级输入逻辑延时TINPUT为4ns、建立时间TSETUP为1ns,中间逻辑TLOGIC的延时为10ns,那么TSTABLE=15ns,于是可以在数据输入引脚附加NET DATA_OUT FFET=OUT  15ns  BEFORE CLK
    约束,也可以直接对芯片内部的输出逻辑直接进行约束,
    NET DATA_OUT FFET=OUT  TOUTPUT_DELAY  AFTER CLK,
    其中TOUTPUT_DELAY为要求的芯片内部输出延迟,其最大值与要求的输出数据稳定时间TSTABLE的关系为:TOUTPUT_DELAY_MAX+TSTABLE= TPERIOD.
    TOUT_DELAY< TPERIOD - TSTABLE = 20 - 15 = 5ns
    /*******************************************************************/
    这些概念和推导有些枯燥和乏味,但是如果要掌握好数据与时钟之间的约束,就要耐心看下去,明天介绍一下Altera的相关约束方法。

    帖9 Altera对应的时序概念
    这两天太忙了,帖子上的有些慢,请朋友们原谅,我会尽量按照计划写完这个主题的。
    前面8个帖子介绍了一些时序概念,有的是FPGA/ASIC设计的一般性时序概念,有的为了方便叙述,主要介绍了Xilinx对应的这些时序概念,和具体的约束熟悉。下面几个帖子主要介绍Altera对应的这些时序概念和约束方法。
    前面首先介绍的第一个时序概念是周期,Period,这个概念是FPGA/ASIC通用的一个概念,各方的定义相当统一,至多是描述方式不同罢了,所有的FPGA设计都首先要进行周期约束,这样做的好处除了在综合与布局布线时给出规定目标外,还能让时序分析工具考察整个设计的Fmax等。
    Altera的周期定义如图所示,公式描述如下:
    Clock Period = Clk-to-out + Data Delay + Setup Time - Clk Skew
    即,
    Tclk         = Tco        + B          + Tsu        -(E-C)
    Fmax         = 1/Tclk
    对比一下前面的介绍,只要理解了B包含了两级寄存器之间的所有logic和net的延时就会发现与前面公式完全一致。
    一个设计的Fmax在时序报告,或者在图形界面观察。以Quartus2为例,在图形界面的观察方法是,编译实现完成后,展开Compilation Report下面的Timing Analyses,单击Fmax(not include delays to / from pins)即可。在详细报告窗口可以观察到影响周期恶化的10条最差时序路径,根据这些信息可以找出关键路径,进行时序分析。
    关于时序分析和关键路径改进等内容在后面的帖子会有专门的讨论,暂时不做进一步介绍。
    贴10
    Clock Setup Time (tsu)
    要想正确采样数据,就必须使数据和使能信号在有效时钟沿到达前就准备好,所谓时钟建立时间就是指时钟到达前,数据和使能已经准备好的最小时间间隔。如图1所示:
    注:这里定义Setup时间是站在同步时序整个路径上的,需要区别的是另一个概念Micro tsu。Micro tsu指的是一个触发器内部的建立时间,它是触发器的固有属性,一般典型值小于1~2ns。在Xilinx等的时序概念中,称Altera的Micro tsu为setup时间,用Tsetup表示,请大家区分一下。
    回到Altera的时序概念,Altera的tsu定义如下:
    tsu = Data Delay – Clock Delay + Micro tsu

    贴11
    Clock Hold Time tH
    时钟保持时间是只能保证有效时钟沿正确采用的数据和使能信号的最小稳定时间。其定义如图2所示。定义的公式为:
    tH= Clock Delay – Data Delay + Micro tH
    注:其中Micro tH是指寄存器内部的固有保持时间,同样是寄存器的一个固有参数,典型值小于1~2ns。

    贴12
    Clock-to-Output Delay(tco)
    这个时间指的是当时钟有效沿变化后,将数据推倒同步时序路径的输出端的最小时间间隔。如图3所示。
    tco = Clock Delay + Micro tco + Data Delay
    注:其中 Micor tco也是一个寄存器的固有属性,指的是寄存器相应时钟有效沿,将数据送到输出端口的内部时间参数。它与Xilinx的时序定义中,有一个概念叫Tcko是同一个概念。

    Pin to Pin Delay (tpd)
    tpd指输入管脚通过纯组合逻辑到达输出管脚这段路径的延时,特别需要说明的是,要求输入到输出之间只有组合逻辑,才是tpd延时。
    7.Slack
    Slack是表示设计是否满足时序的一个称谓,正的slack表示满足时序(时序的余量),负的slack表示不满足时序(时序的欠缺量)。slack的定义和图形如图4所示。
    Slack = Required clock period – Actual clock period
    Slack = Slack clock period – (Micro tCO+ Data Delay + Micro tSU)
    8.Clock Skew
    Clock Skew指一个同源时钟到达两个不同的寄存器时钟端的时间偏移

    展开全文
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    这些浏览器的内核分别是什么? 21 每个HTML文件里开头都有个很重要的东西,Doctype,知道这是干什么的吗? 21 Quirks模式是什么?它和Standards模式有什么区别 21 div+css的布局较table布局有什么优点? 22 img的alt...

    前端面试题汇总

    一、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. 近期总结一一面试题 都是企业的面试题笔记题 感觉薪资10k下的都会出笔试题 特别高的薪资都是直接技术面试或者是 现场编程 总结很多人的面试题,后期会对于单个知识点再说笔记详细讲解。 部分都是百度的答案,...

      近期总结一一些面试题 都是企业的面试题笔记题

      感觉薪资10k下的都会出笔试题   

      特别高的薪资都是直接技术面试或者是 现场编程 

      总结很多人的面试题,后期会对于单个知识点再说笔记详细讲解。

      最新Vue面试题网址:2021年 Vue经典面试题 -- 必问知识点 --(包含答案)_xm1037782843的博客-CSDN博客_vue面试题

      敬请关注公众 :包含全套 Vue 最新面试题  js最近面试题 等大量前端知识技术。

       

      部分都是百度的答案,不是特全面的,可以自己找下

      同时分享一个自己录制的CSS3动画特效经典案例【推荐教程】--后期会更新vue框架 微信小程序等内容。

      最近录制的ajax从基础到实战的视频,包含原生ajax  jquery的ajax 以及ajax接口获取数据等

      Ajax前端开发、项目实战、从零基础到精通、接口数据调用-学习视频教程-腾讯课堂

      红色为常见面试题

      =============================================================

      前端面试题: 

      1. 一个200*200的div在不同分辨率屏幕上下左右居中,用css实现

      <div style="width:500px;height:500px;border:1px solid green;display:flex;justify-content:center;align-items:center;">
        <div style="">
          上下左右居中
        </div>
      </div>

      2. 写一个左中右布局占满屏幕,其中左右两块是固定宽度200 ,中间自适应宽,要求先加载中间块,请写出结构及样式:

      <div id="left">我是左边</div>
          <div id="center">我是中间</div>
          <div id="right">我是右边</div>
      
      html,body{ margin: 0px;width: 100%; } 
      #left,#right{width: 200px;height: 200px;background-color: aqua;
          position: absolute;}
          #left{left: 0;top:0;}
          #right{right: 0;top:0;}
          #center{margin: 0 200px;background-color: blue;height: 200px;}

      或者利用弹性盒子

          <style>
              * {
                  margin: 0;
                  padding: 0;
              }
      
              html,
              body {
                  height: 100%;
              }
      
              body {
                  display: flex;
              }
      
              .left {
                  width: 100px;
                  background-color: rgb(199, 170, 223);
              }
      
              .center {
                  background-color: rgb(151, 228, 148);
                  flex: 1;
              }
      
              .right {
                  width: 100px;
                  background-color: rgb(199, 170, 223);
      
      
              }
          </style>
      
      <body>
          <div class="left">left</div>
          <div class="center">center</div>
          <div class="right">right</div>
      </body>
      

      3. 阐述清楚浮动的几种方式(常见问题)

      1.父级div定义 height

      原理:父级div手动定义height,就解决了父级div无法自动获取到高度的问题。
      优点:简单、代码少、容易掌握
      缺点:只适合高度固定的布局,要给出精确的高度,如果高度和父级div不一样时,会产生问题

      2.父级div定义 overflow:hidden

      原理:必须定义width或zoom:1,同时不能定义height,使用overflow:hidden时,浏览器会自动检查浮动区域的高度
      优点:简单、代码少、浏览器支持好

      4. 结尾处加空div标签 clear:both

      原理:添加一个空div,利用css提高的clear:both清除浮动,让父级div能自动获取到高度
      优点:简单、代码少、浏览器支持好、不容易出现怪问题

      缺点:不少初学者不理解原理;如果页面浮动布局多,就要增加很多空div,让人感觉很不好

      5. 解释css sprites ,如何使用?

      CSS Sprites其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS的“background-image”,“background- repeat”,“background-position”的组合进行背景定位,background-position可以用数字能精确的定位出背景图片的位置。

      CSS Sprites为一些大型的网站节约了带宽,让提高了用户的加载速度和用户体验,不需要加载更多的图片

      6. 如何用原生js给一个按钮绑定两个onclick事件?

      Var  btn=document.getElementById(‘btn’);

      //事件监听 绑定多个事件

      var btn4 = document.getElementById("btn4");

      btn4.addEventListener("click",hello1);

      btn4.addEventListener("click",hello2);

      function hello1(){

       alert("hello 1");

      }

      function hello2(){

       alert("hello 2");

      }

      7. 拖拽会用到哪些事件

      · dragstart:拖拽开始时在被拖拽元素上触发此事件,监听器需要设置拖拽所需数据,从操作系统拖拽文件到浏览器时不触发此事件.

      · dragenter:拖拽鼠标进入元素时在该元素上触发,用于给拖放元素设置视觉反馈,如高亮

      · dragover:拖拽时鼠标在目标元素上移动时触发.监听器通过阻止浏览器默认行为设置元素为可拖放元素.

      · dragleave:拖拽时鼠标移出目标元素时在目标元素上触发.此时监听器可以取消掉前面设置的视觉效果.

      · drag:拖拽期间在被拖拽元素上连续触发

      · drop:鼠标在拖放目标上释放时,在拖放目标上触发.此时监听器需要收集数据并且执行所需操作.如果是从操作系统拖放文件到浏览器,需要取消浏览器默认行为.

      · dragend:鼠标在拖放目标上释放时,在拖拽元素上触发.将元素从浏览器拖放到操作系统时不会触发此事件.

      8. 请列举jquery中的选择器:

      9. Javascript中的定时器有哪些?他们的区别及用法是什么?

      setTimeout 只执行一次
      setInterval 会一直重复执行

      9.请描述一下 cookies sessionStorage和localstorage区别

      相同点:都存储在客户端
      不同点:1.存储大小

      · cookie数据大小不能超过4k。

      · sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。

      2.有效时间

      · localStorage    存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;

      · sessionStorage  数据在当前浏览器窗口关闭后自动删除。

      · cookie          设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭

      3. 数据与服务器之间的交互方式

      · cookie的数据会自动的传递到服务器,服务器端也可以写cookie到客户端

      · sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。

      10.计算一个数组arr所有元素的和

      var arr1=[1,2,3,4,5,6,7,8,9];

      var sum1=0;

      for (var i=0;i<=arr1.length;i++) {

      if (typeof arr1[i]=="number") {

      sum1+=arr1[i];

      }

      }

      document.write(sum1);

      //====================================

      function sum2(arr){

      var all=0;

      for (var i=0;i<arr.length;i++) {

      if (typeof arr[i]=="number") {

      all+=arr[i];

      }

      }

      return all;

      }

      document.write(sum2([1,2,3,4]));

      11.编写一个方法去掉数组里面 重复的内容  var arr=[1,2,3,4,5,1,2,3]

      一个数组去重的简单实现

       

      var arr = ['abc','abcd','sss','2','d','t','2','ss','f','22','d'];

      //定义一个新的数组

      var s = [];

      //遍历数组

      for(var i = 0;i<arr.length;i++){

          if(s.indexOf(arr[i]) == -1){  //判断在s数组中是否存在,不存在则push到s数组中

              s.push(arr[i]);

          }

      }

      console.log(s);

      //输出结果:["abc", "abcd", "sss", "2", "d", "t", "ss", "f", "22"]

      方法二:用sort()  然后相邻比较也可以实现

      12.document.write和innerHTML的区别:

      document.write是直接写入到页面的内容流,如果在写之前没有调用document.open, 浏览器会自动调用open。每次写完关闭之后重新调用该函数,会导致页面被重写。

      innerHTML则是DOM页面元素的一个属性,代表该元素的html内容。你可以精确到某一个具体的元素来进行更改。如果想修改document的内容,则需要修改document.documentElement.innerElement。

      innerHTML将内容写入某个DOM节点,不会导致页面全部重绘

       

      innerHTML很多情况下都优于document.write,其原因在于其允许更精确的控制要刷新页面的那一个部分。

      13.ajax的步骤

      什么是ajax?

      ajax(异步javascript xml) 能够刷新局部网页数据而不是重新加载整个网页。

      如何使用ajax?

      第一步,创建xmlhttprequest对象,var xmlhttp =new XMLHttpRequest();XMLHttpRequest对象用来和服务器交换数据。

      var xhttp;

      if (window.XMLHttpRequest) {

      //现代主流浏览器

      xhttp = new XMLHttpRequest();

      } else {

      // 针对浏览器,比如IE5或IE6

      xhttp = new ActiveXObject("Microsoft.XMLHTTP");

      }

      第二步,使用xmlhttprequest对象的open()和send()方法发送资源请求给服务器。

      第三步,使用xmlhttprequest对象的responseText或responseXML属性获得服务器的响应。

      第四步,onreadystatechange函数,当发送请求到服务器,我们想要服务器响应执行一些功能就需要使用onreadystatechange函数,每次xmlhttprequest对象的readyState发生改变都会触发onreadystatechange函数

      14.xml和json的区别,请用四个词语来形容

      ·  JSON相对于XML来讲,数据的体积小,传递的速度更快些

      ·  JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互

      ·  XML对数据描述性比较好;

      ·  JSON的速度要远远快于XML

       

      15.清楚浮动的方法?(多次出现在面试题)

      1.父级div定义 height
      原理:父级div手动定义height,就解决了父级div无法自动获取到高度的问题。
      优点:简单、代码少、容易掌握

      缺点:只适合高度固定的布局,要给出精确的高度,如果高度和父级div不一样时,会产生问题

      2,结尾处加空div标签 clear:both

      原理:添加一个空div,利用css提高的clear:both清除浮动,让父级div能自动获取到高度
      优点:简单、代码少、浏览器支持好、不容易出现怪问题
      缺点:不少初学者不理解原理;如果页面浮动布局多,就要增加很多空div,让人感觉很不好
      3,父级div定义 伪类:after 和 zoom

      原理:IE8以上和非IE浏览器才支持:after,原理和方法2有点类似,zoom(IE转有属性)可解决ie6,ie7浮动问题
      优点:浏览器支持好、不容易出现怪问题(目前:大型网站都有使用,如:腾迅,网易,新浪等等)
      缺点:代码多、不少初学者不理解原理,要两句代码结合使用才能让主流浏览器都支持
      4,父级div定义 overflow:hidden

      原理:必须定义width或zoom:1,同时不能定义height,使用overflow:hidden时,浏览器会自动检查浮动区域的高度
      优点:简单、代码少、浏览器支持好
      缺点:不能和position配合使用,因为超出的尺寸的会被隐藏。

       

      16.box-sizing常用的属性有哪些?分别有什么作用?

      属性值

      · box-sizing:content-box

      · box-sizing:border-box

      · box-sizing:inherit

       

      content-box

      · 这是box-sizing的默认属性值

      · 是CSS2.1中规定的宽度高度的显示行为

      · 在CSS中定义的宽度和高度就对应到元素的内容框

      · 在CSS中定义的宽度和高度之外绘制元素的内边距和边框

       

      border-box

      · 在CSS中微元素设定的宽度和高度就决定了元素的边框盒

      · 即为元素在设置内边距和边框是在已经设定好的宽度和高度之内进行绘制

      · CSS中设定的宽度和高度减去边框和内间距才能得到元素内容所占的实际宽度和高度

      (Q1)box-sizing: content-box|border-box|inherit;
      (Q2)content-box:宽度和高度分别应用到元素的内容框。在宽度和高度之外绘制元素的内边距和边框(元素默认效果)。
      border-box:元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制。通过从已设定的宽度和高度分别减去边框和内边距才能得到内容的宽度和高度。

       

      17.css选择器有哪些,选择器的权重的优先级

      选择器类型

      1、ID  #id

      2、class  .class

      3、标签  p

      4、通用  *

      5、属性  [type="text"]

      6、伪类  :hover

      7、伪元素  ::first-line

      8、子选择器、相邻选择器

      三、权重计算规则

      1. 第一等:代表内联样式,如: style=””,权值为1000。

      2. 第二等:代表ID选择器,如:#content,权值为0100。

      3. 第三等:代表类,伪类和属性选择器,如.content,权值为0010。

      4. 第四等:代表类型选择器和伪元素选择器,如div p,权值为0001。

      5. 通配符、子选择器、相邻选择器等的。如*、>、+,权值为0000。

      6. 继承的样式没有权值。

      18. 块级元素水平垂直居中的方法有哪些(三个方法)

      让div等块级元素水平和垂直都居中,即永远处于屏幕的正中央,当我们做如登录块时非常有用!

       实现一、原理:要让div等块级元素水平和垂直居中,必需知道该div等块级元素的宽度和高度,然后设置位置为绝对位置,距离页面窗口左边框和上边框的距离设置为50%,这个50%就是指页面窗口的宽度和高度的50%,最后将该div等块级元素分别左移和上移,左移和上移的大小就是该div等块级元素宽度和高度的一半。

         CSS代码:

      .mycss{ 

         width:300px;  

         height:200px;  

         position:absolute;  

         left:50%;  

         top:50%;  

         margin:-100px 0 0 -150px }

       实现二原理:利用CSS的margin设置为auto让浏览器自己帮我们水平和垂直居中。

         CSS代码:

      .mycss{

          position: absolute;

          left: 0px;

          right: 0;

          top: 0;

          bottom: 0;

          margin: auto;

          height: 200px;

          width: 300px;

      }

      jQuery实现水平和垂直居中

       原理:jQuery实现水平和垂直居中的原理就是通过jQuery设置div等块级元素的CSS,获取div等块级元素的左、上的边距偏移量,边距偏移量的算法就是用页面窗口 的宽度减去该div等块级元素的宽度,得到的值再除以2即左偏移量,右偏移量算法相同。注意div等块级元素的CSS设置要在resize()方法中完成,就是每次改变窗口大 小时,都要执行设置div等块级元素的CSS。

      jquery代码:

      $(window).resize(function(){

          $(".myblock").css({

              position: "absolute",

              left: ($(window).width() - $(".myblock").outerWidth())/2,

              top: ($(window).height() - $(".myblock").outerHeight())/2     });        

      });

      此外在页面载入时,就需要调用resize()方法

      $(function(){

          $(window).resize();

      });

       

      19.三个盒子,左右定宽,中间自适应有几种方法

      第一种:左右侧采用浮动 中间采用margin-left 和 margin-right 方法。

      代码如下:

      <div style="width:100%; margin:0 auto;"> 

       

             <div style="width:200px; float:right; background-color:#960">这是右侧的内容 固定宽度</div>

       

             <div style="width:150px; float:left; background:#6FF">这是左侧的内容 固定宽度</div>

       

             <div style="margin-left:150px;margin-right:200px; background-color:#9F3">中间内容,自适应宽度</div>

       

          </div>

      第二种:左右两侧采用绝对定位 中间同样采用margin-left margin-right方法:

       

      第三种负的margin

      使用这种方法就稍微复杂了一些了,使用的是负的margin值,而且html标签也增加了,先来看其代码吧:

      <div id="main">

       <div id="mainContainer">main content</div></div><div id="left">

       <div id="leftContainer" class="inner">left content</div></div><div id="right">

       <div id="rightContainer" class="inner">right</div></div>

      #main {

       float: left;

       width: 100%;

      }

      #mainContainer {

       margin: 0 230px;

       height: 200px;

       background: green;

      }

      #left {

       float: left;

       margin-left: -100%;

       width: 230px} 

      #right {

       float: left;

       margin-left: -230px;

       width: 230px;

      } 

      #left .inner,

      #right .inner {

       background: orange;

       margin: 0 10px;

       height: 200px;

      }

      20.js有几种数据类型,其中基本数据类型有哪些

      五种基本类型: Undefined、Null、Boolean、Number和String。

      1中复杂的数据类型————Object,Object本质上是由一组无序的名值对组成的。

      Object、Array和Function则属于引用类型

       

      21.undefined 和 null 区别

       

      null: Null类型,代表“空值”,代表一个空对象指针,使用typeof运算得到 “object”,所以你可以认为它是一个特殊的对象值。

      undefined: Undefined类型,当一个声明了一个变量未初始化时,得到的就是undefined。

      null是javascript的关键字,可以认为是对象类型,它是一个空对象指针,和其它语言一样都是代表“空值”,不过 undefined 却是javascript才有的。undefined是在ECMAScript第三版引入的,为了区分空指针对象和未初始化的变量,它是一个预定义的全局变量。没有返回值的函数返回为undefined,没有实参的形参也是undefined。

       

      javaScript权威指南: null 和 undefined 都表示“值的空缺”,你可以认为undefined是表示系统级的、出乎意料的或类似错误的值的空缺,而null是表示程序级的、正常的或在意料之中的值的空缺。

      22.http 和 https 有何区别?如何灵活使用?

       

      http是HTTP协议运行在TCP之上。所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。

      https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份


      23.常见的HTTP状态码

      2开头 (请求成功)表示成功处理了请求的状态代码。

      200   (成功)  服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 
      201   (已创建)  请求成功并且服务器创建了新的资源。 
      202   (已接受)  服务器已接受请求,但尚未处理。 
      203   (非授权信息)  服务器已成功处理了请求,但返回的信息可能来自另一来源。 
      204   (无内容)  服务器成功处理了请求,但没有返回任何内容。 
      205   (重置内容) 服务器成功处理了请求,但没有返回任何内容。
      206   (部分内容)  服务器成功处理了部分 GET 请求。

      3开头 (请求被重定向)表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。

      300   (多种选择)  针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。 
      301   (永久移动)  请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
      302   (临时移动)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
      303   (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
      304   (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 
      305   (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。 
      307   (临时重定向)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

      4开头 (请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。

      400   (错误请求) 服务器不理解请求的语法。 
      401   (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。 
      403   (禁止) 服务器拒绝请求。
      404   (未找到) 服务器找不到请求的网页。
      405   (方法禁用) 禁用请求中指定的方法。 
      406   (不接受) 无法使用请求的内容特性响应请求的网页。 
      407   (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
      408   (请求超时)  服务器等候请求时发生超时。 
      409   (冲突)  服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。 
      410   (已删除)  如果请求的资源已永久删除,服务器就会返回此响应。 
      411   (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。 
      412   (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。 
      413   (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 
      414   (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。 
      415   (不支持的媒体类型) 请求的格式不受请求页面的支持。 
      416   (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。 
      417   (未满足期望值) 服务器未满足"期望"请求标头字段的要求。

      5开头(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。

      500   (服务器内部错误)  服务器遇到错误,无法完成请求。 
      501   (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 
      502   (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 
      503   (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 
      504   (网关超时)  服务器作为网关或代理,但是没有及时从上游服务器收到请求。 
      505   (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

       

       

      24. 如何进行网站性能优化

      1. 从用户角度而言,优化能够让页面加载得更快、对用户的操作响应得更及时,能够给用户提供更为友好的体验。
      2. 从服务商角度而言,优化能够减少页面请求数、或者减小请求所占带宽,能够节省可观的资源。
        总之,恰当的优化不仅能够改善站点的用户体验并且能够节省相当的资源利用。
        前端优化的途径有很多,按粒度大致可以分为两类,第一类是页面级别的优化,例如 HTTP请求数、脚本的无阻塞加载、内联脚本的位置优化等 ;第二类则是代码级别的优化,例如 Javascript中的DOM 操作优化、CSS选择符优化、图片优化以及 HTML结构优化等等。另外,本着提高投入产出比的目的,后文提到的各种优化策略大致按照投入产出比从大到小的顺序排列。
        一、页面级优化
      1. JavaScript 压缩和模块打包
      2. 按需加载资源
      3. 在使用 DOM 操作库时用上 array-ids
      4. 缓存
      5. 启用 HTTP/2
      6. 应用性能分析
      7. 使用负载均衡方案
      8. 为了更快的启动时间考虑一下同构
      9. 使用索引加速数据库查询
      10. 使用更快的转译方案
      11. 避免或最小化 JavaScript 和 CSS 的使用而阻塞渲染
      12. 用于未来的一个建议:使用 service workers + 流
      13. 图片编码优化

      25. react和vue有哪些不同,说说你对这两个框架的看法

      相同点

      · 都支持服务器端渲染

      · 都有Virtual DOM,组件化开发,通过props参数进行父子组件数据的传递,都实现webComponent规范

      · 数据驱动视图

      · 都有支持native的方案,React的React native,Vue的weex

      不同点

      · React严格上只针对MVC的view层,Vue则是MVVM模式

      · virtual DOM不一样,vue会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树.而对于React而言,每当应用的状态被改变时,全部组件都会重新渲染,所以react中会需要shouldComponentUpdate这个生命周期函数方法来进行控制

      · 组件写法不一样, React推荐的做法是 JSX + inline style, 也就是把HTML和CSS全都写进JavaScript了,即'all in js'; Vue推荐的做法是webpack+vue-loader的单文件组件格式,即html,css,jd写在同一个文件;

      · 数据绑定: vue实现了数据的双向绑定,react数据流动是单向的

      · state对象在react应用中不可变的,需要使用setState方法更新状态;在vue中,state对象不是必须的,数据由data属性在vue对象中管理

      26.什么是mvvm mvc是什么区别 原理

      一、MVC(Model-View-Controller)

      MVC是比较直观的架构模式,用户操作->View(负责接收用户的输入操作)->Controller(业务逻辑处理)->Model(数据持久化)->View(将结果反馈给View)。

      MVC使用非常广泛,比如JavaEE中的SSH框架

       

      三、MVVM(Model-View-ViewModel)

      如果说MVP是对MVC的进一步改进,那么MVVM则是思想的完全变革。它是将“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,通过ViewModel进行交互,而且Model和ViewModel之间的交互是双向的,因此视图的数据的变化会同时修改数据源,而数据源数据的变化也会立即反应view

      27.px和em的区别

      px表示像素 (计算机屏幕上的一个点:1px = 1/96in),是绝对单位,不会因为其他元素的尺寸变化而变化;

      · 

      · 

      em表示相对于父元素的字体大小。em是相对单位 ,没有一个固定的度量值,而是由其他元素尺寸来决定的相对值。

      28.优雅降级和渐进增强

      渐进增强(Progressive Enhancement):一开始就针对低版本浏览器进行构建页面,完成基本的功能,然后再针对高级浏览器进行效果、交互、追加功能达到更好的体验。

      优雅降级(Graceful Degradation):一开始就构建站点的完整功能,然后针对浏览器测试和修复。比如一开始使用 CSS3 的特性构建了一个应用,然后逐步针对各大浏览器进行 hack 使其可以在低版本浏览器上正常浏览。

      其实渐进增强和优雅降级并非什么新概念,只是旧的概念换了一个新的说法。在传统软件开发中,经常会提到向上兼容向下兼容的概念。渐进增强相当于向上兼容,而优雅降级相当于向下兼容

      29.eval()的作用

      把字符串参数解析成JS代码并运行,并返回执行的结果;

      eval("2+3");//执行加运算,并返回运算值。  

      eval("varage=10");//声明一个age变量  

      eval的作用域

      functiona(){  

      1.  eval("var x=1"); //等效于 var x=1;  

      2.  console.log(x); //输出1  

      3. }  

      4. a();  

      5. console.log(x);//错误 x没有定

      30. JS哪些操作会造成内存泄露

      1)意外的全局变量引起的内存泄露

      function leak(){  

        leak="xxx";//leak成为一个全局变量,不会被回收  

      }

      2)闭包引起的内存泄露

      3)3)没有清理的DOM元素引用

      4)被遗忘的定时器或者回调 5)子元素存在引起的内存泄露

      31. 浏览器缓存有哪些,通常缓存有哪几种

      一、http缓存

      二、websql

      cookie

      localstorage

      sessionstorage

      flash缓存

      32:bootstrap响应式实现的原理

      百分比布局+媒体查询

      33.关于JS事件冒泡与JS事件代理(事件委托)

       事件作为DOM操作重要的一环,需要大家好好理解和运用,今天特意看了一下事件冒泡和事件代理的相关资料,感触颇深,也深感自己的无知不知道多浪费了多少内存,废话不多说进入正题:

      1.事件冒泡:

            通俗易懂的来讲,就是当一个子元素的事件被触发的时候(如onclick事件),该事件会从事件源(被点击的子元素)开始逐级向上传播,触发父级元素的点击事件。

      2.事件委托

          事件委托,首先按字面的意思就能看你出来,是将事件交由别人来执行,再联想到上面讲的事件冒泡,是不是想到了?对,就是将子元素的事件通过冒泡的形式交由父元素来执行。下面经过详细的例子来说明事件委托:

      有可能在开发的时候会遇到这种情况:如导航每一个栏目都要加一个事件,你可能会通过遍历来给每个栏目添加事件:

      事件委托是怎

      1. var ul = document.getElementById('parentUl');  

      2.     ul.οnclick=function (event) {  

      3.       var e = event||window.event,  

      4.               source = e.target || e.srcElement;//target表示在事件冒泡中触发事件的源元素,在IE中是srcElement  

      5.         if(source.nodeName.toLowerCase() == "li"){   //判断只有li触发的才会输出内容  

      6.             alert(source.innerHTML);  

      7.         }  

      8.         stopPropagation(e);                           //阻止继续冒泡  

      9.     };  

      10.     function addElement() {  

      11.         var li = document.createElement('li');  

      12.         li.innerHTML="我是新孩子";  

      13.         ul.appendChild(li);  

      14.     }  

      34. CSS样式覆盖规则

      规则一:由于继承而发生样式冲突时,最近祖先获胜。

      规则二:继承的样式和直接指定的样式冲突时,直接指定的样式获胜

      规则三:直接指定的样式发生冲突时,样式权值高者获胜。

      样式的权值取决于样式的选择器,权值定义如下表。

      CSS选择器

      权值

      标签选择器

      1

      类选择器

      10

      ID选择器

      100

      内联样式

      1000

      伪元素(:first-child等)

      1

      伪类(:link等)

      10

      可以看到,内联样式的权值>>ID选择器>>类选择器>>标签选择器,除此以外,后代选择器的权值为每项权值之和,比如”#nav .current a”的权值为100 + 10 + 1 = 111。

      规则四:样式权值相同时,后者获胜。

      规则五:!important的样式属性不被覆盖。

      !important可以看做是万不得已的时候,打破上述四个规则的”金手指”。如果你一定要采用某个样式属性,而不让它被覆盖的,可以在属性值后加上!important,以规则四的例子为例,”.byline a {color:red !important;}”可以强行使链接显示红色。大多数情况下都可以通过其他方式来控制样式的覆盖,不能滥用!important。

      35. 介绍一下box-sizing属性

      兼容问题 
      首先,box-sizing属性在FireFox中存在兼容问题,所以需要使用-moz-box-sizing做一下兼容。

       

      属性值

      · box-sizing:content-box

      · box-sizing:border-box

      · box-sizing:inherit

       

      content-box

      · 这是box-sizing的默认属性值

      · 是CSS2.1中规定的宽度高度的显示行为

      · 在CSS中定义的宽度和高度就对应到元素的内容框

      · 在CSS中定义的宽度和高度之外绘制元素的内边距和边框

       

      border-box

      · 在CSS中微元素设定的宽度和高度就决定了元素的边框盒

      · 即为元素在设置内边距和边框是在已经设定好的宽度和高度之内进行绘制

      · CSS中设定的宽度和高度减去边框和内间距才能得到元素内容所占的实际宽度和高度

      36. css选择符有哪些?优先级算法如何计算?(常见)

      37. 请简要描述margin重合问题,及解决方式

      1.同向margin的重叠:
      1图片的margin-top与3图片的margin-top发生重叠,2图片的margin-bottom与3图片的margin-bottom发生重叠。这时候重叠之后的margin值由发生重叠两片的最大值决定;如果其中一个出现负值,则由最大的正边距减去绝对值最大的负边距,如果没有最大正边距,则由0减去绝对值最大的负边距。
      解决同向重叠的方法:
      (1)在最外层的div中加入overflow:hidden;zoom:1
      (2)在最外层加入padding:1px;属性
      (3)在最外层加入:border:1px solid #cacbcc;
      2.异向重叠问题:
      1图片的margin-bottom与2图片的margin-top发生重叠,这时候重叠之后的margin值由发生重叠两图片的最大值的决定的。
      解决异向重叠问题:
      float:left(只能解决IE6浏览器中的异向重叠问题,可以解决IE8以上、chorme、firefox、opera下的同向重叠问题)

       

      38:position的值,relative\absolute\fixed分别相对于进行谁定位,有什么区别,什么时候用?

      39.解释下CSS sprites,以及你要如何在页面或网站中使用它。

      CSS Sprites其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS的“background-image”,“background-repeat”,“background-position”的组合进行背景定位,background-position可以用数字能精确的定位出背景图片的位置

       

      40.什么是闭包,如何使用它,为什么要使用它?

      包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。

      所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

      使用闭包的注意点:

      · 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

      · 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

       

      41.请解释JSONP的工作原理,以及它为什么不是真正的AJAX。

      JSONP (JSON with Padding)是一个简单高效的跨域方式,HTML中的script标签可以加载并执行其他域的javascript,于是我们可以通过script标记来动态加载其他域的资源。例如我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的形式声明pageA需要的数据,然后在 pageA中用script标签把pageB加载进来,那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数,pageB加载完之后会执行pageA中定义的函数,所需要的数据会以参数的形式传递给该函数。JSONP易于实现,但是也会存在一些安全隐患,如果第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。

      AJAX是不跨域的,而JSONP是一个是跨域的,还有就是二者接收参数形式不一样!

      42.请解释一下JavaScript的同源策略。

      在客户端编程语言中,如javascript和 ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域,什么叫不同的域呢?当两个域具有相同的协议, 相同的端口,相同的host,那么我们就可以认为它们是相同的域。同源策略还应该对一些特殊情况做处理,比如限制file协议下脚本的访问权限。本地的HTML文件在浏览器中是通过file协议打开的,如果脚本能通过file协议访问到硬盘上其它任意文件,就会出现安全隐患,目前IE8还有这样的隐患。

      43.怎样添加、移除、移动、复制、创建和查找节点?

       1)创建新节点

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

      2)添加、移除、替换、插入
      appendChild() //添加
      removeChild() //移除
      replaceChild() //替换
      insertBefore() //插入

      3)查找
      getElementsByTagName() //通过标签名称
      getElementsByName() //通过元素的Name属性的值
      getElementById() //通过元素Id,唯一性

      44.谈谈垃圾回收机制方式及内存管理

      回收机制方式

      1、定义和用法:垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程中使用的内存。

      2、原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。

      3、实例如下:

      function fn1() {

          var obj = {name: 'hanzichi', age: 10};

      }

      function fn2() {

          var obj = {name:'hanzichi', age: 10};

         return obj;

      }var a = fn1();var b = fn2();

      fn1中定义的obj为局部变量,而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程中,返回的对象被全局变量b所指向,所以该块内存并不会被释放。

       4、垃圾回收策略:标记清除(较为常用)和引用计数。

      标记清除:

        定义和用法:当变量进入环境时,将变量标记"进入环境",当变量离开环境时,标记为:"离开环境"。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量,剩下的就是被视为准备回收的变量。

        到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。

      引用计数:

        定义和用法:引用计数是跟踪记录每个值被引用的次数。

        基本原理:就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。

      45、jQuery的事件委托方法bind 、live、delegate、on之间有什么区别?

      (1)、bind 【jQuery 1.3之前】

      定义和用法:主要用于给选择到的元素上绑定特定事件类型的监听函数;

      语法:bind(type,[data],function(eventObject));

      特点:

      (1)、适用于页面元素静态绑定。只能给调用它的时候已经存在的元素绑定事件,不能给未来新增的元素绑定事件。

      (2)、当页面加载完的时候,你才可以进行bind(),所以可能产生效率问题。

      实例如下:$( "#members li a" ).bind( "click", function( e ) {} );

      (2)、live 【jQuery 1.3之后】

      定义和用法:主要用于给选择到的元素上绑定特定事件类型的监听函数;

      语法:live(type, [data], fn);

      特点:

      (1)、live方法并没有将监听器绑定到自己(this)身上,而是绑定到了this.context上了。

      (2)、live正是利用了事件委托机制来完成事件的监听处理,把节点的处理委托给了document,新添加的元素不必再绑定一次监听器。

      (3)、使用live()方法但却只能放在直接选择的元素后面,不能在层级比较深,连缀的DOM遍历方法后面使用,即$(“ul”").live...可以,但$("body").find("ul").live...不行; 

      实例如下:$( document ).on( "click", "#members li a", function( e ) {} );

      (3)、delegate 【jQuery 1.4.2中引入】

      定义和用法:将监听事件绑定在就近的父级元素上

      语法:delegate(selector,type,[data],fn)

      特点:

      (1)、选择就近的父级元素,因为事件可以更快的冒泡上去,能够在第一时间进行处理。

      (2)、更精确的小范围使用事件代理,性能优于.live()。可以用在动态添加的元素上。

      实例如下:

      $("#info_table").delegate("td","click",function(){/*显示更多信息*/});

      $("table").find("#info").delegate("td","click",function(){/*显示更多信息*/});

      (4)、on 【1.7版本整合了之前的三种方式的新事件绑定机制】

      定义和用法:将监听事件绑定到指定元素上。

      语法:on(type,[selector],[data],fn)

      实例如下:$("#info_table").on("click","td",function(){/*显示更多信息*/});参数的位置写法与delegate不一样。

      说明:on方法是当前JQuery推荐使用的事件绑定方法,附加只运行一次就删除函数的方法是one()。

       总结:.bind(), .live(), .delegate(),.on()分别对应的相反事件为:.unbind(),.die(), .undelegate(),.off()

      46、px和em的区别

      相同点:px和em都是长度单位;

      异同点:px的值是固定的,指定是多少就是多少,计算比较容易。em得值不是固定的,并且em会继承父级元素的字体大小。
      浏览器的默认字体高都是16px。所以未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。

      47、浏览器的内核分别是什么?

      IE: trident内核

      Firefox:gecko内核

      Safari:webkit内核

      Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核

      Chrome:Blink(基于webkit,Google与Opera Software共同开发)

      48、什么叫优雅降级和渐进增强?

      渐进增强 progressive enhancement:
      针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。

      优雅降级 graceful degradation:
      一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

      区别:

      a. 优雅降级是从复杂的现状开始,并试图减少用户体验的供给

      b. 渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要

      c. 降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带

      49、sessionStorage 、localStorage 和 cookie 之间的区别

       共同点:用于浏览器端存储的缓存数据

      不同点:

      (1)、存储内容是否发送到服务器端:当设置了Cookie后,数据会发送到服务器端,造成一定的宽带浪费;

              web storage,会将数据保存到本地,不会造成宽带浪费;

      (2)、数据存储大小不同:Cookie数据不能超过4K,适用于会话标识;web storage数据存储可以达到5M;

      (3)、数据存储的有效期限不同:cookie只在设置了Cookid过期时间之前一直有效,即使关闭窗口或者浏览器;

              sessionStorage,仅在关闭浏览器之前有效;localStorage,数据存储永久有效;

      (4)、作用域不同:cookie和localStorage是在同源同窗口中都是共享的;sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;

      50、浏览器是如何渲染页面的?

      渲染的流程如下:

      1.解析HTML文件,创建DOM树。

         自上而下,遇到任何样式(link、style)与脚本(script)都会阻塞(外部样式不阻塞后续外部脚本的加载)。

      2.解析CSS。优先级:浏览器默认设置<用户设置<外部样式<内联样式<HTML中的style样式;

      3.将CSS与DOM合并,构建渲染树(Render Tree)

      4.布局和绘制,重绘(repaint)和重排(reflow)

      51:js的基本数据类型

      JavaScript中有五种基本数据类型,它们分别是:undefined,null,boolean,number,string。

      还有一种复杂数据类型-object。 

      52:事件委托

      事件委托就是利用的DOM事件的事件捕获阶段。把具体dom上发生的事件,委托给更大范围的dom去处理。好比送信员,如果每次都把信件送给每一户,非常繁琐。但是如果交给一个大范围的管理者,比如小区的传达室,那么事情会变得非常简单。事件委托就类似这种原理,我页面中有很多按钮,如果不使用事件委托,我只能在每个按钮上注册事件。非常麻烦。但如果我把事件注册在一个大范围的div(假设所有的按钮都在这个div中),那么我只要注册一次事件,就可以处理所有按钮(只要按钮包含在上述div中)事件的响应了

      53:CSS3新增了很多的属性,下面一起来分析一下新增的一些属性:

      1.CSS3边框:

      · border-radius:CSS3圆角边框。在 CSS2 中添加圆角矩形需要技巧,我们必须为每个圆角使用不同的图片,在 CSS3 中,创建圆角是非常容易的,在 CSS3 中,border-radius 属性用于创建圆角。border:2px solid;

      · box-shadow:CSS3边框阴影。在 CSS3 中,box-shadow 用于向方框添加阴影。box-shadow:10px 10px 5px #888888;

      · border-image:CSS3边框图片。通过 CSS3 的 border-image 属性,您可以使用图片来创建边框。border-image:url(border.png) 30 30 round;

      2.CSS3背景:

      · background-size: 属性规定背景图片的尺寸。在 CSS3 之前,背景图片的尺寸是由图片的实际尺寸决定的。在 CSS3 中,可以规定背景图片的尺寸,这就允许我们在不同的环境中重复使用背景图片。您能够以像素或百分比规定尺寸。如果以百分比规定尺寸,那么尺寸相对于父元素的宽度和高度。

      · background-origin :属性规定背景图片的定位区域。背景图片可以放置于 content-box、padding-box 或 border-box 区域。

      3.CSS3文字效果:

      · text-shadow:在 CSS3 中,text-shadow 可向文本应用阴影。text-shadow:5px 5px 5px #FFFFFF;

      · word-wrap :单词太长的话就可能无法超出某个区域,允许对长单词进行拆分,并换行到下一行:p{word-wrap:break-word;}

      4.CSS3 2D转换:

      transform:通过 CSS3 转换,我们能够对元素进行移动、缩放、转动、拉长或拉伸。

      · translate():元素从其当前位置移动,根据给定的 left(x 坐标) 和 top(y 坐标) 位置参数:transform:translate(50px,100px);值 translate(50px,100px) 把元素从左侧移动 50 像素,从顶端移动 100 像素。

      · rotate():元素顺时针旋转给定的角度。允许负值,元素将逆时针旋转。transform:rotate(30deg);值 rotate(30deg) 把元素顺时针旋转 30 度。

      · scale():元素的尺寸会增加或减少,根据给定的宽度(X 轴)和高度(Y 轴)参数:transform:scale(2,4);值 scale(2,4) 把宽度转换为原始尺寸的 2 倍,把高度转换为原始高x() 5.CSS3 3D转换:

      · rotateX():元素围绕其 X 轴以给定的度数进行旋转。transform:rotateX(120deg);

      · rotateY():元素围绕其 Y 轴以给定的度数进行旋转。transform:rotateY(120deg);

      6.CSS3 过渡:当元素从一种样式变换为另一种样式时为元素添加效果。

      7.CSS3动画:通过 CSS3,我们能够创建动画,这可以在许多网页中取代动画图片、Flash 动画以及 JavaScript。

      8.CSS3多列:

      · column-count:属性规定元素应该被分隔的列数。

      · column-gap:属性规定列之间的间隔。

      · column-rule :属性设置列之间的宽度、样式和颜色规则。

      9.CSS3用户界面:

      · resize:属性规定是否可由用户调整元素尺寸。

      · box-sizing:属性允许您以确切的方式定义适应某个区域的具体内容。

      · outline-offset :属性对轮廓进行偏移,并在超出边框边缘的位置绘制轮廓。

      54:从输入url到显示页面,都经历了什么

      第一步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器。

      第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。

      第三步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
      第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
      第五步:重复第四步,直到找到正确的纪录

      2种解释:

      一般会经历以下几个过程:

      1、首先,在浏览器地址栏中输入url

      2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。

      3、在发送http请求前,需要域名解析(DNS解析)(DNS(域名系统,Domain Name System)是互联网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住IP地址。),解析获取相应的IP地址。

      4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手(TCP即传输控制协议。TCP连接是互联网连接协议集的一种。)

      5、握手成功后,浏览器向服务器发送http请求,请求数据包

      6、服务器处理收到的请求,将数据返回至浏览器

      7、浏览器收到HTTP响应

      8、读取页面内容,浏览器渲染,解析html源码

      9、生成Dom树、解析css样式、js交互

      10、客户端和服务器交互

      11、ajax查询

      55:对<meta></meta>标签有什么理解

      什么是meta标签?

      引自下W3school的定义说明一下。

      元数据(metadata)是关于数据的信息。

      标签提供关于 HTML 文档的元数据。元数据不会显示在页面上,但是对于机器是可读的。

      典型的情况是,meta 元素被用于规定页面的描述、关键词、文档的作者、最后修改时间以及其他元数据。

      标签始终位于 head 元素中。

      元数据可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 web 服务。

      其实对上面的概念简单总结下就是:<meta> 标签提供关于 HTML 文档的元数据。它不会显示在页面上,但是对于机器是可读的。可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 web 服务。

      meta的作用

      meta里的数据是供机器解读的,告诉机器该如何解析这个页面,还有一个用途是可以添加服务器发送到浏览器的http头部内容

      56:new操作符到底到了什么

      先看代码

      [javascript] view plain copy

      1. var Func=function(){  

      2. };  

      3. var func=new Func ();  

      new共经过了4几个阶段

      1、创建一个空对象

      [javascript] view plain copy

      1. varobj=new Object();  

      2、设置原型链

      [javascript] view plain copy

      1. obj.__proto__= Func.prototype;  

      3、让Func中的this指向obj,并执行Func的函数体。

      [javascript] view plain copy

      1. var result =Func.call(obj);  

      4、判断Func的返回值类型:

      如果是值类型,返回obj。如果是引用类型,就返回这个引用类型的对象。

      [javascript] view plain copy

      1. if (typeof(result) == "object"){  

      2.   func=result;  

      3. }  

      4. else{  

      5.     func=obj;;  

      6. }  

      57:h5新特性

      HTML5新特性 —— 新特性
      (1)新的语义标签和属性
      (2)表单新特性
      (3)视频和音频
      (4)Canvas绘图
      (5)SVG绘图
      (6)地理定位
      (7)拖放API
      58:vue的生命周期

       

       

      58:请写出你对闭包的理解,并列出简单的理解

      使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。

      闭包有三个特性:

      1.函数嵌套函数 

      2.函数内部可以引用外部的参数和变量 

      3.参数和变量不会被垃圾回收机制回收

       

      59:display none visibility hidden区别?

      1.display:none是彻底消失,不在文档流中占位,浏览器也不会解析该元素;visibility:hidden是视觉上消失了,可以理解为透明度为0的效果,在文档流中占位,浏览器会解析该元素;

      2.使用visibility:hidden比display:none性能上要好,display:none切换显示时visibility,页面产生回流(当页面中的一部分元素需要改变规模尺寸、布局、显示隐藏等,页面重新构建,此时就是回流。所有页面第一次加载时需要产生一次回流),而visibility切换是否显示时则不会引起回流。

      60:JavaScript中如何检测一个变量是一个String类型?请写出函数实现

      typeof(obj) === "string"

      typeof obj === "string"

      obj.constructor === String

      61:如何理解闭包?

      1、定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。

      2、表现形式:使函数外部能够调用函数内部定义的变量。

      3、实例如下:

      (1)、根据作用域链的规则,底层作用域没有声明的变量,会向上一级找,找到就返回,没找到就一直找,直到window的变量,没有就返回undefined。这里明显count 是函数内部的flag2 的那个count 。

      var count=10;   //全局作用域 标记为flag1function add(){

          var count=0;    //函数全局作用域 标记为flag2

          return function(){

              count+=1;   //函数的内部作用域        alert(count);

          }

      }var s = add()

      s();//输出1

      s();//输出2

      4、变量的作用域

      要理解闭包,首先必须理解Javascript特殊的变量作用域。

      变量的作用域分类:全局变量和局部变量。

      特点:

      1、函数内部可以读取函数外部的全局变量;在函数外部无法读取函数内的局部变量。

      2、函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

       5、使用闭包的注意点

      1)滥用闭包,会造成内存泄漏:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

      2)会改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

      62:谈谈垃圾回收机制方式及内存管理

      回收机制方式

      1、定义和用法:垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程中使用的内存。

      2、原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。

      3、实例如下:

      function fn1() {

          var obj = {name: 'hanzichi', age: 10};

      }

      function fn2() {

          var obj = {name:'hanzichi', age: 10};

         return obj;

      }var a = fn1();var b = fn2();

      fn1中定义的obj为局部变量,而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程中,返回的对象被全局变量b所指向,所以该块内存并不会被释放。

       4、垃圾回收策略:标记清除(较为常用)和引用计数。

      标记清除:

        定义和用法:当变量进入环境时,将变量标记"进入环境",当变量离开环境时,标记为:"离开环境"。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量,剩下的就是被视为准备回收的变量。

        到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。

      引用计数:

        定义和用法:引用计数是跟踪记录每个值被引用的次数。

        基本原理:就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。

      63:判断一个字符串中出现次数最多的字符,统计这个次数

      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;

          }

      }        console.log('出现次数最多的是:'+iIndex+'出现'+iMax+'次');

      64、$(document).ready()方法和window.onload有什么区别?

       (1)、window.onload方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行的。

       (2)、$(document).ready() 方法可以在DOM载入就绪时就对其进行操纵,并调用执行绑定的函数。

      65、 jquery中$.get()提交和$.post()提交有区别吗?

      相同点:都是异步请求的方式来获取服务端的数据;

      异同点:

      1、请求方式不同:$.get() 方法使用GET方法来进行异步请求的。$.post() 方法使用POST方法来进行异步请求的。

      2、参数传递方式不同:get请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给Web服务器的,这种传递是对用户不可见的。

      3、数据传输大小不同:get方式传输的数据大小不能超过2KB 而POST要大的多

      4、安全问题: GET 方式请求的数据会被浏览器缓存起来,因此有安全问题。

      66、jQuery的事件委托方法bind 、live、delegate、on之间有什么区别?(常见)

      (1)、bind 【jQuery 1.3之前】

      定义和用法:主要用于给选择到的元素上绑定特定事件类型的监听函数;

      语法:bind(type,[data],function(eventObject));

      特点:

      (1)、适用于页面元素静态绑定。只能给调用它的时候已经存在的元素绑定事件,不能给未来新增的元素绑定事件。

      (2)、当页面加载完的时候,你才可以进行bind(),所以可能产生效率问题。

      实例如下:$( "#members li a" ).bind( "click", function( e ) {} );

      (2)、live 【jQuery 1.3之后】

      定义和用法:主要用于给选择到的元素上绑定特定事件类型的监听函数;

      语法:live(type, [data], fn);

      特点:

      (1)、live方法并没有将监听器绑定到自己(this)身上,而是绑定到了this.context上了。

      (2)、live正是利用了事件委托机制来完成事件的监听处理,把节点的处理委托给了document,新添加的元素不必再绑定一次监听器。

      (3)、使用live()方法但却只能放在直接选择的元素后面,不能在层级比较深,连缀的DOM遍历方法后面使用,即$(“ul”").live...可以,但$("body").find("ul").live...不行; 

      实例如下:$( document ).on( "click", "#members li a", function( e ) {} );

      (3)、delegate 【jQuery 1.4.2中引入】

      定义和用法:将监听事件绑定在就近的父级元素上

      语法:delegate(selector,type,[data],fn)

      特点:

      (1)、选择就近的父级元素,因为事件可以更快的冒泡上去,能够在第一时间进行处理。

      (2)、更精确的小范围使用事件代理,性能优于.live()。可以用在动态添加的元素上。

      实例如下:

      $("#info_table").delegate("td","click",function(){/*显示更多信息*/});

      $("table").find("#info").delegate("td","click",function(){/*显示更多信息*/});

      (4)、on 【1.7版本整合了之前的三种方式的新事件绑定机制】

      定义和用法:将监听事件绑定到指定元素上。

      语法:on(type,[selector],[data],fn)

      实例如下:$("#info_table").on("click","td",function(){/*显示更多信息*/});参数的位置写法与delegate不一样。

      说明:on方法是当前JQuery推荐使用的事件绑定方法,附加只运行一次就删除函数的方法是one()。

       总结:.bind(), .live(), .delegate(),.on()分别对应的相反事件为:.unbind(),.die(), .undelegate(),.off()

      67、px和em的区别(常见)

       

      相同点:px和em都是长度单位;

      异同点:px的值是固定的,指定是多少就是多少,计算比较容易。em得值不是固定的,并且em会继承父级元素的字体大小。
      浏览器的默认字体高都是16px。所以未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。

      68、浏览器的内核分别是什么?

      IE: trident内核

      Firefox:gecko内核

      Safari:webkit内核

      Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核

      Chrome:Blink(基于webkit,Google与Opera Software共同开发)

      69、什么叫优雅降级和渐进增强?(常见)

      渐进增强 progressive enhancement:
      针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。

      优雅降级 graceful degradation:
      一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

      区别:

      a. 优雅降级是从复杂的现状开始,并试图减少用户体验的供给

      b. 渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要

      c. 降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带

      70、sessionStorage 、localStorage 和 cookie 之间的区别(常见)

       共同点:用于浏览器端存储的缓存数据

      不同点:

      (1)、存储内容是否发送到服务器端:当设置了Cookie后,数据会发送到服务器端,造成一定的宽带浪费;

              web storage,会将数据保存到本地,不会造成宽带浪费;

      (2)、数据存储大小不同:Cookie数据不能超过4K,适用于会话标识;web storage数据存储可以达到5M;

      (3)、数据存储的有效期限不同:cookie只在设置了Cookid过期时间之前一直有效,即使关闭窗口或者浏览器;

              sessionStorage,仅在关闭浏览器之前有效;localStorage,数据存储永久有效;

      (4)、作用域不同:cookie和localStorage是在同源同窗口中都是共享的;sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;

       

      展开全文
    22. C++面试题汇总 (一)

      万次阅读 多人点赞 2019-06-27 08:54:39
      C++面试题汇总 (一)一,基础题二,算法题 一,基础题 new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应free只会释放...对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的...
    23. SpringBoot:三十五道SpringBoot面试题及答案!

      万次阅读 多人点赞 2019-05-15 23:08:32
      思考一下在你的虚拟机上部署应用程序需要些什么。 第一步: 安装 Java 第二部: 安装 Web 或者是应用程序的服务器(Tomat/Wbesphere/Weblogic 等等) 第三部: 部署应用程序 war 包 如果我们想简化这些步骤...
    24. C#基础教程-c#实例教程,适合初学者

      万次阅读 多人点赞 2016-08-22 11:13:24
      注意,和我们使用过的绝大多数编译器不同,在C#中编译器只执行编译这个过程,而在C和C++中经过编译和链接两个阶段。换而言之C#源文件并不被编译为目标文件.obj,而是直接生成可执行文件.exe或动态链接库.dll,C#...
    25. 软件测试入门知识了解

      万次阅读 多人点赞 2018-09-05 14:59:58
      支持各种应用环境,能配合硬件设备 (2)功能测试需求分析 了解需求范围-->明确目标用户-->分析功能步骤-->挖掘隐藏需求 了解需求想什么完成哪些功能模块 需求目标是谁?不同的用户角色,功能和权限是否一样...
    26. 普林斯顿Stata教程 - Stata数据处理

      万次阅读 2018-06-04 11:46:41
      值标签命名时需小心,不能直接将标签集取名 effortg .因为 effortg 仅表示变量和标签之间的关联。你需要定义一个新的标签集; 我们在此取名 ffortg_es ,结合旧名称和新语言代码,然后将其与变量 effortg 相关联: ...
    27. sqrt()函数详解

      万次阅读 多人点赞 2014-08-03 14:52:15
      我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然有可能你平时...
    28. 如果将对象作为Map中的key,需要是实现该对象的equals方法和hashCode方法;现在一般通过lombok可以简单得实现,并且可以选择具体需要哪些字段参与equals和hashCode方法的计算。 知识点梳理 Java类型系统中分为基础...
    29. 【JAVA面试】java面试题整理(3)

      千次阅读 2018-10-28 12:50:13
      大致思路: 进行垃圾回收,首先判断一个对象是否活着,这就引出了两种方法…   引用计数法和可达性分析法   gc roots 类型   引用类型   两次标记过程   垃圾回收算法  ...
    30. 博途简单使用方法以及注意事项

      千次阅读 2020-06-20 17:36:02
      几个月前帮学妹写论文,刚好用到博途软件做梯形图,终于...博途软件的最低配置要求是i5,博主本人硬是拿i3的笔记本装了个256G的固态,然后跑了这个软件,就是启动慢,偶尔卡,倒也还凑合,画梯形图不耽误。 ...
    31. 首先,我们知道破解一个游戏需要分析它的apk,于是我们需要用到MT管理器(因为我是从MT开始的),这个度娘一下可以出来。额,也可点链接http://www.coolapk.com/apk/bin.mt(怎么感觉前面的话像是废话,另外,手机...
    32. C++中头文件(.h)和源文件(.cpp)都应该写些什么

      千次阅读 多人点赞 2019-02-18 17:45:56
       写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。  在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):   #ifndef CIRCLE...
    33. 1. 使用方法sort()对列表进行永久性排序例子代码:cars = ['bmw', 'audi', 'toyota', 'subaru'] print(cars) cars.sort() print(cars)输出:['bmw', 'audi', 'toyota', 'subaru']['audi', 'bmw', 'subaru', 'toyota...
    34. 不只是编译,即使是在等待任何短暂的计算机操作结束,这段时间你会干些什么?  和你的工作日休息比起来这点时间是微不足道的,但是总的来说它还是能对你的生产率和幸福感感带来巨大帮助的。 顺便说一下,...
    35. HTML元素方法

      千次阅读 2019-04-27 10:54:28
      我知道你在想些什么:这种写法违背了 ‘toggle’ 这个词的本义(开关),那些从 IE 时代过来的开发者们都这么想,他们断言应当彻底摒弃使用第二个参数的做法。 所以,我收回我的话。不必坚持这种写法了,各位请...
    36. 转载请标明出处: ... 本文出自:【张旭童的博客】 本系列文章相关代码传送门: 自定义LayoutManager实现的流式布局 ...深入掌握自定义LayoutManager(一) 系列开篇 常见误区、问题、注意事项,常用API。 深
    37. 多线程开发中需要注意的问题

      千次阅读 2017-03-21 23:04:34
      多线程开发在 Linux 平台上已经有成熟的 Pthread 库支持。其涉及的多线程开发的最基本概念主要包含三点:线程,互斥锁,条件。其中,线程操作又分线程的创建,退出,等待 3 种。...线程函数列表(左为l
    38. 1:Application是什么?  Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application...
    39. 4 自定义函数 : 如果一段代码需要被重复...function 方法名(参数列表){ 函数体 } 需要注意的是:JavaScript 函数定义必须用小写的function 。JavaScript 函数无需定义返回值类型,直接在function后面书写方法名;
    40. Lambda表达式 一:简介 ...Lambda表达式在Swift语言中称之为代码块,Lambda表达式可以认为是一种特殊的接口,该接口必须只有一个抽象方法。 语法 (参数类型 参数名, 数参数类型 参数名2...) ...
    41. Java List: 列表什么数据类型,怎么用? 偶然发现容器类的结构在很多代码中越用越多。故,有意识开始整理。方法上觉得:用Java来了解和运用。然后用C++来实现和掌握最为便捷有效。 1 List array vector set 都...
    42. Python快速而美丽[v1.0.0][列表详解]

      千次阅读 2019-01-11 11:53:18
      本片博文介绍Python的列表,从列表的增删改查,到循环遍历乃至切片操作,并间隔着介绍如何使用它
    43. RxAndroid使用方法

      万次阅读 2016-01-01 10:10:35
      以前的文章讲述过一些, 这次再补充内容, 熟悉RxAndroid的使用方法. 要点包含: (1) 链式表达式的使用方式. (2) Lambda的应用. (3) Rx处理网络请求. (4) 线程自动管理, 防止内存泄露. GitHub下载地址.1. ...
    44. Python魔法方法指南

      千次阅读 多人点赞 2018-01-10 18:41:43
      下面是这些方法列表: __cmp__(self, other) __cmp__  是所有比较魔法方法中最基础的一个,它实际上定义了所有比较操作符的行为(<,==,!=,等等),但是它可能不能按照你需要的方式工作(例如,...
    45. 阅读论文的方法

      千次阅读 2018-07-25 11:10:45
      清单一:系统阅读论文的方法 1. 试着找个安静的地方呆上几个小时,拿上你最喜欢的饮料(可能是咖啡,茶,或者别的什么东西)。...快速看一看图片,在阅读文字时注意任何要注意的关键字。试着了解一下论文的布局和位置...
    46. minicom 使用方法

      万次阅读 多人点赞 2017-08-29 08:11:58
      注意:如果沒有使用USB轉串口,而是直接使用串口,那麼Serial Device配置爲/dev/ttyS0。 返回主菜单后,选择“Save setup as df1”,将其保存为默认设置,然后选择 Exit推出。需退出后重新打开minicom,软件...
    47. 一个架构师谈什么是架构以及怎么成为一个架构师

      万次阅读 多人点赞 2015-02-24 20:05:45
      所以今天我们先来点”番外篇“,讲讲什么是架构师,什么是架构这个永恒的话题吧。此篇源出自我在公司内部写的一个PPT,它是用于在公司内部向广大技术人员做普及用的一个资料,而CSDN这边的编辑不支持图文混排的效果...

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 135,332
    精华内容 54,132
    关键字:

    列表的方法要注意些什么