精华内容
下载资源
问答
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过...

    更新于2021-08-13 22:55:12

    欢迎关注微信公众号【技术人成长之路】

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

    本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽

    整理的Java知识体系主要包括基础知识,工具,并发编程,数据结构与算法,数据库,JVM,架构设计,应用框架,中间件,微服务架构,分布式架构,程序员的一些思考,团队与项目管理,运维,权限,推荐书籍,云计算,区块链等,包含了作为一个Java工程师在开发工作学习中需要用到或者可能用到的绝大部分知识。千里之行始于足下,希望大家根据自己的薄弱点,查缺补漏,根据自己感兴趣的方面多学习,学的精通一点,从现在开始行动起来。路漫漫其修远兮,吾将上下而求索,不管编程开发的路有多么难走,多么艰辛,我们都将百折不挠,不遗余力地去追求和探索

    文章目录

    Java面试总结

    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

    基础知识

    Java概述

    序号内容链接地址
    1Java简介https://thinkwon.blog.csdn.net/article/details/94353575
    2Java发展历程https://thinkwon.blog.csdn.net/article/details/94353653
    3Java语言特点https://thinkwon.blog.csdn.net/article/details/94354013
    4JDK安装与环境变量配置https://thinkwon.blog.csdn.net/article/details/94353907
    5JVM、JRE和JDK的关系https://thinkwon.blog.csdn.net/article/details/101369973
    6Java是编译型还是解释型语言https://thinkwon.blog.csdn.net/article/details/108678327

    基础语法

    大部分已完成

    待整理:

    Java开发必会的反编译知识(附支持对Lambda进行反编译的工具)

    一文读懂什么是Java中的自动拆装箱

    Java的枚举类型用法介绍

    类、枚举、接口、数组、可变参数

    泛型、序列化

    序号内容链接地址
    1Java标识符https://thinkwon.blog.csdn.net/article/details/101637454
    2Java关键字(Java 8版本)https://thinkwon.blog.csdn.net/article/details/101642385
    3Java注释https://thinkwon.blog.csdn.net/article/details/101643185
    4Java访问修饰符https://thinkwon.blog.csdn.net/article/details/101643412
    5Java分隔符https://thinkwon.blog.csdn.net/article/details/101643617
    6Java转义字符https://thinkwon.blog.csdn.net/article/details/101643769
    7Java进制https://thinkwon.blog.csdn.net/article/details/101643936
    8Java流程控制语句https://thinkwon.blog.csdn.net/article/details/101645978
    9Java流程控制语句-顺序结构https://thinkwon.blog.csdn.net/article/details/101644820
    10Java流程控制语句-分支结构https://thinkwon.blog.csdn.net/article/details/101645224
    11Java流程控制语句-循环结构https://thinkwon.blog.csdn.net/article/details/101645757
    12Java表达式https://thinkwon.blog.csdn.net/article/details/101648114
    13Java运算符https://thinkwon.blog.csdn.net/article/details/101649002
    14Java变量https://thinkwon.blog.csdn.net/article/details/101649292
    15Java常量https://thinkwon.blog.csdn.net/article/details/101649446
    16Java数据类型https://thinkwon.blog.csdn.net/article/details/101649568
    17Java反射https://thinkwon.blog.csdn.net/article/details/100128361
    18Java语法糖https://thinkwon.blog.csdn.net/article/details/100103689
    19Java注解https://thinkwon.blog.csdn.net/article/details/100178709
    20JSON简介https://thinkwon.blog.csdn.net/article/details/100642585
    21Properties类简介https://thinkwon.blog.csdn.net/article/details/100667783
    22XML简介https://thinkwon.blog.csdn.net/article/details/100642425
    23YML简介https://thinkwon.blog.csdn.net/article/details/100642870
    24Java8新特性-Lambda表达式https://thinkwon.blog.csdn.net/article/details/100642932
    25Java基础语法https://thinkwon.blog.csdn.net/article/details/94354151

    面向对象

    待整理:

    抽象

    继承、封装、多态

    接口、抽象类、内部类

    序号内容链接地址
    1什么是面向对象https://thinkwon.blog.csdn.net/article/details/100667386

    集合框架

    迭代器、增强for、泛型

    序号内容链接地址
    1Java集合框架总结https://thinkwon.blog.csdn.net/article/details/98844796
    2ArrayList(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/98845119
    3HashMap(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/98845487
    4LinkedHashMap(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/102574293
    5LinkedList(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/102573923
    6TreeMap(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/102571883

    IO流

    待整理:

    File、递归

    字节流、字节缓冲流

    编码表、编码方式、转换流、序列化、序列化流、打印流、commons-io

    网络编程

    网络概述、网络模型

    Socket原理机制

    UDP

    TCP/IP

    协议、OSI 七层协议、HTTP、HTTP2.0、HTTPS

    网络安全

    ​ XSS、CSRF、SQL注入、Hash Dos、脚本注入、漏洞扫描工具、验证码

    ​ DDoS防范、用户隐私信息保护、序列化漏洞

    ​ 加密解密、对称加密、哈希算法、非对称加密

    ​ 服务安全、数据安全、数据备份

    ​ 网络隔离、登录跳板机、非外网分离

    ​ 认证、授权

    常用API

    String、StringBuffer、StringBuilder、正则表达式

    Number、Radom、Math、System、包装类

    Arrays、Collections

    日期时间API

    序号内容链接地址
    1Java7日期时间APIhttps://thinkwon.blog.csdn.net/article/details/110777654
    2史上最全Java7日期时间工具类https://thinkwon.blog.csdn.net/article/details/110779441
    3Java8日期时间APIhttps://thinkwon.blog.csdn.net/article/details/111087199
    4史上最全Java8日期时间工具类https://thinkwon.blog.csdn.net/article/details/111116600

    常用工具类库

    待整理:OkHttp、commons-lang3

    序号内容链接地址
    1HttpClient工具类https://thinkwon.blog.csdn.net/article/details/101391489
    2WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换https://thinkwon.blog.csdn.net/article/details/101392187
    3Lombok简介、使用、工作原理、优缺点https://thinkwon.blog.csdn.net/article/details/101392808
    4Java几种常用JSON库性能比较https://thinkwon.blog.csdn.net/article/details/94354358

    单元测试

    JUnit

    异常

    序号内容链接地址
    1Java异常总结https://thinkwon.blog.csdn.net/article/details/94346911
    2Java异常架构与异常关键字https://thinkwon.blog.csdn.net/article/details/101676779
    3Java异常处理流程https://thinkwon.blog.csdn.net/article/details/101677638
    4如何选择异常类型https://thinkwon.blog.csdn.net/article/details/94346911
    5Java异常常见面试题https://thinkwon.blog.csdn.net/article/details/101681073
    6Java异常处理最佳实践https://thinkwon.blog.csdn.net/article/details/94347002

    日志

    序号内容链接地址
    1常用日志框架Log4j,Logback,Log4j2性能比较与日志门面SLF4J简介https://thinkwon.blog.csdn.net/article/details/101621135
    2日志作用https://thinkwon.blog.csdn.net/article/details/101619725
    3Apache Log4j2详解https://thinkwon.blog.csdn.net/article/details/95043111
    4Log4j2同步日志,混合日志和异步日志配置详解https://thinkwon.blog.csdn.net/article/details/101625124
    5Log4j2配置文件详解https://thinkwon.blog.csdn.net/article/details/101629302
    6Log4j2的Appenders配置详解https://thinkwon.blog.csdn.net/article/details/101625820
    7Log4j2的Filters配置详解https://thinkwon.blog.csdn.net/article/details/101627162
    8Log4j2的Policy触发策略与Strategy滚动策略配置详解https://thinkwon.blog.csdn.net/article/details/101628222
    9Log4j2的Loggers配置详解https://thinkwon.blog.csdn.net/article/details/101628736

    Java8新特性

    序号内容链接地址
    1Java8新特性-Lambda表达式https://thinkwon.blog.csdn.net/article/details/113764085
    2Java8新特性-Optionalhttps://thinkwon.blog.csdn.net/article/details/113791796
    3Java8新特性-Streamhttps://thinkwon.blog.csdn.net/article/details/113798096
    4Java8新特性-Base64https://thinkwon.blog.csdn.net/article/details/113798575
    5Java8新特性-日期时间APIhttps://thinkwon.blog.csdn.net/article/details/111087199

    工具

    IDEA

    序号内容链接地址
    1IDEA常用配置和常用插件https://thinkwon.blog.csdn.net/article/details/101020481
    2IDEA中Maven依赖下载失败解决方案https://thinkwon.blog.csdn.net/article/details/101312918
    3在IDEA中使用Linux命令https://thinkwon.blog.csdn.net/article/details/106320360

    Eclipse & STS

    序号内容链接地址
    1Eclipse & Spring Tool Suite常用配置https://thinkwon.blog.csdn.net/article/details/101025543

    Maven

    序号内容链接地址
    1Maven简介https://thinkwon.blog.csdn.net/article/details/94346090
    2Maven安装与配置https://thinkwon.blog.csdn.net/article/details/94346569
    3Maven依赖冲突https://thinkwon.blog.csdn.net/article/details/101483020
    4手动安装Maven依赖https://thinkwon.blog.csdn.net/article/details/101483478
    5Maven部署jar包到远程仓库https://thinkwon.blog.csdn.net/article/details/101483769
    6Maven私服Nexus安装与使用https://thinkwon.blog.csdn.net/article/details/94346681

    Docker

    序号内容链接地址
    1使用Docker安装GitLabhttps://thinkwon.blog.csdn.net/article/details/95042797
    2虚拟机和容器有什么不同https://thinkwon.blog.csdn.net/article/details/107476886
    3Docker 从入门到实践系列一 - 什么是Dockerhttps://thinkwon.blog.csdn.net/article/details/107477065
    4Docker 从入门到实践系列二 - Docker 安装https://thinkwon.blog.csdn.net/article/details/117638107
    5Docker 从入门到实践系列三 - Docker 常用命令https://thinkwon.blog.csdn.net/article/details/117638128
    6Docker 从入门到实践系列四 - Docker 容器编排利器 Docker Composehttps://thinkwon.blog.csdn.net/article/details/119511551

    Git

    序号内容链接地址
    1Git简介https://thinkwon.blog.csdn.net/article/details/94346816
    2版本控制https://thinkwon.blog.csdn.net/article/details/101449228
    3Git忽略文件.gitignore详解https://thinkwon.blog.csdn.net/article/details/101447866
    4Git与SVN的区别https://thinkwon.blog.csdn.net/article/details/101449611
    5常用Git命令https://thinkwon.blog.csdn.net/article/details/101450420
    6Git,GitHub与GitLab的区别https://thinkwon.blog.csdn.net/article/details/101470086

    GitLab

    GitKraken

    Navicat

    并发编程

    基础知识

    序号内容链接地址
    1并发编程的优缺点https://thinkwon.blog.csdn.net/article/details/102020811
    2线程的状态和基本操作https://thinkwon.blog.csdn.net/article/details/102027115
    3进程和线程的区别(超详细)https://thinkwon.blog.csdn.net/article/details/102021274
    4创建线程的四种方式https://thinkwon.blog.csdn.net/article/details/102021143

    并发理论

    序号内容链接地址
    1Java内存模型https://thinkwon.blog.csdn.net/article/details/102073578
    2重排序与数据依赖性https://thinkwon.blog.csdn.net/article/details/102073858
    3as-if-serial规则和happens-before规则的区别https://thinkwon.blog.csdn.net/article/details/102074107
    4Java并发理论总结https://thinkwon.blog.csdn.net/article/details/102074440

    并发关键字

    序号内容链接地址
    1Java并发关键字-synchronizedhttps://thinkwon.blog.csdn.net/article/details/102243189
    2Java并发关键字-volatilehttps://thinkwon.blog.csdn.net/article/details/102243670
    3Java并发关键字-finalhttps://thinkwon.blog.csdn.net/article/details/102244477

    Lock体系

    待整理:

    公平锁 & 非公平锁

    乐观锁 & 悲观锁

    可重入锁 & 不可重入锁

    互斥锁 & 共享锁

    死锁

    序号内容链接地址
    1Lock简介与初识AQShttps://thinkwon.blog.csdn.net/article/details/102468837
    2AQS(AbstractQueuedSynchronizer)详解与源码分析https://thinkwon.blog.csdn.net/article/details/102469112
    3ReentrantLock(重入锁)实现原理与公平锁非公平锁区别https://thinkwon.blog.csdn.net/article/details/102469388
    4读写锁ReentrantReadWriteLock源码分析https://thinkwon.blog.csdn.net/article/details/102469598
    5Condition源码分析与等待通知机制https://thinkwon.blog.csdn.net/article/details/102469889
    6LockSupport详解https://thinkwon.blog.csdn.net/article/details/102469993

    并发容器

    序号内容链接地址
    1并发容器之ConcurrentHashMap详解(JDK1.8版本)与源码分析https://thinkwon.blog.csdn.net/article/details/102506447
    2并发容器之ConcurrentLinkedQueue详解与源码分析https://thinkwon.blog.csdn.net/article/details/102508089
    3并发容器之CopyOnWriteArrayList详解https://thinkwon.blog.csdn.net/article/details/102508258
    4并发容器之ThreadLocal详解https://thinkwon.blog.csdn.net/article/details/102508381
    5ThreadLocal内存泄漏分析与解决方案https://thinkwon.blog.csdn.net/article/details/102508721
    6并发容器之BlockingQueue详解https://thinkwon.blog.csdn.net/article/details/102508901
    7并发容器之ArrayBlockingQueue与LinkedBlockingQueue详解https://thinkwon.blog.csdn.net/article/details/102508971

    线程池

    序号内容链接地址
    1线程池ThreadPoolExecutor详解https://thinkwon.blog.csdn.net/article/details/102541900
    2Executors类创建四种常见线程池https://thinkwon.blog.csdn.net/article/details/102541990
    3线程池之ScheduledThreadPoolExecutor详解https://thinkwon.blog.csdn.net/article/details/102542299
    4FutureTask详解https://thinkwon.blog.csdn.net/article/details/102542404

    原子操作类

    序号内容链接地址
    1原子操作类总结https://thinkwon.blog.csdn.net/article/details/102556910

    并发工具

    序号内容链接地址
    1并发工具之CountDownLatch与CyclicBarrierhttps://thinkwon.blog.csdn.net/article/details/102556958
    2并发工具之Semaphore与Exchangerhttps://thinkwon.blog.csdn.net/article/details/102557034

    并发实践

    序号内容链接地址
    1实现生产者消费者的三种方式https://thinkwon.blog.csdn.net/article/details/102557126

    数据结构与算法

    数据结构

    序号内容链接地址
    1红黑树详细分析(图文详解),看了都说好https://thinkwon.blog.csdn.net/article/details/102571535
    1、数组
    2、栈
    3、队列
    4、链表
    5、树
    	二叉树
        完全二叉树
        平衡二叉树
        二叉查找树(BST)
        红黑树
        B,B+,B*树
        LSM 树
    
    字段是不是数据结构
    

    算法

    语言只是编程工具,算法才是编程之魂!

    1、排序算法:快速排序、归并排序、计数排序
    2、搜索算法:回溯、递归、剪枝
    3、图论:最短路径、最小生成树、网络流建模
    4、动态规划:背包问题、最长子序列、计数问题
    5、基础技巧:分治、倍增、二分法、贪心算法
    
    宽度优先搜索
    深度优先搜索
    广度优先
    双指针
    扫描线
    
    朴素贝叶斯
    推荐算法
    

    排序算法

    序号内容链接地址
    1史上最全经典排序算法总结(Java实现)https://thinkwon.blog.csdn.net/article/details/95616819
    2冒泡排序(Bubble Sort)https://thinkwon.blog.csdn.net/article/details/101534473
    3选择排序(Selection Sort)https://thinkwon.blog.csdn.net/article/details/101534721
    4插入排序(Insertion Sort)https://thinkwon.blog.csdn.net/article/details/101537804
    5希尔排序(Shell Sort)https://thinkwon.blog.csdn.net/article/details/101538166
    6归并排序(Merge Sort)https://thinkwon.blog.csdn.net/article/details/101538756
    7快速排序(Quick Sort)https://thinkwon.blog.csdn.net/article/details/101543580
    8堆排序(Heap Sort)https://thinkwon.blog.csdn.net/article/details/101543941
    9计数排序(Counting Sort)https://thinkwon.blog.csdn.net/article/details/101544159
    10桶排序(Bucket Sort)https://thinkwon.blog.csdn.net/article/details/101544356
    11基数排序(Radix Sort)https://thinkwon.blog.csdn.net/article/details/101545529

    LeetCode

    序号内容链接地址
    1LeetCode第1题 两数之和(Two Sum)https://thinkwon.blog.csdn.net/article/details/103113049
    2LeetCode第3题 无重复字符的最长子串(Longest Substring Without Repeating Characters)https://thinkwon.blog.csdn.net/article/details/103113969
    3LeetCode第7题 整数反转(Reverse Integer)https://thinkwon.blog.csdn.net/article/details/103113167
    4LeetCode第9题 回文数(Palindrome Number)https://thinkwon.blog.csdn.net/article/details/103113151
    5LeetCode第13题 罗马数字转整数(Roman to Integer)https://thinkwon.blog.csdn.net/article/details/103113519
    6LeetCode第14题 最长公共前缀(Longest Common Prefix)https://thinkwon.blog.csdn.net/article/details/103113700
    7LeetCode第20题 有效的括号(Valid Parentheses)https://thinkwon.blog.csdn.net/article/details/103113848
    8LeetCode第26题 删除排序数组中的重复项(Remove Duplicates from Sorted Array)https://thinkwon.blog.csdn.net/article/details/103113097

    数据库

    Oracle

    MySQL

    数据库基础知识

    序号内容链接地址
    1MySQL语句分类https://thinkwon.blog.csdn.net/article/details/106610851
    2MySQL插入语句insert into,insert ignore into,insert into … on duplicate key update,replace into-解决唯一键约束https://thinkwon.blog.csdn.net/article/details/106610789
    3MySQL复制表的三种方式https://thinkwon.blog.csdn.net/article/details/106610810
    4MySQL删除表的三种方式https://thinkwon.blog.csdn.net/article/details/106610831
    5MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别https://thinkwon.blog.csdn.net/article/details/106610859

    数据类型

    引擎

    索引

    三大范式

    常用SQL语句

    存储过程与函数

    视图

    MySQL优化

    事务

    数据备份与还原

    Redis

    序号内容链接地址
    1Redis总结https://thinkwon.blog.csdn.net/article/details/99999584
    2Redis使用场景https://thinkwon.blog.csdn.net/article/details/101521497
    3Redis数据类型https://thinkwon.blog.csdn.net/article/details/101521724
    4Redis持久化https://thinkwon.blog.csdn.net/article/details/101522209
    5Redis过期键的删除策略https://thinkwon.blog.csdn.net/article/details/101522970
    6Redis数据淘汰策略https://thinkwon.blog.csdn.net/article/details/101530624
    7Redis与Memcached的区别https://thinkwon.blog.csdn.net/article/details/101530406
    8Redis常见面试题(精简版)https://thinkwon.blog.csdn.net/article/details/103522351
    9Redis中缓存雪崩、缓存穿透等问题的解决方案https://thinkwon.blog.csdn.net/article/details/103402008
    10阿里云Redis开发规范学习总结https://thinkwon.blog.csdn.net/article/details/103400250
    11Redis开发常用规范https://thinkwon.blog.csdn.net/article/details/103401781
    12这可能是最中肯的Redis规范了https://thinkwon.blog.csdn.net/article/details/103401978

    Java虚拟机

    深入理解Java虚拟机

    序号内容链接地址
    1深入理解Java虚拟机-走近Javahttps://thinkwon.blog.csdn.net/article/details/103804387
    2深入理解Java虚拟机-Java内存区域与内存溢出异常https://thinkwon.blog.csdn.net/article/details/103827387
    3深入理解Java虚拟机-垃圾回收器与内存分配策略https://thinkwon.blog.csdn.net/article/details/103831676
    4深入理解Java虚拟机-虚拟机执行子系统https://thinkwon.blog.csdn.net/article/details/103835168
    5深入理解Java虚拟机-程序编译与代码优化https://thinkwon.blog.csdn.net/article/details/103835883
    6深入理解Java虚拟机-高效并发https://thinkwon.blog.csdn.net/article/details/103836167

    架构设计

    高可用架构

    高并发架构

    可伸缩架构

    集群

    设计模式

    常用设计模式

    创建型:
    单例模式、工厂模式、抽象工厂模式

    结构型:
    适配器模式、外观模式、代理模式、装饰器模式

    行为型:
    观察者模式、策略模式、模板模式

    序号内容链接地址
    1设计模式https://thinkwon.blog.csdn.net/article/details/96829572

    创建型模式

    序号内容链接地址
    1抽象工厂模式https://thinkwon.blog.csdn.net/article/details/101382584
    2单例模式https://thinkwon.blog.csdn.net/article/details/101382855
    3工厂模式https://thinkwon.blog.csdn.net/article/details/101383285
    4建造者模式https://thinkwon.blog.csdn.net/article/details/101383401
    5原型模式https://thinkwon.blog.csdn.net/article/details/101383491

    结构型模式

    序号内容链接地址
    1代理模式https://thinkwon.blog.csdn.net/article/details/101384436
    2过滤器模式https://thinkwon.blog.csdn.net/article/details/101384514
    3桥接模式https://thinkwon.blog.csdn.net/article/details/101384584
    4适配器模式https://thinkwon.blog.csdn.net/article/details/101384619
    5外观模式https://thinkwon.blog.csdn.net/article/details/101384676
    6享元模式https://thinkwon.blog.csdn.net/article/details/101384716
    7装饰器模式https://thinkwon.blog.csdn.net/article/details/101384753
    8组合模式https://thinkwon.blog.csdn.net/article/details/101384786

    行为型模式

    序号内容链接地址
    1备忘录模式https://thinkwon.blog.csdn.net/article/details/101383582
    2策略模式https://thinkwon.blog.csdn.net/article/details/101383647
    3迭代器模式https://thinkwon.blog.csdn.net/article/details/101383722
    4访问者模式https://thinkwon.blog.csdn.net/article/details/101383780
    5观察者模式https://thinkwon.blog.csdn.net/article/details/101383872
    6解释器模式https://thinkwon.blog.csdn.net/article/details/101383930
    7空对象模式https://thinkwon.blog.csdn.net/article/details/101384001
    8命令模式https://thinkwon.blog.csdn.net/article/details/101384090
    9模板模式https://thinkwon.blog.csdn.net/article/details/101384138
    10责任链模式https://thinkwon.blog.csdn.net/article/details/101384195
    11中介者模式https://thinkwon.blog.csdn.net/article/details/101384251
    12状态模式https://thinkwon.blog.csdn.net/article/details/101384315

    J2EE模式

    序号内容链接地址
    1MVC模式https://thinkwon.blog.csdn.net/article/details/101381701
    2传输对象模式https://thinkwon.blog.csdn.net/article/details/101382134
    3服务定位器模式https://thinkwon.blog.csdn.net/article/details/101382179
    4拦截过滤器模式https://thinkwon.blog.csdn.net/article/details/101382210
    5前端控制器模式https://thinkwon.blog.csdn.net/article/details/101382247
    6数据访问对象模式https://thinkwon.blog.csdn.net/article/details/101382287
    7业务代表模式https://thinkwon.blog.csdn.net/article/details/101382356
    8组合实体模式https://thinkwon.blog.csdn.net/article/details/101382390

    实践应用

    序号内容链接地址
    1业务复杂=if else?刚来的大神竟然用策略+工厂彻底干掉了他们!https://thinkwon.blog.csdn.net/article/details/102924813

    应用框架

    如何学习一个框架或者技术

    • 是什么,简介,概述

    • 有什么用,用途,使用场景

    • 怎么用,在实际开发中的应用,注意事项

    • 优缺点

    • 框架原理,工作流程,工作原理

    • 常见面试题

    • 源码分析,核心类,核心方法,设计模式

    • 发布博客,在开发和实践中,博客反馈中持续改进

    • 与同事朋友交流,技术论坛,技术分享中持续丰富知识

    常用框架

    • 集成开发工具(IDE):Eclipse、MyEclipse、Spring Tool Suite(STS)、Intellij IDEA、NetBeans、JBuilder、JCreator

    • JAVA服务器:tomcat、jboss、websphere、weblogic、resin、jetty、apusic、apache

    • 负载均衡:nginx、lvs

    • web层框架:Spring MVC、Struts2、Struts1、Google Web Toolkit(GWT)、JQWEB

    • 服务层框架:Spring、EJB

    • 持久层框架:Hibernate、MyBatis、JPA、TopLink

    • 数据库:Oracle、MySql、MSSQL、Redis

    • 项目构建:maven、ant

    • 持续集成:Jenkins

    • 版本控制:SVN、CVS、VSS、GIT

    • 私服:Nexus

    • 消息组件:IBM MQ、RabbitMQ、ActiveMQ、RocketMq

    • 日志框架:Commons Logging、log4j 、slf4j、IOC

    • 缓存框架:memcache、redis、ehcache、jboss cache

    • RPC框架:Hessian、Dubbo

    • 规则引擎:Drools

    • 工作流:Activiti

    • 批处理:Spring Batch

    • 通用查询框架:Query DSL

    • JAVA安全框架:shiro、Spring Security

    • 代码静态检查工具:FindBugs、PMD

    • Linux操作系统:CentOS、Ubuntu、SUSE Linux、

    • 常用工具:PLSQL Developer(Oracle)、Navicat(MySql)、FileZilla(FTP)、Xshell(SSH)、putty(SSH)、SecureCRT(SSH)、jd-gui(反编译)

    Spring

    序号内容链接地址
    1Spring简介、设计理念、优缺点、应用场景https://thinkwon.blog.csdn.net/article/details/102810748
    2Spring模块组成(框架组成、整体架构、体系架构、体系结构)https://thinkwon.blog.csdn.net/article/details/102810819
    3Spring容器中bean的生命周期https://thinkwon.blog.csdn.net/article/details/102866432
    4控制反转(IoC)与依赖注入(DI)详解https://thinkwon.blog.csdn.net/article/details/102912332

    《Spring实战》读书笔记

    序号内容链接地址
    1《Spring实战》读书笔记-第1章 Spring之旅https://thinkwon.blog.csdn.net/article/details/103097364
    2《Spring实战》读书笔记-第2章 装配Beanhttps://thinkwon.blog.csdn.net/article/details/103527675
    3《Spring实战》读书笔记-第3章 高级装配https://thinkwon.blog.csdn.net/article/details/103536621
    4《Spring实战》读书笔记-第4章 面向切面的Springhttps://thinkwon.blog.csdn.net/article/details/103541166
    5《Spring实战》读书笔记-第5章 构建Spring Web应用程序https://thinkwon.blog.csdn.net/article/details/103550083
    6《Spring实战》读书笔记-第6章 渲染Web视图https://thinkwon.blog.csdn.net/article/details/103559672
    7《Spring实战》读书笔记-第7章 Spring MVC的高级技术https://thinkwon.blog.csdn.net/article/details/103562467

    Spring MVC

    MyBatis

    序号内容链接地址
    1MyBatis官方文档https://thinkwon.blog.csdn.net/article/details/100887995
    2MyBatis官方文档-简介https://thinkwon.blog.csdn.net/article/details/100887076
    3MyBatis官方文档-入门https://thinkwon.blog.csdn.net/article/details/100887176
    4MyBatis官方文档-XML 配置https://thinkwon.blog.csdn.net/article/details/100887349
    5MyBatis官方文档-XML 映射文件https://thinkwon.blog.csdn.net/article/details/100887478
    6MyBatis官方文档-动态 SQLhttps://thinkwon.blog.csdn.net/article/details/100887702
    7MyBatis官方文档-Java APIhttps://thinkwon.blog.csdn.net/article/details/100887746
    8MyBatis官方文档-SQL 语句构建器类https://thinkwon.blog.csdn.net/article/details/100887821
    9MyBatis官方文档-日志https://thinkwon.blog.csdn.net/article/details/100887951
    10MyBatis功能架构https://thinkwon.blog.csdn.net/article/details/101295025
    11MyBatis工作原理https://thinkwon.blog.csdn.net/article/details/101293609
    12MyBatis核心类https://thinkwon.blog.csdn.net/article/details/101293216
    13MyBatis面试宝典https://thinkwon.blog.csdn.net/article/details/101292950
    14MyBatis实现一对一,一对多关联查询https://thinkwon.blog.csdn.net/article/details/101322334
    15MyBatis缓存https://thinkwon.blog.csdn.net/article/details/101351212

    MyBatis 源码分析

    序号内容链接地址
    1MyBatis 源码分析 - MyBatis入门https://thinkwon.blog.csdn.net/article/details/114808852
    2MyBatis 源码分析 - 配置文件解析过程https://thinkwon.blog.csdn.net/article/details/114808962
    3MyBatis 源码分析 - 映射文件解析过程https://thinkwon.blog.csdn.net/article/details/115423167
    4MyBatis 源码分析 - SQL 的执行过程https://thinkwon.blog.csdn.net/article/details/115603376
    5MyBatis 源码分析 - 内置数据源https://thinkwon.blog.csdn.net/article/details/116331419
    6MyBatis 源码分析 - 缓存原理https://thinkwon.blog.csdn.net/article/details/116809942
    7MyBatis 源码分析 - 插件机制https://thinkwon.blog.csdn.net/article/details/116809961

    Quartz

    序号内容链接地址
    1Quartz简介https://thinkwon.blog.csdn.net/article/details/109936696

    Hibernate

    Shiro

    Spring Security

    Netty

    搜索引擎

    Lucene/Solr

    Elasticsearch

    ELK

    中间件

    消息中间件

    RabbitMQ

    RocketMQ

    ActiveMQ

    Kafka

    远程过程调用中间件

    Dubbo

    数据访问中间件

    Sharding JDBC

    MyCat

    Web应用服务器

    Tomcat

    待整理:Tomcat各组件作用 Tomcat集群 Tomcat面试题

    序号内容链接地址
    1Win10安装Tomcat服务器与配置环境变量https://thinkwon.blog.csdn.net/article/details/102622905
    2Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项https://thinkwon.blog.csdn.net/article/details/102717537
    3Tomcat与JDK版本对应关系,Tomcat各版本特性https://thinkwon.blog.csdn.net/article/details/102622738
    4Tomcat目录结构https://thinkwon.blog.csdn.net/article/details/102619466
    5Tomcat乱码与端口占用的解决方案https://thinkwon.blog.csdn.net/article/details/102622824
    6Tomcat系统架构与请求处理流程https://thinkwon.blog.csdn.net/article/details/102676442
    7史上最强Tomcat8性能优化https://thinkwon.blog.csdn.net/article/details/102744033

    Nginx

    缓存

    本地缓存

    客户端缓存

    服务端缓存

    ​ web缓存,Redis,Memcached,Ehcache

    其他

    Zookeeper

    微服务与分布式

    Spring Boot

    序号内容链接地址
    1application.yml与bootstrap.yml的区别https://thinkwon.blog.csdn.net/article/details/100007093
    2一分钟了解约定优于配置https://thinkwon.blog.csdn.net/article/details/101703815

    Spring Cloud

    序号内容链接地址
    1Spring Cloud入门-十分钟了解Spring Cloudhttps://thinkwon.blog.csdn.net/article/details/103715146
    2Spring Cloud入门-Eureka服务注册与发现(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103726655
    3Spring Cloud入门-Ribbon服务消费者(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103729080
    4Spring Cloud入门-Hystrix断路器(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103732497
    5Spring Cloud入门-Hystrix Dashboard与Turbine断路器监控(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103734664
    6Spring Cloud入门-OpenFeign服务消费者(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103735751
    7Spring Cloud入门-Zuul服务网关(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103738851
    8Spring Cloud入门-Config分布式配置中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103739628
    9Spring Cloud入门-Bus消息总线(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103753372
    10Spring Cloud入门-Sleuth服务链路跟踪(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103753896
    11Spring Cloud入门-Consul服务注册发现与配置中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103756139
    12Spring Cloud入门-Gateway服务网关(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103757927
    13Spring Cloud入门-Admin服务监控中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103758697
    14Spring Cloud入门-Oauth2授权的使用(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103761687
    15Spring Cloud入门-Oauth2授权之JWT集成(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103763364
    16Spring Cloud入门-Oauth2授权之基于JWT完成单点登录(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103766368
    17Spring Cloud入门-Nacos实现注册和配置中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103769680
    18Spring Cloud入门-Sentinel实现服务限流、熔断与降级(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103770879
    19Spring Cloud入门-Seata处理分布式事务问题(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103786102
    20Spring Cloud入门-汇总篇(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103786588

    服务注册发现

    服务配置

    负载均衡

    服务调用

    服务限流

    熔断降级

    网关路由

    服务权限

    链路追踪

    分布式事务

    分布式缓存

    分布式会话

    日志收集

    服务监控

    消息驱动

    数据处理流

    自动化测试与部署

    第三方支持

    分布式协调服务Zookeeper

    程序员的一些思考

    序号内容链接地址
    1程序员写个人技术博客的价值与意义https://thinkwon.blog.csdn.net/article/details/102980571
    2Java知识体系最强总结(2020版)https://thinkwon.blog.csdn.net/article/details/103592572
    3博客之星,有你的鼓励更精彩https://thinkwon.blog.csdn.net/article/details/112517796

    团队与项目管理

    需求调研

    项目管理

    序号内容链接地址
    1Worktile、Teambition与Tower项目管理软件对比https://thinkwon.blog.csdn.net/article/details/106064807

    代码管理

    文档管理

    序号内容链接地址
    1几款常见接口管理平台对比https://thinkwon.blog.csdn.net/article/details/106064883
    2Swagger2常用注解说明https://thinkwon.blog.csdn.net/article/details/107477801

    测试

    Python

    序号内容链接地址
    1Win10安装Python3.9https://thinkwon.blog.csdn.net/article/details/112411897
    2Anaconda安装https://thinkwon.blog.csdn.net/article/details/112412165
    3PyCharm2020.3.2安装https://thinkwon.blog.csdn.net/article/details/112412497
    4PyCharm常用配置和常用插件https://thinkwon.blog.csdn.net/article/details/112412783

    运维

    常规监控

    APM

    持续集成(CI/CD):Jenkins,环境分离

    自动化运维:Ansible,puppet,chef

    测试:TDD 理论,单元测试,压力测试,全链路压测,A/B 、灰度、蓝绿测试

    虚拟化:KVM,Xen,OpenVZ

    容器技术:Docker

    云技术:OpenStack

    DevOps

    操作系统

    计算机操作系统

    计算机原理

    Linux

    CPU

    进程,线程,协程

    CentOS8

    序号内容链接地址
    1VMware Workstation Pro 16搭建CentOS8虚拟机集群https://thinkwon.blog.csdn.net/article/details/115058171
    2CentOS8安装Dockerhttps://thinkwon.blog.csdn.net/article/details/115056214
    3CentOS8搭建Nacos1.4.0集群https://thinkwon.blog.csdn.net/article/details/115056401
    4CentOS8安装GitLab13.7.2https://thinkwon.blog.csdn.net/article/details/115056528
    5CentOS8安装MySQL8https://thinkwon.blog.csdn.net/article/details/115055934

    推荐书籍

    序号内容链接地址
    1读书清单-计算机https://thinkwon.blog.csdn.net/article/details/108077754

    读书笔记

    序号内容链接地址
    1高效休息法-读书笔记https://thinkwon.blog.csdn.net/article/details/118638191
    2斯坦福高效睡眠法-读书笔记https://thinkwon.blog.csdn.net/article/details/108349844
    3高效能人士的七个习惯-读书笔记https://thinkwon.blog.csdn.net/article/details/108941111
    4富爸爸穷爸爸-读书笔记https://thinkwon.blog.csdn.net/article/details/109261723
    5如何阅读一本书-读书笔记https://thinkwon.blog.csdn.net/article/details/115422659
    6人性的弱点-读书笔记https://thinkwon.blog.csdn.net/article/details/116809824
    7麦肯锡极简工作法-读书笔记https://thinkwon.blog.csdn.net/article/details/118638191

    云计算

    IaaS、SaaS、PaaS、虚拟化技术、openstack、Serverlsess

    搜索引擎

    Solr、Lucene、Nutch、Elasticsearch

    权限管理

    Shiro、Spring Security

    区块链

    哈希算法、Merkle树、公钥密码算法、共识算法、Raft协议、Paxos 算法与 Raft 算法、拜占庭问题与算法、消息认证码与数字签名

    展开全文
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    在使用mount这个指令时,至少要先知道下列三种信息:要加载对象的文件系统类型、要加载对象的设备名称及要将设备加载到哪个目录下。 (1)Linux可以识别的文件系统 ◆ Windows 95/98常用的FAT 32文件系统:vfat ;...
  • 2021年前端面试题及答案

    万次阅读 多人点赞 2020-02-11 19:29:34
    它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。 3 如何解决跨域? 能说1,2,7,8就行。 1、 通过jsonp跨域 2、CORS 3、 document.domain + iframe跨域 4、 location...

    前端面试汇总(2020年)

    大纲

    1、前言

    2、前端工程化

    3、前端设计模式

    4、前端安全性问题

    5、前端跨域问题

    6、前端数据加密

    7、前端http相关问题

    8、*前端基础知识点面试题

    9、前端技术栈问题

    前言

    由于新冠肺炎疫情,现在成天呆在家里,加上也要准备面试,就在家里看面试题,看着网上一堆面试题,决定收集常见题目汇总一下。关于面试大纲,我认为每个人都是千差万别的。因为面试官都是对简历所写的项目经验进行深挖或者对你所掌握的基本技能进行考察。

    前端工程化

    1

    什么是"前端工程化"?

    前端工程化是使用软件工程的技术和方法来进行前端的开发流程、技术、工具、经验等规范化、标准化,其主要目的为了提高效率和降低成本,即提高开发过程中的开发效率,减少不必要的重复工作时间,而前端工程本质上是软件工程的一种,因此我们应该从软件工程的角度来研究前端工程。

    2

    如何做"前端工程化"?

    前端工程化就是为了让前端开发能够“自成体系”,个人认为主要应该从模块化组件化规范化自动化四个方面思考。

    前端设计模式

    前端常见的设计模式主要有以下几种,具体设计模式查看这篇文章
    1. 单例模式
    2. 工厂模式
    3. 策略模式
    4. 代理模式
    5. 观察者模式
    6. 模块模式
    7. 构造函数模式
    8. 混合模式

    前端安全性问题

    这个是老的话题,有的在初中级前端面试中可能不会提到。但是在高级面试的时候,你要说出前端安全性问题防御,及前端常见安全性问题的攻击原理是什么。

    1

    xss跨站脚本攻击原理?如何进行?防御手段?

    如何进行:如何XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

    主要原理:过于信任客户端提交的数据!

    防御手段:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。

    2

    CSRF跨站请求伪造原理?如何进行?防御手段?

    如何进行:当你在某网页登录之后,在没有关闭网页的情况下,收到别人的链接。例如:http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=1&password_conf=1&Change=Change#

    点击链接,会利用浏览器的cookie把密码改掉。

    主要原理:在没有关闭相关网页的情况下,点击其他人发来的CSRF链接,利用客户端的cookie直接向服务器发送请求。

    防御手段:

    检测Referer

    Anti-CSRF token机制

    业务上要求用户输入原始密码(简单粗暴),攻击者在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。

    3

    Sql脚本注入原理?如何进行?防御手段?  

    如何进行:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

    主要原理:通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令

    防御手段:

    使用预编译,绑定变量(推荐)。

    检查数据类型。

    过滤特殊字符和语句。

    页面不错误回显。

    4

    web上传漏洞原理?如何进行?防御手段?  

    如何进行:用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。

    主要原理:当文件上传时没有对文件的格式和上传用户做验证,导致任意用户可以上传任意文件,那么这就是一个上传漏洞。

    防御手段:

    1. 最有效的,将文件上传目录直接设置为不可执行,对于Linux而言,撤销其目录的'x'权限;实际中很多大型网站的上传应用都会放置在独立的存储上作为静态文件处理,一是方便使用缓存加速降低能耗,二是杜绝了脚本执行的可能性;
    2. 文件类型检查:强烈推荐白名单方式,结合MIME Type、后缀检查等方式;此外对于图片的处理可以使用压缩函数或resize函数,处理图片的同时破坏其包含的HTML代码;
    3. 使用随机数改写文件名和文件路径,使得用户不能轻易访问自己上传的文件;
    4. 单独设置文件服务器的域名;

    前端跨越问题

    1

    什么是跨域?  

    由浏览器同源策略限制的一类请求场景,当不同地址,不同端口,不同级别,不同协议就会构成跨域。

    2

    什么是同源策略?  

    所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

    它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。

    3

    如何解决跨域? 能说1,2,7,8就行。

    1、 通过jsonp跨域

    2、CORS

    3、 document.domain + iframe跨域

    4、 location.hash + iframe

    5、 window.name + iframe跨域

    6、 postMessage跨域

    7、 nginx代理跨域

    8、 nodejs中间件代理跨域

    9、 WebSocket协议跨域

    前端数据加密问题

    1

    一般如何处理用户敏感信息?  

    前端一般使用md5、base64加密、sha1加密,想要了解详情请自行百度。

    前端http相关问题

    1

    HTTP常用状态码及其含义?  

    1xx:指示信息--表示请求已接收,继续处理

    100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)

    101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)

    2xx:成功--表示请求已被成功接收、理解、接受

    200 OK 一切正常,对GET和POST请求的应答文档跟在后面。

    201 Created 服务器已经创建了文档,Location头给出了它的URL。

    202 Accepted 已经接受请求,但处理尚未完成。

    203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。

    204 No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。

    205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。

    206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。

    3xx:重定向--要完成请求必须进行更进一步的操作

    300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。

    301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。

    302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。

    303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。

    304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

    305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。

    307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时 才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。(HTTP 1.1新)

    4xx:客户端错误--请求有语法错误或请求无法实现

    400 Bad Request 请求出现语法错误。

    401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。

    403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。

    404 Not Found 无法找到指定位置的资源。这也是一个常用的应答。

    405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)

    406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。

    407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)

    408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)

    409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)

    410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。(HTTP 1.1新)

    411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)

    412 Precondition Failed 请求头中指定的一些前提条件失败(HTTP 1.1新)。

    413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。

    414 Request URI Too Long URI太长(HTTP 1.1新)。

    416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)

    5xx:服务器端错误--服务器未能实现合法的请求

    500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。

    501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。

    502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

    503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。

    504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)

    2

    websocket和轮询及长轮询区别  

    轮询如下:

    客户端:啦啦啦,有没有新信息(Request)服务端:没有(Response)客户端:啦啦啦,有没有新信息(Request)服务端:没有。。(Response)客户端:啦啦啦,有没有新信息(Request)服务端:你好烦啊,没有啊。。(Response)客户端:啦啦啦,有没有新消息(Request)服务端:好啦好啦,有啦给你。(Response)客户端:啦啦啦,有没有新消息(Request)服务端:。。。。。没。。。。没。。。没有(Response) ---- loop

    长轮询如下:

    客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)服务端:额。。 等待到有消息的时候。。来 给你(Response)客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request) -loop

    websocket如下:

    websocket解决了HTTP的这几个难题。 首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。

    所以上面的情景可以做如下修改。

    客户端:啦啦啦,我要建立Websocket协议,需要的服务:chat,Websocket协议版本:17(HTTP Request)服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)客户端:麻烦你有信息的时候推送给我噢。。服务端:ok,有的时候会告诉你的。服务端:balabalabalabala服务端:balabalabalabala服务端:哈哈哈哈哈啊哈哈哈哈服务端:笑死我了哈哈哈哈哈哈哈

    3

    Http和Https的区别?  

    1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

    2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

    3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

    4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    *前端基础知识点面试题

    1

    HTML/5、CSS/3相关  

    一、html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

      新特性:

      HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。
      拖拽释放(Drag and drop) API
      语义化更好的内容标签(header,nav,footer,aside,article,section)
      音频、视频API(audio,video)
      画布(Canvas) API
      地理(Geolocation) API
      本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
      sessionStorage 的数据在浏览器关闭后自动删除
      表单控件,calendar、date、time、email、url、search
      新的技术webworker, websocket, Geolocation

      移除元素:
      纯表现的元素:basefont,big,center,font, s,strike,tt,u;
      对可用性产生负面影响的元素:frame,frameset,noframes;
      h5新标签兼容:
      IE8/IE7/IE6支持通过document.createElement方法产生的标签,
      可以利用这一特性让这些浏览器支持HTML5新标签,
      当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
     
      如何区分:
      DOCTYPE声明\新增的结构元素\功能元素

    二、CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? CSS3新增伪类有那些?

      CSS 选择符:

      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 比 内联优先级高,但内联比 id 要高

      CSS3新增伪类举例:

      p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。

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

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

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

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

      :enabled :disabled 控制表单控件的禁用状态。

      :checked 单选框或复选框被选中。

    三、CSS3有哪些新特性?

    更详细的请见:https://www.cnblogs.com/qianduantuanzhang/p/7793638.html

      CSS3实现圆角(border-radius),阴影(box-shadow),

      对文字加特效(text-shadow、),线性渐变(gradient),旋转(transform)

      transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜

      增加了更多的CSS选择器 多背景 rgba

      在CSS3中唯一引入的伪元素是::selection.

      媒体查询,多栏布局

      border-image

    四、解释盒模型宽高值得计算方式,边界塌陷,负值作用,box-sizing概念? 

      1. 盒模型:IE 678 下(不添加doctype) 使用ie盒模型,宽度 = 边框 + padding + 内容宽度; chrom、IE9+、(添加doctype) 使用标准盒模型, 宽度 = 内容宽度。 
      2. box-sizing : 为了解决标准黑子和IE盒子的不同,CSS3增添了盒模型属性box-sizing,content-box(默认),border-box 让元素维持IE传统盒子模型, inherit 继承 父盒子模型; 
      3. 边界塌陷:块元素的 top 与 bottom 外边距有时会合并(塌陷)为单个外边距(合并后最大的外边距),这样的现象称之为 外边距塌陷。 
      4. 负值作用:负margin会改变浮动元素的显示位置,即使我的元素写在DOM的后面,我也能让它显示在最前面。

    五、BFC(Block Formatting Context) 是什么?应用? 

      1. BFC 就是 ‘块级格式上下文’ 的格式,创建了BFC的元素就是一个独立的盒子,不过只有BLock-level box可以参与创建BFC,它规定了内部的Bloc-level Box 如何布局,并且与这个独立盒子里的布局不受外部影响,当然它也不会影响到外面的元素。 
      2. 应用场景: 
      1. 解决margin叠加的问题 
      2. 用于布局(overflow: hidden),BFC不会与浮动盒子叠加。 
      3. 用于清除浮动,计算BFC高度。

    六、如何实现浏览器内多个标签页之间的通信?

      调用localstorge、cookies等本地存储方式

    七、简要说一下CSS的元素分类

      块级元素:div,p,h1,form,ul,li;
      行内元素 : span,a,label,input,img,strong,em;

    八、解释下浮动和它的工作原理?清除浮动的方法

      浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。

      1.使用空标签清除浮动。

      这种方法是在所有浮动标签后面添加一个空标签 定义css clear:both. 弊端就是增加了无意义标签。

      2.使用after伪对象清除浮动

     该方法只适用于非IE浏览器。具体写法可参照以下示例。使用中需注意以下几点。一、该方法中必须为需要清除浮动元素的伪对象中设置 height:0,否则该元素会比实际高出若干像素;

        #parent:after{

      content:".";

      height:0;

      visibility:hidden;

      display:block;

      clear:both;

     }

      3.设置overflow为hidden或者auto

      4.浮动外部元素

    九、CSS隐藏元素的几种方法(至少说出三种)

      Opacity:元素本身依然占据它自己的位置并对网页的布局起作用。它也将响应用户交互;
      Visibility:与 opacity 唯一不同的是它不会响应任何用户交互。此外,元素在读屏软件中也会被隐藏;
      Display:display 设为 none 任何对该元素直接打用户交互操作都不可能生效。此外,读屏软件也不会读到元素的内容。这种方式产生的效果就像元素完全不存在;
      Position:不会影响布局,能让元素保持可以操作;
      Clip-path:clip-path 属性还没有在 IE 或者 Edge 下被完全支持。如果要在你的 clip-path 中使用外部的 SVG 文件,浏览器支持度还要低;

    十、如何让一个盒子水平垂直居中

    复制代码

    复制代码

    //已知宽高<div class="div1"></div><style>
        .div1{
            width:400px;
            height:400px;
            position:absolute;
            left:50%;
            top:50% 
            margin:-200px 0 0 -200px;    }   
    </style>//未知宽高<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Document</title>    <style>
            .div1{
                position: absolute;
                left: 0;
                top: 0;
                bottom: 0;
                right: 0;
                margin: auto;
                border: 1px solid #000;
                width: 400px;
                height: 400px;        }    </style></head><body>    <div class="div1"></div></body></html>//未知宽高方法二:<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Document</title>    <style>
            .div1{
                position: absolute;
                left: 50%;
                top: 50%;
                transform: translate(-50%,-50%);
                border: 1px solid #000;
                width: 400px;
                height: 400px;        }    </style></head><body>    <div class="div1"></div></body></html>

    2

    JS部分

    1、cookie、localStorage、sessionStorage的区别和使用?

    cookie:是存储在本地的数据,有时候也用cookies,通常经过加密,应用最经典的就是判断注册用户是否已经登录过该网站。   localStorage:仅在客户端保存(即浏览器),不参与和服务器的通信;没有时间限制,即使浏览器关闭,数据依然存在;
       创建和访问localStorage:
            1)、设置数据:
            var forgetData = {phone:vm.phone};        localStorage.setItem("forgetData",JSON.Stringfy(forgetData));    //forgetData是存储在localStorage里边的本地数据;JSON.Stringfy(forgetData)是将数据转化为字符串格式;
                获取数据:
            vm.forgetData=JSON.parse(localStorage.getItem("forgetData"));  //将字符串转化为JSON化;
            2)、设置:localStorage.name = "zhao";
                 获取:localStorage.name    //zhao        localStorage.setItem(key,value);//设置数据        localStorage.getItem(key);//获取数据        localStorage.removeItem(key);//删除单个数据        localStorage.clear();//清除所有localStorage的数据
    
        sessionStorage:当用户的浏览器窗口关闭时,数据会被清除;
        
        共同点:都是保存在浏览器端,且同源的。
        区别:
            cookie数据始终在同源的http请求中携带9即使不需要),即cookie在浏览器和服务器之间来回传递;cookie数据还有路径的概念,可以限制cookie只属于某个路径下。存储大小限制也不同,cookie数据大小不能超过4K,同时因为每次http请求都会携带cookie,所以cookie只能保存很小的数据。
            sessionStorage和localStorage不会自动把数据发给服务器,只在本地保存,虽然也有大小限制,但是要比cookie大得多,可以达到5M或者更大。
            数据有效期不同,sessionStorage仅在当前浏览器窗口关闭前有效,不能持久保存;localStorage:始终有效,浏览器窗口关闭也一直保存;cookie:只在cookie设置的过期时间之前保存,即使浏览器窗口关闭。
            作用域不同,sessionStorage在不同浏览器窗口的数据不能共享,即使是同一个页面;localStorage在所有的同源窗口中都是共享的;cookie也是在同源窗口中共享的,

    2、如何实现浏览器多标签页之间的通信?

        调用localStorage、cookie本地存储方式。

    3、JavaScript的typeof返回类型有哪些?

    Object(null和Array)、number、undefined、string、Boolean、function

    4、类型转换

    强制转换:parseInt();parseFloat();number();

    5、数组的方法

    var list = [1,2,3];list.pop();//删除数组的最后一个元素 var list = [1,2];list.unshift(0,1);//头部添加  var list = [0,1,1,2,3];list.push(4,5);//尾部添加   var list = [1,2,3,4,5];var arr = list.concat(4,[5,6]);//把两个数组连接起来 //var arr = [1,2,3,4,5];  //var list = [1,2,3];list.join("-");    //1-2-3list.reverse();//3,2,1list.slice(1);//var list = [2,3];list.slice(1,2);//var list = [2];list.slice(1,-2);//设置了两个参数,终止下标为负数,当出现负数时,将负数加上数组长度的值来替换该位置的数。var arr = list.splice(0,1);//删除 var list = [2,3];  var arr = [1];可以删除任意数量的项,只需指定2个参数;要删除的第一项的位置和要删除的项数。例如splice(0,2);会删除当前数组的前两项list.splice(2,0,4,6);//插入,var list = [1,2,4,6,3]; 可以向指定位置插入任意数量的项,需要3个参数,起始位置、0(要删除的项数)、要插入的任意数量的项。例如splice(2,0,4,6);会从第二个位置插入4和6;list.splice(2,1,4,6);//替换,var list = [1,2,6,3]; 可以向指定位置插入任意数量的项,同时删除任意数量的项,需要3个参数,起始位置、要删除的项数、要插入的任意数量的项。例如splice(2,1,4,6);会从位置 2 开始插入4和6。list.sort();//按照第一个数字大小进行排序;function compare(a,b){
        return a-b;//正序;
        return b-a;//倒序;}list.sort(compare);

    6、ajax请求时get和post的区别?

    get:从服务器上获取数据,传送数据量小,安全性低,请求会被缓存,缓存是针对URL进行缓存的,get请求参数直接加在URL地址后面,一种参数组合就会产生一种URL的缓存,重复的请求结果是相同的;post:向服务器发送数据;传送数据量大,请求不会被缓存,参数封装在二进制的数据体中,服务器也不会记录参数,相对安全,所以涉及用户隐私的数据都要用post传送;

    7、ajax请求时,如何解释json数据?

    使用eval方法解析的时候,eval();不会去判断该字符串是否合法,而且json对象里的js方法也会被执行,这是非常危险的;推荐使用JSON.parse(); JSON.parse();把字符串转化成json。

    8、call和apply的区别?

    共同点:
        都可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象。
        另一种说法,都能够改变方法的执行上下文(执行环境),将一个对象的方法交给另一个对象来执行,并且是立即执行。
    不同点:
        apply();//最多只能有两个参数--新this对象和一个数组argArray,如果给该方法传递多个参数,则把参数都写进这个数组里边,当然,即使只有一个参数,也要写进数组里边。
        call();//可以接收多个参数,第一个参数apply()一样,后面则是一串参数列表。
        实际上,apply和call的功能是一样的,只是传入的参数列表的形式不同。

    9、http常用状态码?

        100  Continue  继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息    200  OK   正常返回信息    201  Created  请求成功并且服务器创建了新的资源    202  Accepted  服务器已接受请求,但尚未处理    301  Moved Permanently  请求的网页已永久移动到新位置。    302 Found  临时性重定向。    303 See Other  临时性重定向,且总是使用 GET 请求新的 URI。    304  Not Modified  自从上次请求后,请求的网页未修改过。    400 Bad Request  服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。    401 Unauthorized  请求未授权。    403 Forbidden  禁止访问。    404 Not Found  找不到如何与 URI 相匹配的资源。    500 Internal Server Error  最常见的服务器端错误。    503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。

    10.你有哪些性能优化的方法?

        (详情请看雅虎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) 图片预加载,将样式表放在顶部,将脚本放在底部  加上时间戳。

    11.深拷贝和浅拷贝

        基本类型指的是简单的数据段,引用类型指的是多个值构成的对象;    var name = "John"; // 基本类型值
    
        var obj = new Object(); 
        obj.name = "John"; 
        // obj 为引用类型值
        
        在复制变量中,对于基本类型来说,两者互不影响,    var num = 1;    var num1 = num; // num1 = 1;
    
        var num1 = 3; // num还是1,不会变
        
        浅拷贝和深拷贝的区别:
        对于浅拷贝来说,对于一个数组(数组是一个对象),只要我们修改了一个拷贝数组,原数组也会跟着改变。
        因为他们引用的是同一个地址的数据,拷贝的时候并没有给b数组创造独立的内存,只是把a数组指向数据的指针拷贝给了b;
        而深拷贝就与其相反,将会给b数组创造独立的内存,并且将a数组的内容一一拷贝进来,两者互不影响。
        
        实现深拷贝:
        一:层级拷贝,用递归实现;
        二:JSON解析        var b = JSON.parse(JSON.stringify(a));        

    3

    其他  

    一、怎么让Chrome支持小于12px 的文字?

    这个我们在做移动端的时候,设计师图片上的文字假如是10px,我们实现在网页上之后。往往设计师回来找我们,这个字体能小一些吗?我设计的是10px?为啥是12px?其实我们都知道,谷歌Chrome最小字体是12px,不管你设置成8px还是10px,在浏览器中只会显示12px,那么如何解决这个坑爹的问题呢?

    我们的做法是:

    针对谷歌浏览器内核,加webkit前缀,用transform:scale()这个属性进行缩放!

    <style>pspan{font-size:10px;-webkit-transform:scale(0.8);display:block;}</style><p><span>haorooms博客测试10px</span></p>

    二、IOS手机浏览器字体齿轮

    修改-webkit-font-smoothing属性,结果是:-webkit-font-smoothing:none:无抗锯齿-webkit-font-smoothing: antialiased | subpixel-antialiased |default:灰度平滑

    三、如何修改chrome记住密码后自动填充表单的黄色背景?

    大体可以通过input : -webkit-autofill来进行修改!

    input:-webkit-autofill {background-color:#FAFFBD;background-image: none;color:#000;}

    四、谷歌浏览器运行下面代码,并解释!

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

    运行上面代码之后,会发现HTML层都被使用不同的颜色添加了一个高亮的边框。为什么会这样呢?

    首先我们来看

    [].forEach.call(),关于call()和apply(),我前面有文章也写过,具体可以看http://www.haorooms.com/post/js_constructor_pro

    [].forEach.call()等价于Array.prototype.forEach.call()

    其次我们来看$$("*")

    你可以在你的Chrome浏览器控制台中输入$$('a'),然后你就能得到一个当前页面中所有锚元素的列表。

    $$函数是许多现代浏览器命令行API中的一个部分,它等价于document.querySelectorAll,你可以将一个CSS选择器作为这个函数的参数,然后你就能够获得当前页面中所有匹配这个CSS选择器的元素列表。如果你在浏览器控制台以外的地方,你可以使用document.querySelectorAll('')来代替$$('')

    为元素添加颜色

    为了让元素都有一个漂亮的边框,我们在上面的代码中使用了CSS属性outline。outline属性位于CSS盒模型之外,因此它并不影响元素的属性或者元素在布局中的位置,这对于我们来说非常有用。这个属性和修改border属性非常类似,因此下面的代码应该不会很难理解:

    a.style.outline="1px solid #"+ color

    真正有趣的地方在于定义颜色部分:

    (~~(Math.random()*(1<<24))).toString(16)

    ~~的作用相当于parseInt,和我前面讲解的“|”功能类似,关于运算符“I” ,可以去看看!

    通过上面代码可以获取到一个随机的颜色值!

    五、input [type=search] 搜索框右侧小图标如何美化?

    美化效果如下图:

    enter image description here

    右侧默认的比较难看的按钮,美化成右侧效果。

    input[type="search"]::-webkit-search-cancel-button{-webkit-appearance: none;height:15px;width:15px;border-radius:8px;background:url("images/searchicon.png")no-repeat 00;background-size:15px15px;}

    用到的是伪元素::-webkit-search-cancel-button,关于什么是伪类和为元素,请看:http://www.haorooms.com/post/css_wl_wys

    六、iOS safari 如何阻止“橡皮筋效果”?

    可以参考一下知乎上的回答 https://www.zhihu.com/question/22256539 。

    但是,我们遇到的问题不是这样,我是要解决弹跳导致弹出层(position:absolute)的覆盖层高度小于100%;

    针对这个问题,我想到的解决方案如下:

    方法一: 把position:absolute改成position:fixed,并在弹出层之后,设置body的高度是100%;overflow是hidden。

    方法二:

    思路是获取苹果浏览器导航栏的高度。然后滚动的时候,重新获取其高度。在导航栏高度变小的时候,给弹出层增加高度的百分比!

    代码如下:

    //ios safari 伸缩判断var topbarHeight=window.outerHeight-window.innerHeight,agent=navigator.userAgent,globleflag=true;
            $(window).scroll(function(){if(agent.indexOf("iPhone")!=-1|| agent.indexOf("iPad")!=-1){var topbarHeightNow=window.outerHeight-window.innerHeight;if(topbarHeightNow<topbarHeight){
                        globleflag=false//此处写处理逻辑}else{
                     globleflag=true//此处写处理逻辑}}});

    七、实现点击文字,文字后面radio选中效果

    这个效果是前端很经常用到和遇到的效果了,实现这个效果的方式也很多,很多朋友用js和jquery来实现,但是最简单的,我们可以直接用lable标签的 for 属性来实现。

    看下下面例子:

    <form><labelfor="male">Male</label><inputtype="radio"name="sex"id="male"/><br/><labelfor="female">Female</label><inputtype="radio"name="sex"id="female"/></form>

    label 的for属性后面跟着input的id,就可以点击label,来触发input效果了,大家可以试一试!

    八、网站中,图片文件(jpg,png,gif),如何点击下载?而非点击预览?

    我们平时在网站中的图片,假如我们要下载,如下写:

    <ahref="haorooms博客.jpg">下载</a>

    我们点击下载按钮,只会预览“haorooms博客.jpg”这张图片,并不会出现下载框,另存为那种?那么我们如何做呢?

    我们只需要如下写

    <ahref="haorooms博客.jpg"download>下载</a>

    就可以下载了。点击如下进行尝试吧!下载

    不但如次,我们还可以指定文件名称,如下写法:

    <ahref="haorooms博客.jpg"download="haoroom前端博客图片下载">下载</a>

    测试如下:下载

    上面就是指定下载的写法!

    九、Math.min()比Math.max()大

    Math.min()<Math.max()// falseMath.min()>Math.max()// true

    因为Math.min() 返回 Infinity, 而 Math.max()返回 -Infinity。

    前端技术栈问题

    1

    vue相关问题?  

    更多前端技能请关注公众号”极致简文“

    往期精彩回顾

    React组件与生命周期

    React函数组件和Class组件以及Hooks

    2020年最火爆的Vue.js面试题

    Redux使用之我要买个女朋友(入门篇)

    关注公众号,精彩不间断

    展开全文
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    列举浏览器对象模型BOM里常用的至少4个对象,并列举window对象的常用方法至少5个 72 简述列举文档对象模型DOM里document的常用的查找访问节点的方法并做简单说明 72 希望获取到页面中所有的checkbox怎么做?(不...

    前端面试题汇总

    一、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. 测试开发笔记

      万次阅读 多人点赞 2019-11-14 17:11:58
      内部测试 测试阶段 测试对象 测试方法 测试目的 经济价值 优点 缺点 必要性 资源 系统测试 system testing(ST) 整个系统 (整个产品) 黑盒测试 验证产品是否符合需求规格说明书 能够保证产品以较高的的质量尽早的...

      测试开发笔记

      第一章 测试基础
      1.什么是软件测试
      2.软件测试的目的、意义(怎么做好软件测试)
      3.软件生命周期
      第二章 测试过程
      1.测试模型
      H模型
      V模型
      2.内部测试
      3外部测试
      验收测试(在系统测试之后)
      回归测试
      4.测试过程(干什么,怎么干)
      5.各阶段输入、输出标准以及入口、出口准则:(测试阶段过程要素)
      第三章 测试方法
      1.测试方法对比
      2.测试方法组合
      第四章 软件质量
      1.什么是软件质量
      2.质量要素
      3. 6大特性27个子特性ISO国际标准组织CMM/CMMI(Capability maturity model)能力程度度模型
      4.CMMI把企业分为5个等级
      5. CMM与CMMI的区别
      第五章 SQL
      约束
      1主键约束
      2 非空约束 not null
      3 外键约束 FOREIGN KEY
      4 默认约束
      5 检查约束 check
      6 唯一约束 unique
      SQL语句
      创建数据库.
      表、字段、类型
      查询
      批量处理
      视图/虚表 view
      索引
      存储过程 procedure
      事务 transaction
      触发器 trigger
      练习
      一、单表查询练习
      二、聚合函数练习
      三、分组查询练习
      四、嵌套查询练习
      五、联接查询练习
      六、外联接查询
      七、补充提高
      第六章 C语言
      C语言中的存储
      数据类型
      常量
      结构体
      条件/分支逻辑
      Switch
      If
      循环
      For
      while
      do…while
      函数
      第七章 Windows环境搭建
      一、名词注解与定义:
      C/S
      B/S
      进销存系统
      OA系统
      第八章 需求管理
      1.什么是需求
      2. 需求工程在做什么
      3. ★需求变更
      4.★需求的跟踪
      需求跟踪矩阵的作用
      需求的特点
      需求工程
      变更控制流程图
      第九章 缺陷管理
      缺陷相关概念
      缺陷管理相关概念
      BUG管理基本流程
      BUG单
      第十章 测试需求分析
      概念
      ★如何做测试需求分析
      ★UML统一建模语言(Unified Modeling Language)
      第十一章 配置管理
      1.什么是配置管理
      2.配置管理流程
      配置管理工具
      SVN操作过程手册
      一、 如何创建“project”项目版本库
      二、 如何查看创建的“project”项目版本库
      三、 在版本浏览器里面,创建文件,并进行检出
      四、 如何对该项目入基线
      五、 分支文件进行合并
      六、 分支冲突的解决
      第十二章 系统测试
      概念:
      分类:
      功能测试(Function testing中国 Feature testing国际)
      性能测试(Sercarity testing)
      安全性测试(Security Testing)
      安装测试
      GUI测试(Graphical user interface)
      可用性测试(Usability testing)
      异常性测试
      文档测试
      备份测试
      配置测试
      网络测试
      第十三章 用例设计
      等价类
      练习
      1.1年龄注册
      1.2.年龄注册
      1.3.扩充
      边界值
      2.1.年龄
      2.2.用户名注册
      2.3.变量命名
      2.4.进销存价格
      2.5.Windows文件命名
      总结
      边界值
      第十四章 系统测试执行
      测试环境搭建文档
      用例执行
      填BUG报告
      第十五章 QC(Quality Center)
      QC后台:
      QC前台:
      Requirements 需求模块
      Test Plan 测试用例模块
      Test Lab 测试执行模块
      第十六章 PYTHON
      Python的安装
      Python的集成环境
      数据类型
      运算符
      缩进
      控制语句
      IF条件
      WHILE循环
      FOR循环
      BREAK \ CONTINUE
      函数
      定义
      调用
      第十七章 单元测试
      单元测试概念
      单元测试静态测试
      单元测试动态测试
      测试评价准则
      逻辑覆盖率
      单元测试策略
      ⑴ 孤立测试
      ⑵自顶向下的单元测试策略
      ⑶自底向上的单元测试方法
      单元测试用例设计(基本路径覆盖法)
      程序控制流图
      单元测试执行
      单元测试框架
      第十八章 集成测试
      第一阶段总结
      Test platform
      Bug的其他说法
      第二阶段项目笔记
      一.建立项目JXC
      二.布置JXC
      三.配置SVN
      四.访问SVN
      进销存项目
      进销存项目总结
      测试需求分析
      1、定义测试范围
      2、建立需求项
      3、细化需求项
      4、需求覆盖率分析
      判定表
      3.1.读书选择
      3.2.Counter
      3.3:word中的判定表举例
      3.4.合并判定表
      3.4.密码修改
      3.5.进销存
      3.6.总结
      因果图
      4.1.字母判定
      4.2.自动售货机
      状态迁移
      5.1.飞机售票系统
      5.2.缺陷跟踪
      流程分析
      6.1.处理流程
      6.2.系统登录
      6.3.字母判断
      6.4.组合查询
      正交试验
      7.1.环境搭建
      7.2.Counter
      7.3.组合
      7.4.环境搭建
      其他
      输入域
      输出域
      异常分析
      错误猜测

      第一阶段
      第一章 测试基础
      1.什么是软件测试:
      两个依据(需求、测试用例),两个方法(手工、自动),一个对比(预期结果和实际结果的对比)
      2.软件测试的目的、意义:(怎么做好软件测试)
      初期: 尽量多的发现缺陷生成相关规范
      中期: 尽量早的发现缺陷
      后期: 尽量预防问题:通过以往的经验积累
      控制成本(贯穿始终)尽量少的时间和人力发现更多的缺陷
      3.软件生命周期:软件的产生直到报废或停止使用的生命周期。软件生命周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,也有将以上阶段的活动组合在内的迭代阶段,即迭代作为生命周期的阶段。

      如何尽量多的发现缺陷?
      沟通
      在测试前期与开发沟通 确认测试重点 确认测试的优先级
      了解开发人员技术和业务背景 业务水平 技术水平 代码质量 人员流动性
      在测试结束后
      对已发现的bug进行统计 知道高发概率bug 在新项目中要进行重点测试
      针对代码 代码复杂度
      版本管理
      针对基础测试基础版本要进行充分的测试
      验收前的最后一个版本一定要进行完全重复测试
      测试方法
      黑盒方法 功能问题 无法保证所有的代码逻辑都被执行到 用白盒测试思想补充黑盒测试
      静态测试方法 文档评审 代码走查
      测试过程
      上一阶段为下个阶段提供重点指导
      用户参与的测试或用户反映回来的错误和问题为下次测试的或测试补充的必备内容

      第二章 测试过程
      1.测试模型
      H模型:

      H模型图
      优点:
      1 介入早 与开发并行 更早的发现问题
      2 测试过程独立于开发过程 更客观 更主动
      V模型

      双V模型图
      ㈠需求阶段
      产品经理,项目经理,产品工程师写《需求规格说明书》Software Reqwirment Specaficalion(SRS)
      内容:需求项(业务,主要功能)需求子项,对子项的详细描述
      测试的工作:对需求进行测试和评审A系统测试计划《系统测试计划书》B系统测试计划《系统测试方案书》C系统测试实现《系统测试用例》
      ㈡设计阶段
      开发经理,架构师,开发工程师写出《概要设计说明书》High-level design(HLD)
      内容:系统程序中的模块,子模块和他们之间的关系和接口
      测试的工作:对HLD进行测试和评审A集成测试计划《集成测试计划书》B集成测试设计《集成测试方案书》C集成测试实现《集成测试用例》
      ㈢详细设计阶段
      开发工程师,架构师,写出《详细设计说明书》Low-level desragn(LLD)
      内容:函数 代码 逻辑
      测试工作:对LLD进行测试和评审A单元测试计划《单元测试计划书》B单元测试设计《单元测试方案书》C《单元测试用例》
      ㈣编码阶段
      开发工程师写代码
      优点:介入早,提高测试质量; 分成三个阶段,发现问题更有针对性;测试与开发并行,更好的利用项目资源。
      缺点:项目成本高;技术要求高,对人员要求高;并行工作中,一方未完成就会对整个造成延误。
      适用范围:规模大、软件成熟度高的项目。
      2.内部测试
      测试阶段 测试对象 测试方法 测试目的 经济价值 优点 缺点 必要性 资源
      系统测试
      system testing(ST) 整个系统
      (整个产品) 黑盒测试 验证产品是否符合需求规格说明书 能够保证产品以较高的的质量尽早的上市销售,从而使公司获取利润 1简单
      2技术要求低 1测试介入时间晚,修改成本高
      2有一些问题可能被遗留不会被修改 必须保证 1对被测产品
      2需求规格说明书
      3系统测试工程师
      4需求开发人员
      集成测试
      integration testing(IT) 模块
      子模块
      接口 灰盒测试 验证模块、子模块、接口是否符合
      概要设计说明书 能够帮助更准确的 定位缺陷的所在,从而降低了定位缺陷的成本 定位准确快速 1接口测试有技术要求,技术实现难度大
      2接口太多,数量庞大,做所有接口的集成测试成本高 不是必须做的,
      必须做测试的
      1公共的主要模块
      2核心模块
      3和外界软件接口模块 1被测的产品
      2概要设计说明书
      3集成测试工程师
      4概要设计人员
      单元测试
      unit testing(UT) 函数
      代码
      逻辑 白盒测试 验证函数代码逻辑是否符合详细设计说明书 能够最早的开展测试工作,降低修复成本,防止缺钱被扩大化(注意:加以重视:1公共的模块2全局性的数据结构3重要的使用频率较高的功能4以往项目经常出错的严重问题5复杂度较高的模块6当开发人员业务不熟悉编码不熟练的模块要进行单元测试) 介入时间早,发现问题早,修改成本低。 1技术难度高
      2工作量太大 不是必须的 1开发环境
      2LLD
      3单元测试工程师
      4架构师(详细设计人员)
      3外部测试:
      使用验收测试的原因
      1内部测试只能模拟用户使用却不能代替用户使用
      2由于专业不同业务背景不同无法模拟用户使用的习惯
      3测试人员和用户对产品的理解可能不同
      验收测试:(在系统测试之后)
      α测试:由用户组织一部分人在开发环境下来对产品进行测试 如网游的内侧
      β测试:所有系统使用者都可以参加的测试(在实际使用环境下) 如网游的公测
      分类 测试过程 参与人员 目的 过程主要内容
      针对项目类软件 验收测试 开发人员:提供满足验收要求的软件或系统,或用户需要的相关开发文档
      测试人员:
      1、搭建验收测试环境
      2、准备验收测试用例
      3、准备用户需要的相关测试文档
      4、组织人员进行验收演示
      用户代表:对系统进行一定的试用
      客户代表:签字确认验收是否通过
      行业:负责在验收过程中提出问题并协助用户和客户检查系统是否满足需求 1、检查软件的功能是否与用户最初需求相一致
      2、是客户回款的标志 1、进行验收前准备
      A、准备相关的资料
      B、搭建验收测试环境
      C、指定相关的验收参与人
      2、进行验收演示
      A 、对产品使用进行演示
      B、回答专家、用户的提问
      3、签署验收报告
      针对产品类软件 α测试 开发人员:
      1、提供可以进行α测试的软件
      2、负责修改用户代表发现的问题
      测试人员:
      1、检查或协助用户填写缺陷报告
      2、向用户学习相关的使用关注点
      邀请的用户或客户代表(付费)
      1、按照自己的操作习惯使用软件,提出易用性等方面的问题和改进建议 明确用户的使用体验,提高产品的适用范围和使用质量标准 1、明确进行α测试的版本
      2、邀请潜在用户进行使用体验
      3、针对用户提出的问题进行修复或改进
      β测试 潜在用户:
      1、安装软件并使用
      客服人员:
      记录并反馈用户的问题 提前占领市场 1、发布一个下载地址
      2、用户进行软件下载并使用
      回归测试:
      回归测试可以发生在任何一个阶段
      分为完全回归和选择回归
      回归范围 回归分类 特点 优点 缺点 适用范围
      完全回归 完全重复法 每次回归测试都要执行全部测试用例 回归测试充分,覆盖面广,不容遗漏 工作量大,时间长,成本高 时间充裕且测试资源较充分时,第一次和最后一次做回归测试的时候用这种方法
      选择性回归 覆盖修改法 每次回归测试时只执行发现错误的用例 时间最短,成本最低,简单效率高 回归测试不充分,漏洞较多 时间较紧且人力资源不足时,中间版本的测试轮次可以使用,关联度比较小的模块和功能
      周边影响法 每次回归除了执行发现bug的用例外,还要执行与其相关的用例 在考虑了测试成本的基础上有效提高了回归测试的质量 效率 很难确定影响的周边范围,相关用例定位较困难 适合于全局数据结构被修改或公共模块被修改,或核心算法业务被修改时,公用的模块,关系、关联复杂的模块
      指标达成法 每次回归测试达到规定的语气指标
      就可以停止测试了 所有的测试都可度量 1指标生成需要很长的周期,
      很多的项目区累计经验
      2要有比较稳定的团队这个指标才有意义 成熟度较高的测试团队应用于指标达成法
      (适用度很低,很少有公司使用)

      分类 步骤 优点
      确定周边
      范围的方法 界面检查法 1明确被修改的功能 简单
      2修改功能的上下游功能
      3调用修改功能的功能和
      修改功能调用了的功能
      4和修改功能游相同输入输出的功能
      5在测试中执行上诉关联的用例
      代码检查法 1明确被修改的函数和代码 准确,全面
      2在整个系统中检查所有
      调用了修改函数的函数
      3明确上诉所有函数对应的界面
      4测试上诉界面测试用例
      4.测试过程(干什么,怎么干)
      整个系统的内容 需求项(业务、主要功能) 需求项 测试计划 测试需求项 系统测试阶段
      需求子项 测试方案 测试需求子项
      详细内容 测试用例 具体如何进行测试
      整个系统的集成 概要设计 概要设计项 测试计划 集成测试阶段
      概要设计子项 测试方案
      具体内容 测试用例
      整个系统最小单元 详细设计 函数 测试计划 单元测试
      逻辑 测试方案
      代码 测试用例

      5.各阶段输入、输出标准以及入口、出口准则:(测试阶段过程要素)
      系统测试 入口准则 输入文档 输出文档 出口准则
      系统测试计划 开发计划通过评审并入基线
      需求规格说明书通过评审并入基线 开发计划书
      需求规格说明书 系统测试计划书 系统测试计划书通过评审并入基线
      系统测试设计 系统测试计划书通过评审并入基线 需求规格说明书
      开发计划书
      系统测试计划书 系统测试方案书 系统测试方案书通过评审并入基线
      系统测试实现 系统测试方案书通过评审并入基线 需求规格说明书
      系统测试计划书
      系统测试方案书 系统测试用例
      预测试项 系统测试用例、预测试项通过评审并入基线
      系统测试执行 系统测试用例、预测试项通过评审并入基线
      集成测试报告通过评审并入基线 需求规格说明书
      系统测试计划书
      系统测试方案书
      系统测试用例
      预测试项 缺陷报告
      预测试项报告
      系统测试报告 系统测试报告、预测试项报告、缺陷报告通过评审并入基线
      集成测试 入口准则 输入文档 输出文档 出口准则
      集成测试计划 概要设计说明书通过评审并入基线 概要设计说明书 集成测试计划书 集成测试计划书通过评审并入基线
      集成测试设计 集成测试计划书通过评审并入基线 集成测试计划书
      概要设计说明书 集成测试方案书 集成测试方案书通过评审并入基线
      集成测试实现 集成测试方案书通过评审并入基线 集成测试计划书
      集成测试方案书
      概要设计说明书 集成测试用例 集成测试用例通过评审并入基线
      集成测试执行 集成测试用例通过评审并入基线
      单元测试报告通过评审并入基线 集成测试计划书
      集成测试方案书
      集成测试用例
      概要设计说明书 集成测试报告
      缺陷报告 集成测试报告、缺陷报告通过评审并入基线
      单元测试 入口准则 输入文档 输出文档 出口准则
      单元测试计划 详细设计说明书通过评审并入基线 详细设计说明书 单元测试计划 单元测试计划通过评审并入基线
      单元测试设计 单元测试计划通过评审并入基线 详细设计说明书
      单元测试计划书 单元测试方案书 单元测试方案书通过评审并入基线
      单元测试实现 单元测试方案书通过评审并入基线 详细设计说明书
      单元测试计划书
      单元测试方案书 单元测试用例 单元测试用例通过评审并入基线
      单元测试执行 单元测试用例通过评审并入基线 详细设计说明书
      单元测试计划书
      单元测试方案书
      单元测试用例 单元测试报告
      缺陷报告 单元测试报告、缺陷报告通过评审并入基线

      第三章 测试方法
      测试方法对比
      分类方法 测试方法名称 依据 测试对象 理论上的测试目的 实际工作中的测试目的 测试评估标准 测试环境 测试工作介入点 优点 缺点 适用范围
      按照不同的测试对象划分(黑白灰盒的区别) 黑盒 SRS 整个软件产品 检查软件的功能实现是否与SRS相一致 尽早进行验收,收回开发成本 需求覆盖率 尽量与用户环境相一致 只要功能可以进行操作 简单,测试效率高 1、无法保证所有的代码逻辑都被测试到
      2、后台相关的非界面处理可能会遗漏(文件、数据库)
      3、当前功能与其他功能有联系的部分可能也会被遗漏 适合进行功能、性能等使用和外部特性的测试适用范围广泛,适用所有可见功能
      白盒 LLD 代码逻辑函数 检查代码的逻辑实现是否与LLD相一致 尽早发现问题缺陷,降低缺陷修复成本.便于定位问题 逻辑覆盖率
      语句覆盖
      分支覆盖
      条件覆盖
      分支-条件覆盖
      路径覆盖 开发环境 只要独立的函数或类代码编写完成后 覆盖充分,可以覆盖到每行代码 技术较难
      效率较低
      成本较高 针对核心业务、复杂算法、公共模块、全局数据结构、新增功能
      灰盒 HLD 模块\子模块接口 检查接口实现是否与HLD相一致 逐步集成,降低缺陷定位成本 接口覆盖率 子系统集成尽可能和用户环境一致,模块内部接口以及模块间接口可以在开发环境下进行
      子系统间的接口最后要在与用户环境下测试 进行测试的接口模块已完成 可以提早定位和发现问题 技术最难
      成本最高 公共模块之间的调用,复杂度较高的模块调用、使用频率较高的模块调用

      特点 分类 优点 缺点 适用范围
      按照是否运行程序划分 静态 不执行程序 1、文档评审
      A、正规检视
      B、技术评审
      C、同行评审
      2、静态分析技术
      A、控制流分析
      可以发现以下缺陷
      1、死循环
      2、执行不到的语句
      3、不存在的语句
      B、数据流分析
      可以发现以下缺陷
      1、变量未定义被使用
      2、变量已定义未使用
      C、信息流分析
      可以帮助开发人员定位缺陷
      1、输入变量与语句的关系
      2、输出变量与语句的关系
      3、输入变量与输出变量的关系 较动态测试时间早,不用写代码 工作量大 重要的功能模块、核心的业务、算法
      公共模块
      动态 执行程序 黑和测试
      动态白盒:插装—在代码中加入print打印语句,检查程序的中间运行结果 复杂,效率高 测试较晚,写代码 所有功能

      优点 缺点 适用范围
      按照不同的测试手段划分 手工 能够主动的发现bug 重复工作量大,容易引入疲劳缺陷,只能依靠见到的界面 绝大多数的场合
      自动化 可以无限制不断重复,把人从劳动里解放出来,提高劳动效率,提高了测试质量,能发现人不能发现的错误 无法发现脚本中未写明的缺陷 GUI界面稳定
      回归阶段
      需求稳定且功能已实现时才进行脚本的编写
      性能测试工具:提取相关的系统数据,构造并发用户
      测试方法组合
      测试方法组合 典型案例 使用时机 特点
      黑盒
      黑盒静态手工      
      黑盒静态自动化      
      黑盒动态手工      
      黑盒动态自动化功能测试 Mercury的QTP:用于检测应用程序是否能够达到预期的功能及正常运行
      通过自动录制、检测和回放用户的应用操作 1、能够有效地帮助测试人员对复杂的企业级应用的不同发布版进行测试
      2、提高测试人员的工作效率和质量,确保跨平台的、复杂的企业级应用无故障发布及长期稳定运行
      IBM Rational Robot 是功能测试工具 它集成在测试人员的桌面 IBM Rational TestManager 上,在这里测试人员可以计划、组织、执行、管理和报告所有测试活动,包括手动测试报告。这种测试和管理的双重功能是自动化测试的理想开始。
      Borland SilkTest属于软件功能测试工具 是Borland公司所提出软件质量管理解决方案的套件之一。这个工具采用精灵设定与自动化执行测试,无论是程序设计新手或资深的专家都能快速建立功能测试,并分析功能错误。
      基于Java语言的功能和性能测试工具 JMeter是Apache组织的开放源代码项目 主要针对Java语言 它是功能和性能测试的工具,100%的用java实现
      黑盒动态自动化性能测试 Mercury的LoadRunner:是一种预测系统行为和性能的负载测试工具。 通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题 能够对整个企业架构进行测试。通过使用LoadRunner ,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。
      Microsoft Web Application Stress Tool 是由微软的网站测试人员所开发,专门用来进行实际网站压力测试的一套工具。 功能强大的压力测试工具 您可以使用少量的Client端计算机仿真大量用户上线对网站服务所可能造成的影响
      webload是RadView公司推出的一个性能测试和分析工具 它让web应用程序开发者自动执行压力测试; webload通过模拟真实用户的操作,生成压力负载来测试web的性能。
      白盒
      白盒静态手工      
      白盒静态自动化   检查语法规范、语法逻辑  
      白盒动态手工 目前的最流行的单元测试工具是xUnit系列框架 常用的根据语言不同分为JUnit(java),CppUnit(C++),DUnit(Delphi ),NUnit(.net),PhpUnit(Php )等等。 该测试框架的第一个和最杰出的应用就是由Erich Gamma (《设计模式》的作者)和Kent Beck(XP(Extreme Programming)的创始人 )提供的开放源代码的JUnit。
      白盒动态自动化 Jtest是parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性。parasoft同时出品的还有C++ test,是一款C/C++白盒测试工具    
      灰盒
      灰盒静态手工      
      灰盒静态自动化      
      灰盒动态手工      
      灰盒动态自动化 BMC的APPSight 系统会将问题发生的相关信息完整录制下来,包括问题发生的现场场景、信息及分析等,从而快速切入到问题根源  
      测试管理工具 是业界第一个基于Web的测试管理系统,它可以在您公司内部或外部进行全球范围内测试的管理。通过在一个整体的应用系统中集成了测试管理的各个部分,包括需求管理,测试计划,测试执行以及错误跟踪等功能,TestDirector极大地加速了测试过程。

      1自动化测试就是用程序驱动程序的测试
      2黑白灰测试的区别
      测试的对象不一样,对于代码实现逻辑程度不一样(黑盒不需要了解代码实现,白盒需要完全了解代码实现,灰盒需要部分了解代码实现)
      3静态与动态测试的区别
      被测程序执行与否 静态不执行程序包括文档评审静态分析技术代码走读,动态包括黑盒测试和动态分析技术
      4自动化合手工测试的不同
      测试手段不同

      第四章 软件质量
      1.什么是软件质量
      质量:确定一个实体的特性满足需求的程度
      内部质量:软件研发过程中,评价的软件质量
      外部质量:软件上市后,用户评价的质量
      过程质量:评价软件研发中每个过程的质量
      软件质量的三个层次
      ⑴流程质量,领导关注 ⑵产品质量 测试工程师关注 ⑶使用质量 用户关注
      2.质量要素
      质量铁三角 : 技术 过程 组织
      3. 6大特性27个子特性ISO国际标准组织CMM/CMMI(Capability maturity model)能力程度度模型

      质量模型列表
      质量模型特性 子特性 特点 常见测试点 案例说明
      功能性 适合性 合适的功能(用户提出要有哪些功能)功能的必要性 验证功能是否满足需求的要求,检测做没做 打电话、听音乐、发信息
      准确性 正确的功能 需求文档中的预期动作和预期输出,做对没有 信息的发送内容是否正确
      互操作性 和其他软件的互相操作 第三方软件的交互 word文档对打印机驱动程序的操作
      保密安全性 保护信息和数据 保护得到授权的人或者系统能正常访问相关的信息或数据 1、登录的用户名和密码
      2、权限使用
      3、防止DOS攻击(拒绝访问攻击)4、系统数据的保护和加密,如密码的加密
      5、传输加密,如密码的网络传输
      6、防病毒
      7、放溢出,如char与varchar的字符数
      保证未授权的人或系统无法看到相关的信息或数据
      功能性的依从性 遵循功能性相关的标准、约定或法规 是否符合国家法律规定 如色情网站
      可靠性 成熟性 缺陷尽可能的少    
      容错性 提前考察的异常情况出错问题 整个系统的外部接口 如word打印时,打印机死机出现报错,但不影响word的使用
      易恢复性 失效后恢复原有功能、性能 系统的性能测试 如网游延迟卡死现象。系统提示内存不足。银行系统的心跳监听。灾难备份。
      可靠性的依从性 法律法规   灾难备份。
      易用性(CUI测试) 易理解性 (快速理解) 系统交互的信息是否准确、清晰、易懂,指导下一步操作。 系统提示信息是否准确 如网银密码超出位数报错
      易学性 (快速上手) 易用好学 是否有说明书、是否在线帮助、是否有提示信息 msn的帮助手册
      易操作性 (快速做完) 方便快速使用 操作的直观程度,操作步骤、操作动作多少与时间长短 鼠标、gui层数、安装过程
      易测试性 软件可控 提供工具给测试工程师,可以控制系统运行,以达到测试目的 windows的性能工具与服务管理工具
      软件可观察 通过辅助手段可  
      吸引性 外观 外观  
      易用性的依从性 法律法规    
      可移植性 适应性 (跨平台、跨语言) 软件产品无需采用有别于为考虑该软件的目的而准备的活动或手段就可能适应不同的指定环境的能力;是否适应其他系统环境 软件、硬件、外设、数据库 微软与苹果的前期竞争。主板与CPU
      易安装性 在指定环境中是否易于安装 主流平台和系统100%测试用例,非主流10% flash安装
      共存性 不同的其他系统能共同运行 1、功能是否能正常运行满足要求
      2、系统性能能满足要求 是否会抢占资源。迅雷和pplive抢占资源。杀毒软件,瑞星和金山不能共存
      易替换性 替代为其他相同功能的产品的能力 升级过后的系统是否会造成系统崩溃 软件升级补丁升级
      可移植性的依从性 法律法规    
      效率-性能 时间效率 规定条件下,软件产品执行其功能时,提供适当的响应和处理时间以及吞吐率的能力 系统的反应时间 提款机取款时间的快慢
      资源效率 在规定条件下,软件产品执行其功能时,使用合适的资源数量和类别的能力 做一件事所占用的系统资源 电器所消耗的电能多少
      效率依从性 法律法规    
      维护性-维护的难易程度与成本 易分析性 软件产品诊断软件中的缺陷或失效原因或识别待修改部分的能力 辅助工具或者日志文件或者常用问题帮助手册 qq异常退出的帮助文件
      易改变性 代码容易被修复或修改 高内聚,低耦合  
      稳定性 软件产品避免由于软件修改而造成意外结果的能力 长期的监控一个系统的运行情况和系统的资源情况 淘宝的系统监控
      维护性的依从性 法律法规

      配置管理
      配置工具 有的话 用的工具叫什么名字
      安装------B/S(浏览器)(check in /check out:原理) C/S(客户端)

      4.CMMI把企业分为5个等级

      5.CMM与CMMI的区别
      cmmi:是不同cmm的集成,集成并发扬cmm的优点,并借鉴其他模型的优点融入新理论和实际研究成果,不仅能应用于软件领域,而且能应用于系统过程和其他过程领域,Cmmi和cmm最大不同: Cmmi1.1版本包含4个成分:系统工程(SE)、软件工程(SW)、应用集成产品和过程开发(IPPD)、供应商外包管理(SS) Cmmi有2种表示方法: 阶段式 连续式

      第五章 SQL
      数据库的价值目标:
      数据库的技术(不只是界面 还要知道数据库逻辑 1.要对数据库的设计理解 2.还有数据库对象的关系3.数据库的常见命令)
      常见数据库:MySQL Access(单机) MS-SQL(交互好) Oracle Sybase DB2
      MySQL 小巧 效率高 免费
      后三种Oracle Sybase DB2是大型收费,数据安全和备份好
      数据库作用:组织、存储、处理
      关系型数据库
      第一日:
      关系型数据库
      数据库的作用

      索引
      视图
      存储过程
      触发器
      事务 对象 优缺点 使用范围
      SQL Server具体操作
      建库
      建表
      备份 恢复 操作手册: 建库 建表 备份 恢复
      第二日:
      查询命令
      单表查询
      多表查询
      查询 统计功能测试点
      第三日:
      新增功能 新增功能测试点
      更新命令 修改功能测试点
      删除命令 删除功能测试点
      补:
      存储过程 学会构造大量测试数据
      触发器 了解 看懂 如何测试

      RDBMS 关系型数据库
      SQL Structured Query Language 结构化查询语言
      C/S Client/Server 客户 服务器
      B/S Browser/Server 浏览器 服务器
      第一天:
      文件类型:文件存储位置改变 程序代码更新 对大量数据量处理不恰当
      数据库的意义”
      1数据的重用(硬盘)
      2检索速度要提高(分类存储)
      3把数据与代码的耦合度降低(数据存放位置与代码无关)
      数据库管理系统 SQLServer
      Oracle
      MySQL
      DB2
      数据库的表结构
      1.数据分类
      2.数据关联
      数据库设计评审点
      1.数据存储是否有重复现象 不同表中是否存在相同字段(该字段既不是主键也不是外键)
      2.是否符合范式要求 同一个表中存在数据重复字段不要超过两个以上 可以保证冗余数据很少
      可以考虑有适当冗余
      3.对于业务有频繁查询要求的数据表
      4.表间关系是否正确 是否按照业务要求进行了数据关联
      5.数据库字段以及表的设计是否充分 数据字段内容是否涵盖需求要求的所有数据
      数据字段类型 及长度是否符合需求

      表 基本组成单元 有记录和 字段组成
      表中每一条数据
      存储数据
      数据分类
      字段位置变化 不影响程序
      索引 建立在字段上 可以对字段进行排序 同一张表索引
      更新索引字段值的时候 新增会打乱索引的顺序时
      视图 建立在数据库上 封装查询命令 存储数据 方便查询调用 提示安全性 显示结果固定
      如果在执行事务时没有执行完就实行事务回滚
      事务:是有两条以上的数据库命令组成的原子集合.该事务中的那条命令要么一次性执行成功,要么都不执行,如果在执行过程中执行失败那么该事务就进行回滚,将数据恢复到执行之前的状态
      是否存在某些业务要封装成事务?
      优点:可以保证有关联的数据库操作所对应的关联所需要的完整性和统一性
      缺点:不要将不相关的操作放在同一个事务中,否则会降低执行成功率和效率

      存储过程 存储过程封装了多条SQL命令,必须存放在数据库服务端
      优点: 减少了网络传输SQL命令的压力
      提高了访问的安全性
      SQL 命令存放在服务器端执行效率高
      缺点:需要编写和设计调试 它是一段程序 对于大批量的数据较弱 避免分支和循环
      触发器 自动执行 并且只能对一张表中进行触发 当某一张中发生操作时需要同时对其让表的数据进行操作可以考虑创建触发器

      过程:
      检查SQL服务是否启动
      图形界面建库 建表
      企业管理器
      命令行方式
      查询分析
      主键 用一标记该表中的记录 不能重复 不能为空
      外键 通过外键与其他表中的数据进行关联 只能是以存在主键值

      当前表的数据要被其他表使用时 要有主键
      外键 有主键存在时就要设置对应的外键

      搭建测试环境时或给用户安装产品
      海达票务处理
      C/B 建立空库hdpw1
      恢复
      安装服务器端
      安装客户端
      admin admin

      约束:
      1主键约束
      1 主键约束 primary key
      –特点:约束的字段数据,不能为空、不能重复。
      如果插入或者更新的数据为空或者重复将不允许进行操作。

      –语法:
      1)不命名的主键约束
      create table student
      (
      No int primary key,
      Name char(10),
      Sex char(2),
      ruxu datetime
      );
      2)命名的主键约束
      create table student
      (
      No int,
      Name char(10),
      Sex char(2),
      ruxu datetime,
      constraint pk_001 primary key(No)
      );
      3)删除主键约束
      –语法:alter table 表名 drop constraint 约束名;
      alter table student drop constraint pk_001;
      4)改主键约束
      –语法:alter table 表名 alter column 字段名 类型 not null;
      –alter table 表名 add constraint 约束名 primary key (字段名);
      alter table student alter column No int not null;
      alter table student add constraint PK_002 primary key(No);
      2 非空约束 not null
      1)增加非空约束
      create table student1
      (
      No int not null,
      Name char(10),
      Sex char(2),
      ruxu datetime
      );

      2)改非空约束
      alter table student1 alter column Name char(10) not null;
      3 外键约束 FOREIGN KEY
      –新增外键关系
      1)非命名的外键约束
      create table grade
      (
      no int foreign key references student(No),-- 字段名 字段类型 foreign key references 主表(主键字段)
      grade float
      );
      2)命名的外键约束
      create table grade
      (
      No int,
      grade float,
      constraint fk_001 foreign key (no) references student(no)
      );
      3)删除外键约束
      alter table grade drop constraint fk_002;
      4)改外键约束
      alter table grade add constraint FK_002 foreign key(no) references student(no) on delete cascade; --当主表进行数据删除时,从表一起删除
      alter table grade add constraint FK_002 foreign key(no) references student(no) on update cascade; --当主表进行数据更新时,从表一起更新
      alter table grade add constraint FK_002 foreign key(no) references student(no) on delete no action; --当主表进行数据删除时,违反了外键约束,拒绝进行删除操作
      alter table grade add constraint FK_002 foreign key(no) references student(no) on update no action; --当主表进行数据更新时,违反了外键约束,拒绝进行更新操作
      4 默认约束
      –default 当 一个字段不填写内为空时,默认插入一条数据
      1)增加default 约束
      create table sex
      (
      id int,
      sex char(2) default ‘男’
      );
      2)改 default 约束
      5 检查约束 check
      –只有满足检查约束的数据才能添加到表中,不满足的加不进来
      1)不命名的检查约束
      create table balance
      (
      id int,
      money float check (money >= 0)
      );

      2)命名的检查约束
      create table balance
      (
      id int,
      money float,
      constraint CK_001 check (money >= 0)
      );
      3)删除检查约束
      alter table balance drop constraint ck_001;

      4)改检查约束
      alter table balance add constraint CK_002 check (money >= 0);
      6 唯一约束 unique
      –对于字段输入的内容必须是唯一的,不能重复,但可以为空,多个字段都可以输入唯一约束
      1)不命名唯一约束
      create table tiger
      (
      tig_id int,
      tig_name char(10) unique
      );

      2)命名唯一约束
      create table tiger
      (
      tig_id int,
      tig_name char(10),
      constraint UN_001 unique(tig_name)
      );

      3)删除唯一约束
      alter table tiger drop constraint UN_001;
      4)改唯一约束
      alter table tiger add constraint UN_002 unique(tig_name);
      SQL语句
      创建数据库.
      语法:create database 数据库名字;
      数据库名字不能使用数字作为开头。可以使用字母或者_作为开头
      create database _51testing;

      开辟两块空间,一个是保存日志的,一个是保存表的
      删库 DROP DATABASE 库名;
      单行注释 ——
      多行注释 /* */
      切换数据库
      语法:use 数据库名;
      use _51testing;
      转换当前使用数据库
      备份数据库
      BACKUP DATABASE 库名 TO DISK=’文件名’;
      如BACKUP DATABASE xuanke TO DISK=’d:\test.bak’;
      恢复数据库
      RESTORE DATABASE 库名 FROM DISK=’文件名’;
      如RESTORE DATABASE xuanke FROM DISK=’D:\test.bak’;
      表、字段、类型
      建表
      语法:create table 表名字 ( 字段名 字段类型 字段约束 , 字段名 字段类型 字段约束 );
      create table tmp
      (
      NO int primarykey,
      NAME char(10)
      );
      字段约束可以没有
      删除表
      语法:drop table 表名
      注意:外键约束
      drop table grade
      建立外键
      Sid INT FOREIGN KEY (sid) REFERENCES student (sid)
      CREATE DATABASE xuanke1;
      USE xuanke1;
      –DROP database xuanke1;
      CREATE TABLE student1
      (sid INT PRImary KEY,
      sname CHAR(20) NOT NULL,
      sex CHAR(2) NOT NULL CHECK(sex IN (‘男’,‘女’)),
      card_id CHAR(20) NOT NULL unique CHECK(len(card_id) = 18),
      calss ChAR(20) NOT NULL,
      major CHAR(20) NOT NULL,
      birth_year INT CHECK(birth_year BETWEEN 1900 And 3000) NOT NULL,
      enrollment DATETIME NOT NULL,
      tel CHAR(20)
      )
      CREATE TABLE course1
      (
      cid INT PRIMARY KEY,
      cname CHAR NOT NULL,
      tname CHAR(20) NOT NULL,
      ctime DATETIME NOT NULL,
      cadress CHAR(20) NOT NULL,
      pre_course_id INT,
      )
      CREATE TABLE student_course1
      (
      sid INT FOREIGN KEY (sid) REFERENCES student1 (sid),
      cid INT FOREIGN KEY (cid) REFERENCES course1 (cid) PRIMARY KEY(sid,cid),
      grade INT
      )
      插入一条记录
      在表中增加数据(insert into)
      语法:
      1对表中所有的字段添加数据:insert into 表名 values (第一个字段的值,第二个字段的值,第三个字段的值…);
      注意1:values 值得个数一定要和表中字段的个数相等,一一对应。
      注意2:values 值得数据类型,必须要和表中字段的数据类型相匹配。int fload 值是数字,如果char 值得字符要用’值’。
      注意: 英文单引号 逗号 ,日期 要加单引号

      insert into student values (5,‘郑佳祺’,‘男’,‘003’,‘2011-08-23’,‘北京’,‘1979-01-01’);
      insert into student values (6,’’,‘男’,‘003’,‘2011-08-23’,‘北京’,‘1979-01-01’);
      insert into student values (7,‘庞鹏珏’,‘男’,3,‘2011-08-23’,‘北京’,‘1979-01-01’);

      2对表中指定字段添加数据:insert into 表名(字段1,字段2,字段3) values (值1,值2,值3);
      insert into student(stuid,stname,sex,family) values (8,‘齐倩’,‘女’,‘天津’);
      insert into student(stuid,stname,sex,family,birthday) values (9,‘例子1’,‘女’,‘天津’,’’);
      insert into student(stuid,stname,sex,family,class) values (10,‘例子2’,‘女’,‘天津’,’’);
      insert into student(stuid,stname,sex,family,class) values (11,‘例子3’,‘女’,‘天津’,NULL);
      insert into student(stuid,stname,sex,family,class) values (12,‘例子4’,‘女’,‘天津’,‘NULL’);
      删除数据
      语法:1.delete from 表名
      注意: 删除表中数据时要考虑约束。
      同样用法 truncate table 表名
      delete from grade
      truncate table grade;
      2.delete from 表名 [where 条件]
      delete from student where stname = ‘例子1’;
      1)单一条件
      DELETE FROM student WHERE sid=500;
      2)复合条件
      DELETE FROM student WHERE sex=‘男’ AND major=‘计算机’;
      DELETE FROM student WHERE major=‘计算机’ OR major=‘1’;
      DELETE FROM student WHERE sid BETWEEN 1 AND 500;
      DELETE FROM student WHERE sid>=1 AND sid<=500;
      3)模糊条件
      DELETE FROM student WHERE major LIKE ‘计算机%’; ———— % 通配符(计算机后面任意位任意字符)
      DELETE FROM student WHERE major LIKE ‘%务’;
      DELETE FROM student WHERE class LIKE ‘4%期’;
      DELETE FROM student WHERE class LIKE ‘4_期’; ———— _ 通配符(4后面一位的任意字符)
      DELETE FROM student WHERE sname LIKE ‘[xw]%’; ———— [] 从括号中取任意一个值
      Truncate table student 删除student表记录内容 但是后面不能加条件(不记录日志,速度快)
      更新表数据(修改一条记录)
      更新表数据
      –语法:update 表名 set 字段 = 值,字段2=值[where 条件]
      –注意1:字段类型 和 值得类型 要匹配,主键的值可以被修改
      –注意2:为了保证表数据的完整一直,最好在更新是增加WHERE 条件。
      select * from student
      update student set sex = ‘男’ ;
      update student set sex = ‘女’ where family = ‘天津’
      update student set family = ‘广州’ where family = ‘北京’
      将学号小于50的记录的入学时间更改为2011-5-18
      UPDATE student SET enrollment=‘2011-5-18’ WHERE sid<50;
      将‘计算机’专业的学生转成“计算机科学与技术”
      UPDATE student SET major=‘计算机科学与技术’ WHERE major LIKE ‘计算机’;
      将专业为“信管”开头和“汽车”开头的专业转成“自动化控制”
      UPDATE student SET major=‘自动化控制’ WHERE major LIKE ‘信管%’ OR major LIKE ‘汽车%’;
      将所有省为“北京”和“北京市”的记录统一成“北京”,并将这些记录的班级改成49期
      UPDATE student SET province=‘北京’,class=‘49期’ WHERE province LIKE ‘北京%’;
      将入学时间大于1985-1-1记录的出生时间改为比入学年月早18年
      UPDATE student SET borth_year=year(enrollment)-18 WHERE enrollment > ‘1985-1-1’;
      year() 是求DATE类型的年份
      查询
      简单的查询记录基础语法
      基础语法 select 查询的内容(也就是字段名1,字段名2) from 表名 where 条件
      (用*号可以显示所有字段)
      查询李进峰的所有基本信息
      SELECT * FROM student WHERE sname=‘李进峰’;
      查询李进峰和菲菲的所有基本信息
      SELECT * FROM student WHERE sname=‘李进峰’ OR sname=‘菲菲’;
      SELECT * FROM student WHERE sname IN (‘李进峰’, ‘菲菲’);
      查询所有姓张的同学的所有基本信息
      SELECT * FROM student WHERE sname LIKE ‘张%’;
      查询姓名中有“宇”的同学的所有信息
      SELECT * FROM student WHERE sname LIKE ‘%宇%’;
      查询姓名长度为3,第一个字为“李”最后一个字是“照”的记录
      SELECT * FROM student WHERE sname LIKE ‘李_照’;
      查询所有姓张和姓李的同学的学号和姓名以及出生年月
      SELECT sid,sname,borth_year FROM student WHERE sname LIKE ‘张%’ OR sname LIKE ‘李%’
      SELECT sid,sname,borth_year FROM student WHERE sname LIKE [张李]%’;
      查询姓“杨”并且所在省份为“河北省”的同学的学号
      SELECT sid FROM student WHERE sname LIKE ‘杨%’ AND province=‘河北省’;
      查询”北京”、”湖南”和”河南省”同学的所有信息
      SELECT * FROM student WHERE province=’北京’ OR province=‘湖南’ OR province=‘河南省’
      SELECT sid,sname,borth_year FROM student WHERE province IN (‘北京’, ‘湖南’, ‘河南省’);
      查询姓“”李但是所在省份没有“湖南”字样的同学的省份证号码
      SELECT card_id FROM student WHERE sname LIKE ‘李%’ AND province NOT LIKE ‘%湖南%’
      查询18岁(不含18)以前上学的同学的姓名和电话
      SELECT sname,tel FROM student WHERE year(enrollment)-borth_year<18;
      查询所有大于25岁的人的所有信息
      SELECT * FROM student WHERE year(getdate())-year(enrollment)>25;
      通配符
      使用环境,用于模糊查询,连接符号用Like 而非 =

      • 代表全部,所有,没有规定数量和内容。一般用于select 后面 不作为条件
        _ 代表一个字符,一个数据位。中文要用两个__ 。作为条件使用
        % 代表任意的,没有规定数量和内容。作为条件使用
        [值1,值2,值3] 从括号内的任意值。作为条件使用
        select * from student where stname like ‘张%’
        select * from student where stname like ‘[张李]%四’
        运算符。条件
        – = 两边内容相同。
        – > 左边大于右边。
        – < 右边大于左边。
        – >= 左边大于等于右边。
        – <= 右边大于等于左边。
        – <> 或者 != 不等于
        – between A and B 介于 A 和 B 之间,并且 >=a <=b .前面的数要小于后面的数,包含边界数的。
        select * from grade where coursegrade = 80
        select * from grade where coursegrade between 80 and 100
        条件关联
        – 条件1 and 条件2 :要同时满足条件1 和 条件2 是并且的关系。
        – 条件1 or 条件2 :只要满足一个条件就可以 是或的 关系。
        – () :先去执行括号中得条件
        – 字段 in (值1,值2,值3) :字段的内容要满足 值1 或 值2 或 值3
        select * from student where family = ‘北京’ and stname like ‘张%’
        select * from student where family in (‘上海’,‘天津’)
        排序
        –对查询到的结果按照升序或者降序的方式进行排列。
        –语法 order by 字段 排序方式 (desc,asc) asc 可以省略
        –注意:order by 一定要写在所有查询sql 的最后面
        select * from grade order by coursegrade
        聚合函数
        对查询的结果中某个字段进行函数运算
        sum(字段) :求和函数 字段需为数字类型
        avg(字段) :求平均值 字段需为数字类型.不会计算为空的条目。
        min(字段) :最小的值
        max(字段) :最大的值
        count(字段) :统计字段的个数,这里可以使用 * ,统计所有结果的行数。
        distinct(字段) :去重复
        注:聚合函数,不能放在WHERE中,需要放在HAVING里
        – 显示学生的总成绩
        select sum(coursegrade) from grade
        – 显示最高的成绩是多少
        select min(coursegrade) from grade
        select avg(coursegrade) from grade
        select * from grade
        select count(*) from student
        DISTINCT 去除重复行
        SELECT DISTINCT province FROM student;

      别名AS (Alias)
      as 临时别名
      列别名在WHERE中不能使用 GROUP BY 中不能使用 ORDER BY 中可以
      表别名可以在任何地方使用
      select class, sex, count(sex) as数量 FROM student GROUP BY class,sex ORDER BY class;
      select count(*) as 学生个数 from student
      select stname as 姓名,stuid as 学号from student
      SELECT和ORDER BY 不影响表中数据 所以可以使用别名
      分组里加WHERE和ORDER BY

      对真空的处理
      查询为空的字段 : 字段名 is null
      查询 不为空的字段 : 字段名 is not null
      select * from grade
      select * from grade where coursegrade is not null

      –统计每个课程的选修人数大于2个人的信息
      对课程分组,显示课程和对应的人数
      select couid,count(stuid) from grade group by couid having count(stuid) >2
      –统计<学生选修信息表>,统计每个同学的总成绩
      统计记录条数 count?
      查多少名学生
      SELECT count(*) FROM student
      查有多少种班级
      SELECT count (DISTINCT class) FROM student;
      查入学时间在1990-1-1到2000-12-31的学生个数
      SELECT count(enrollment) FROM student WHERE enrollment BETWEEN ‘1990-1-1’ AND ‘2000-12-31’ ;
      分组查询 GROUP BY
      先对查询内容进行分组、分类,然后在对一个组中的数据进行查询或者运算
      select 查询的内容 from 表名 group by 字段名
      select stuid,sum(coursegrade) from grade group by stuid
      select * from grade
      select stuid,sum(coursegrade) from grade where coursegrade is not null group by stuid
      分组前条件
      在group by 之前使用where 条件去选取数据
      分组后条件
      在 group by 分组后 + having 条件
      select stuid,sum(coursegrade) from grade where coursegrade is not null
      group by stuid having sum(coursegrade) >=200
      –统计<学生信息表>,统计每个班级中每种性别的学生人数
      select * from student
      –统计按照性别分得学生人数
      select sex,count(stuid) from student group by sex
      –统计<学生信息表>,统计每个班级中每种性别的学生人数,两个分组条件
      –统计<grade表>,统计每门课程的平均成绩,并按照成绩降序排序
      select couid,avg(coursegrade) from grade group by couid order by avg(coursegrade) desc

      RIGHT函数
      取身份证最后5位数
      SELECT right(card_id, 5) FROM student;
      将身份证补齐20位,前面用0补
      SELECT right(‘00’+card_id, 20) FROM student;
      SELECT ‘00’+card_id FROM student;
      LEFT函数
      取身份证的前10位
      SELECT left(card_id, 10) FROM student;
      将学号小于50的电话设置成NULL
      UPDATE student SET tel = NULL WHERE sid< 50;
      将电话为NULL的学生信息查询出来
      SELECT * FROM student WHERE tel IS NULL;
      判断条件是NULL的时候不能用= 要用IS IS NOT
      HAVING
      分组查询中,如果条件中有聚合函数,不能放在WHERE中,需要放在HAVING里
      查询平均出生年>1991的班级信息
      SELECT class,avg(borth_year) FROM student GROUP BY class HAVING avg(borth_year) > 1991 ;
      统计哪些班级男生平均年龄大于20
      SELECT calss FROM student WHERE sex=’男’ GROUP BY class HAVING avg(year(getdate())-borth_year)>20;
      优先级WHERE——GROUP BY——HAVING——PRDER BY
      查询学生的姓名和出生年,年龄最大的放前面
      SELECT sname, borth_year FROM student ORDER BY borth_year ;
      TOP 查询结果去前几个结果
      查询年龄最大的学生信息 年龄最大的前10名
      SELECT TOP 1 sname, borth_year FROM student ORDER BY borth_year ;
      SELECT TOP 10 sname, borth_year FROM student ORDER BY borth_year ;
      查询年龄最小的学生信息 年龄最大的前10名
      SELECT TOP 1 sname, borth_year FROM student ORDER BY borth_year DESC;
      SELECT TOP 10 sname, borth_year FROM student ORDER BY borth_year DESC;
      查询按照学号排序,前50个学生的信息
      SELECT TOP 50 * FROM student ORDER BY sid;
      查询最近入学的10名学生信息
      SELECT TOP 10 * FROM student ORDER BY enrollment DESC;
      关联查询(等值联接)
      内连接 等值连接
      外连接 1、左连 2、右连
      多表关联
      1内连接 等值连接 inner join
      语法 select 内容 from 表1 inner join 表2 on 等值条件
      select * from student inner join grade on grade.stuid = student.stuid
      select grade.couid,couname,coursegrade from grade inner join course on grade.couid = course.couid
      2外连接 outer join
      1)左连 select 内容 from 表1 left outer join 表2 on 条件
      2)右连 select 内容 from 表1 right outer join 表2 on 条件
      select * from grade outer join student on student.stuid = grade.stuid
      注:左连接 以 outer join 左边的表为准,要显示全部的左边表的数据,如果右边表没有关联的数据显示Null 与右边表比较 当右边表没有值时 只取左边表的记录
      select * from student right outer join grade on student.stuid = grade.stuid
      注:右连接 以 outer join 右边的表为准,要显示全部的右边表的数据,如果左边没有关联数据,显示Null
      多表关联
      语法:select 内容 from 表1,表2,表3 where 条件
      select stname,couname,coursegrade from student,course,grade
      where student.stuid = grade.stuid and course.couid= grade.couid and coursegrade >80
      select * from grade
      –所有男同学的平均成绩
      select avg(coursegrade) from student,grade where student.stuid = grade.stuid and sex = ‘男’ and coursegrade is not null
      select * from student
      3子查询,嵌套查询
      –当某一个查询的条件,是在另一个查询的结果集里面时,使用嵌套查询
      –查询李四的成绩。
      select * from grade where stuid = (select stuid from student where stname =‘李四’)
      –查询 张三和李四的成绩
      select * from grade where stuid in
      (select stuid from student where stname =‘张三’ or stname = ‘李四’)
      select * from grade where stuid = (select stuid from student where stname =‘张三’)
      or stuid = (select stuid from student where stname =‘李四’)
      –有考试成绩在 70~90的学生的姓名
      select stname from student where stuid in
      (select stuid from grade where coursegrade between 70 and 90)
      批量处理?
      DECLARE @sid INT 申请一个变量
      DECLARE @card_id CHAR(18)
      SET @sid=1 赋初值
      SET @card_id = ‘000000000000’+right(‘00000’+convert(VARCHAR(6),@sid),6) convert 强制转换数据类型
      PRINT @sid
      PRINT @card_id
      INSERT INTO student2 VALUES (@sid,‘蒋艳梅’,‘女’,‘49期’,‘计算机’,@card_id,1999,‘1999-9-9’,‘1111111’,‘1111’)

      CREATE PROCEDURE btInsert AS 或者 CREATE PROC btInsert AS --(保存一个过程)
      DECLARE @sid INT
      DECLARE @card_id CHAR(18)
      SET @sid = 1
      WHILE (@sid <= 100000)
      BEGIN
      SET @card_id=’1111111111111’+right(‘00000’+convert(VARCHAR(6),@sid),6)
      INSERT INTO student2 VALUES (@sid,‘蒋艳梅’,‘女’,‘49期’,‘计算机’,@card_id,1999,‘1999-9-9’,‘1111111’,‘1111’)
      SET @sid = @sid +1
      END
      EXECUTE btInsert 或者 EXEC btInsert (执行已经保存的过程)
      视图/虚表 view
      创建视图 create view 视图名 as (SQL)
      create view tiger as (
      select stname,couname,coursegrade from student,grade,course
      where student.stuid = grade.stuid and grade.couid = course.couid)
      –注意1.视图中不保存数据,不保存表结构,不保存表,没有约束。只保存sql 语句。
      –注意2.视图可以当表来使用,可以用视图去建视图。但是,不建议做 增 删 改的操作。
      –注意3.删除视图时,不会影响到原来的基础表。可以直接在视图中使用SELECT
      create view big_tiger as (select stname,coursegrade from tiger )
      delete from big_tiger where coursegrade is null
      删视图
      –语法:drop view 视图名
      drop view big_tiger
      drop view tiger

      视图的优点
      –1.对于使用sql 不熟练来说。视图是个很简单的查询途径
      –2.对于经常重复的复杂sql,使用视图可以提高查询效率
      –3.可以辅助用于权限管理,提高数据的安全性
      –4.帮助保护表和数据的完整一致性

      视图的缺点
      –1.降低了查询效率
      –2.增加保存空间
      –3.无法对数据和表进行操作。使得操作测试不方便进行。
      create view cll as (
      select class,count(stuid) as 人数 from student group by class
      )
      select * from cll where 人数 = 2

      –视图在企业中如何应用
      1.对于测试而言,降低测试的复杂度。例如:复杂 sql 写一次保存视图,以后都直接调用视图。
      2.对于测试而言,降低工作难度。例如:新来的新人可能对表结构不熟悉,对sql 也不熟悉,使用视图可以尽快上手开始工作。
      3.对于开发而言,降低服务器的工作。提高服务器运行效率。例如:如果不用视图,查询语句要在服务器端生成传给数据库。如果使用视图,服务器直接查询视图就可以满足查询功能。
      4.对产品设计和业务人员而言,降低了工作难度,不用学习和使用复杂sql 语言。例如:如果产品或者业务人员想去查询某些指定的数据时,只要让开发或测试人员建一个视图。直接去查询视图就可以了。
      索引
      –索引就像目录,表中对于一个字段的目录结构。如果想操作表中的数据,先在索引字段中找到那一行,然后再去操作那一条数据。
      –注意1:建议索引设置在主键、外键、唯一约束,效率高
      –注意2:索引是应用于查询条件的。经常使用的查询条件字段,应该被设置为索引字段。
      –注意3:一个表中可以有多个索引,索引之间可以交叉字段,一个索引可以有多个字段。

      索引的优点:
      –1.提高查询效率
      –2.提高了排序效率

      索引的缺点:
      –1.占用数据库资源
      –2.降低了对数据库增、删、改的效率

      索引在企业中如何应用:
      –1.页面上如果有很多的查询条件并且需要排序时,建议一一创建索引。
      –2.检查是否主键和外键、唯一约束建立了索引关系。
      –3.在测试过程中应该检查,运行查询条件时是否使用了索引。
      –4.测试中检查,平凡被更新的表,不要设置太多的索引。

      –建索引
      –语法:create index 索引名 on 表(字段,字段…);
      create index suoyin1 on student(stname,family);

      –删索引
      –语法:drop index 表名.索引名
      drop index student.suoyin
      存储过程 procedure
      –把一些sql 放在一起执行,并且有逻辑的执行。存储过程。
      –语法1:简单的无参数存储过程。
      – create procedure 存储过程名 as sql语句
      create procedure aa as
      update grade set couid = 6 where couid =1;
      update course set couid = 6 ,couname = ‘生物’ where couid =1;

      执行存储过程
      –语法 exec 存储过程名
      exec aa;

      select * from grade;
      select * from course;

      语法2:有参数的存储过程
      – create procedure 存储过程名 (@参数1 参数类型,@参数2 参数类型…) as sql语句
      create procedure BB (@id int,@NewId int,@name char(10))
      as
      update grade set couid = @NewId where couid = @id;
      update course set couid = @NewId ,couname = @name where couid =@id;

      执行存储过程
      –语法 exec 存储过程名(参数1,参数2,参数3)  
      SQL SERVER 参数不加括号
      –注意1.参数的个数和 数据类型必须与定义相一致
      –注意2.存储过程中的sql 是按照顺序执行的
      –注意3.当存储过程中一个sql失败时。不会影响其他sql的执行。
      exec BB 3,13,‘SQL SERVER’
      alter table grade add constraint CH check (couid < 20)
      update grade set couid = 21 where couid = 13;
      exec BB 13,21,‘ORACLE’
      create database bank;
      use bank;
      create table bj_bank
      (
      name char(10),
      money int check(money>=0)
      constraint pk_nanme_bj primary key (name)
      事务 transaction
      把所作的操作放在一组,如果有一个失败就全失败,都成功时候才成功
      事务是存储过程的一个部分,存储过程的一个写法
      – begin transacion 事务名
      – commit transacion 事务名
      – rollback transacion 事务名
      create procedure zz1
      (
      @a_name char(10),
      @b_name char(10),
      @a_money int,
      @b_money int,
      @c_name char(10)
      )
      as
      begin transaction c1 --开始事务c1
      if (select money from bj_bank where name = @a_name) > 0 --判断a账户
      begin
      update bj_bank --从a中减去
      set money=money-@a_money
      where name=@a_name;
      update zs_bank --向c中添加
      set money=money+@a_money
      where name=@c_name;
      commit transaction c1
      end
      else
      rollback transaction c1 --如果判断失败回滚所有操作

      begin transaction c2 --开始事务c2
      if (select money from bj_bank where name = @b_name) > 0 --判断b账户
      begin
      update bj_bank --从b中减去
      set money=money-@b_money
      where name=@b_name
      update zs_bank --向c中添加
      set money=money+@b_money
      where name=@c_name
      commit transaction c2
      end
      else
      rollback transaction c2 --如果判断失败回滚所有操作

      update bj_bank set money = 5000 where name = ‘a’;
      update bj_bank set money = 1000 where name = ‘b’;
      update zs_bank set money = 0 where name = ‘c’;

      exec zz1 a,b,250,600,c
      select * from bj_bank
      union
      select * from zs_bank
      exec zz2 a,b,500,700,c
      exec zz2 a,b,1000,500,c

      存储过程 zz2 开始
      create procedure zz2
      (
      @a_name char(10),
      @b_name char(10),
      @a_money int,
      @b_money int,
      @c_name char(10)
      )
      as
      begin transaction guopeng
      if (select money - @a_money from bj_bank where name = @a_name) >= 0
      begin
      update bj_bank set money = money - @a_money where name = @a_name;
      update zs_bank set money = money + @a_money where name =@c_name;
      commit transaction guopeng;
      end
      else
      begin
      rollback transaction guopeng;
      end
      begin transaction qiqian
      if (select money - @b_money from bj_bank where name = @b_name) < 0
      begin
      rollback transaction qiqian;
      end
      else
      begin
      update bj_bank set money = money - @b_money where name = @b_name;
      update zs_bank set money = money + @b_money where name =@c_name;
      commit transaction qiqian;
      end
      存储过程zz2 结束
      存储过程循环。大批量的制造测试数据。
      create procedure ww
      (
      @name char(10),
      @money int,
      @count int
      )
      as
      declare @num int;
      set @num = 0;
      while (@num < @count)
      begin
      insert into bj_bank values (@name,@money);
      set @num = @num +1;
      end;
      drop procedure ww
      alter table bj_bank drop constraint pk_nanme_bj
      exec ww ‘王沙’,900,1000000;
      select * from bj_bank where money = 30
      truncate table bj_bank

      –存储过程在企业中如何应用:
      –1.对于开发、对于测试而言,存储过程简化了工作难度。
      –2.对于开发、测试而言,存储过是可以实现逻辑的。
      –3.对于测试而言,帮助我们大批量的生成测试数据。
      –4.对于测试而言,帮助我们去检查对数据库的操作数据是否符合预期
      –5.对于开发而言,存储过程支持事务,可以做逻辑编程

      –删除存储过程
      –语法 drop procedure 存储过程名
      drop procedure ww
      触发器 trigger
      当满足触发条件时,执行后面的触发sql,支持事务
      语法: create trigger 触发器名 on 工作表表名 for 触发方式 as sql语句
      触发条件 delete,update 触发条件因数据库而异
      create trigger trigger_student_delete
      on student
      for delete
      as
      delete grade from grade,deleted where grade.stuid = deleted.stuid;
      select * from student
      select * from grade
      delete from student where stuid = 1
      alter table grade drop constraint FK__grade__stuid__7D78A4E7
      练习
      一、单表查询练习
      1、查询<学生信息表>,查询学生"张三"的全部基本信息
      Select * from student where stname=’张三’;
      2、查询<学生信息表>,查询学生"张三"和”李四”的基本信息
      select * from student where stname in (‘张三’,‘李四’)
      3、查询<学生信息表>,查询姓"张"学生的基本信息
      select * from student where stname like ‘张%’;
      4、查询<学生信息表>,查询姓名中含有"四"字的学生的基本信息
      select * from student where stname like ‘%四%’;
      5、查询<学生信息表>,查询姓名长度为三个字,姓“李”,且最后一个字是“强”的全部学生信息。
      select * from student where stname like ‘李_强’;
      6、查询<学生信息表>,查询姓"张"或者姓”李”的学生的基本信息。
      select * from student where stname like ‘张%’ or stname like ‘李%’;
      7、查询<学生信息表>,查询姓"张"并且"所属省份"是"北京"的学生信息
      select * from student where stname like ‘张%’ and family =‘北京’;
      8、查询<学生信息表>,查询"所属省份"是"北京"、”新疆”、”山东”或者"上海"的学生的信息
      select * from student where family in (‘北京’,‘新疆’,‘山东’,‘上海’);
      9、查询<学生信息表>,查询姓"张",但是"所属省份"不是"北京"的学生信息
      select * from student where family!=‘北京’ and stname like ‘张_’;
      10、查询<学生信息表>,查询全部学生信息,并按照“性别”排序,性别相同的情况下按照“所属省份”排序,所属省份相同的情况下再按照“班级”排序
      select * from student order by sex,family,class; (多个排序条件,用逗号以此分开,先排第一个、再排第二个。。。。)
      11、查询<学生信息表>,查询现有学生都来自于哪些不同的省份
      select distinct (family) from student;
      (注意distinct使用方法)
      12、查询<学生选修信息表>,查询没有填写成绩的学生的学号、课程号和成绩
      select couid,couid,coursegrade from grade where coursegrade is null;
      13、查询<学生选修信息表>,查询全部填写了成绩的学生的选修信息,并按照“成绩”从高到低进行排序
      select * from grade where coursegrade is not null order by coursegrade desc;
      二、聚合函数练习
      1、统计<学生信息表>,统计共有多少个学生
      select count(stname) from student;
      2、统计<学生信息表>,统计年龄大于20岁的学生有多少个
      select count(stname) from student where (year(getdate())-year(birthday))>20;
      3、统计<学生信息表>,统计入学时间在1998年至2000年的学生人数
      select count(stuid) from student where year(enrollment) between 1998 and 2000;
      4、统计<学生选修信息表>,统计学号为"S001"的学生的平均成绩
      select avg(coursegrade) from grade where stuid=‘1’;
      5、统计<学生选修信息表>,统计学号为"S001"的学生的总成绩
      select sum(coursegrade) from grade where stuid=‘1’;
      6、统计<学生选修信息表>,查询课程号为”C001”的课程的最高成绩
      select max(coursegrade) from grade where couid=‘1’;
      7、统计<学生信息表>,查询所有学生中的最大年龄是多少
      select max((year(getdate())-year(birthday))) from student;
      三、分组查询练习
      1、统计<学生选修信息表>,统计每个课程的选修人数
      select count(*) from grade group by couid;
      2、统计<学生选修信息表>,统计每个同学的总成绩
      select sum(coursegrade) from grade group by stuid;
      3、统计<学生信息表>,统计每个班级中每种性别的学生人数,并按照班级排序
      select class,sex,count(stuid) from student group by sex,class order by class;
      4、统计<学生选修信息表>,统计每门课程的平均成绩,并按照成绩降序排序
      select avg(coursegrade) from grade group by couid order by avg(coursegrade) desc;
      5、统计<学生选修信息表>,显示有两门以上课程不及格的学生的学号
      select stuid from grade where coursegrade<60 group by stuid having count(stuid)>2;
      6、统计<学生信息表>,统计每个班级中的最大年龄是多少
      select max(year(getdate())-year(birthday)) from student group by class ;
      四、嵌套查询练习
      1、用子查询实现,查询选修“高等数学”课的全部学生的总成绩
      select sum(coursegrade) from grade where couid=(select couid from course where couname=‘高等数学’);
      2、用子查询实现,统计<学生选修信息表>,显示学号为"S001"的学生在其各科成绩中,最高分成绩所对应的课程
      思考:如果该学号学生有两个课程分数都为最高的100分,查询会有什么结果(显示2个结果)
      select couname from course where couid=(select couid from grade where coursegrade in (select max(coursegrade) from grade where stuid=1)
      3、用子查询实现,查询2班选修"数据库技术"课的所有学生的成绩之和
      select sum(coursegrade) from grade where stuid in(select stuid from student where class=‘002’) and couid=(select couid from course where couname=‘数据库技术’);
      4、用子查询实现,查询3班"张三"同学的"测试管理"成绩
      select coursegrade from grade where stuid in (select stuid from student where class='003’and stname=‘张三’) and couid=(select couid from course where couname=‘测试管理’);
      五、联接查询练习
      1、查询"张三"的各科考试成绩,要求显示姓名、课程号和成绩
      select stname,couid,coursegrade from student inner join grade on student.stuid=grade.stuid and stname=‘张三’;

      select stname,couid,coursegrade from student,grade where student.stuid=grade.stuid and stname=‘张三’;
      2、查询"张三"的各科考试成绩中,哪科没有记录考试成绩,要求显示姓名、课程号和成绩
      select stname,couid,coursegrade from student inner join grade on student.stuid=grade.stuid and stname='张三’and coursegrade is null;

      select stname,couid,coursegrade from student,grade where student.stuid=grade.stuid and stname='张三’and coursegrade is null;
      3、查询"张三"的各门课程成绩,要求显示姓名、课程名称和成绩
      select stname,couname,coursegrade from student,course,grade where student.stuid=grade.stuid and course.couid=grade.couid and stname=‘张三’;
      4、查询3班"张三"的"测试管理"成绩,要求显示姓名、成绩
      select stname,coursegrade from student,course,grade where student.stuid=grade.stuid and course.couid=grade.couid and couname=‘测试管理’ and stname='张三’and class=003;
      5、查询所有2000年以前入学的,各班男生的各科考试平均成绩
      select class,avg(coursegrade) from grade,student where grade.stuid=student.stuid and sex='男’and year(enrollment)<2000 group by class ,couid;
      六、外联接查询
      查询”李坚强”所有课程的成绩,并显示学号、姓名、课程号和成绩,没有成绩记录的学号包括:(‘S009’,‘S010’,‘S011’)
      1、使用右联接
      select grade.stuid,stname,couid,coursegrade from grade right outer join student on student.stuid=grade.stuid and stname=‘李坚强’;
      2、使用左联接
      select grade.stuid,stname,couid,coursegrade from student left outer join grade on student.stuid=grade.stuid and stname=‘李坚强’;
      3、对比等值连接
      select grade.stuid,stname,couid,coursegrade from grade inner join student on student.stuid=grade.stuid and stname=‘李坚强’;
      七、补充提高
      1、查询“张三”比“王三”入学早几年
      select year(enrollment)-(select year(enrollment) from student where stname=‘王三’) from student where stname='张三;
      2、查询所在班级和该班内学生的年龄之和,其中每个人的年龄都大于20岁,每个班的年龄之和大于60岁
      select class,sum(year(getdate())-year(birthday)) from student group by class;

      第六章 C语言
      ATM机
      1.取钱 2.存钱 3.查询余额 4.转账

      作业1:存钱、查询、转账的流程图

      软件模块结构图
      需求:十进制一位数加法
      XX.C ——C语言的源文件
      编译 ——转换成二进制的机器语言
      XX.exe ——可执行文件

      不需要编译的脚本语言: PHP ASP JSP PYTHON VBS PEER TCL
      需要编译的高级语言: C VC C# Delphi Java .Net

      注释: // 和/* */

      作业3:绘制流程图中所有界面

      C语言 面向过程的语言 执行过程是自上向下 函数
      F10 单步执行 但不进入函数体
      F11 单步执行 进入函数体
      C语言中的存储
      数据类型
      基本数据类型
      1浮点型
      默认小数位是6位,若输出《6位,完成四舍五入
      若赋予的值小数位《5,后边会随机补数
      vc 对于定义的浮点型变量会默认为double类型,因此会产生警告。想没有警告,强制在赋值语句中的数据后加f. 比如,
      float x;
      x=0.33f;

      数组
      1)一维数据
      定义:数据类型 数组名[长度];
      初始化:1)先定义,后赋值;
      int a[3];
      a[0]=34;
      a[1]=45;
      a[2]=345;
      2) 边定义,边初始化
      float b[2]={4556.234,45.345};
      3) 只给第0个初始化,后边补0
      double c[3]={345.345345};
      访问:下标从0开始遍历数组

      2)二维数组
      定义:数据类型 数组组[行的长度][列的长度];
      初始化: 1)先定义,后赋值

           int a[2][4];
             a[0][0]=3;
             a[0][1]=4;
             a[0][2]=5;
             a[0][3]=6;
             a[1][0]=7;
             a[1][1]=8;
             a[1][2]=9;
             a[1][3]=10;
             2)边定义,变赋值;
               int b[2][4]={{3,4,5,6},{7,8,9,10}};
      

      访问: 行和列的下标从0开始遍历数组

      2字符串
      定义:char 字符串名[长度];
      初始化:先定义,后赋值
      边定义,边赋值
      1)
      char p1[5]=“abcd”; 对 (因为自动补\0占一位)
      char p2[5]=“abcde”; 错
      2)
      char p3[5]={‘a’,‘b’,‘c’,‘d’,’\0’}; 对
      char p4[5]={‘a’,‘b’,‘c’,‘d’,‘0’}; 错
      输出:prinf("%s",p1);
      printf("%c",p1[0]);
      输入:scanf("%s",&p1); /读整个字符串/
      scanf("%c",&p1[2]); /读单个字符/
      注意:赋值的长度小于定义长度时,会逐个补空

      结构体
      边定义,边初始化: struct 结构体名 {
      数据类型 数组名[长度];
      数据类型 变量名;
      …} 结构体变量名={初始化对应值}
      struct student {
      char name[10];
      int age;
      } s1={“zhangsan”,18};
      访问:结构体变量名.结构体内部定义的变量名。
      printf("%s",s1.name);
      printf("%d",s1.age);

      结构体数组
      边定义,变初始化:
      struct 结构体名 {
      数据类型 数组名[长度]; /表示长度/
      数据类型 变量名;
      …} 结构体数组变量名[长度]={{初始化对应值1},{初始化对应值2},} /这里的长度表示多少个,相当于表中的记录数/

        struct student {
                    char name[10]; /*name这个字符串能有效存储字符数9个,还有1位补空*/
                int age;
              } s[2]={{"zhangsan",18},{"lisi",20}};   /*这里的2表示有2条记录*/
      

      3运算符
      算数运算符: + - * /(求商) %(取余)
      关系运算符: > < >= <= ==(等于) != (不等于)
      真(非0) 假0
      逻辑运算符
      && (与) || (或) ! (非)

      常量
      const 数据类型 常量名=值;
      例如,圆周率 const int pi=3.14;

      变量

      1. 变量是什么?

      2. 先定义,后使用
        标准c
        int x;
        x=3;
        int j;
        j=89;

        vc
        int x;
        int j;
        x=3;
        j=89;

      3. 使用赋值语句修改变量值

      4. 变量赋予的值由数据类型决定

      5. 变量包含名字、值和地址

      6. 不同的数据类型在计算机中存储的字节大小不一样
        16位 32位
        int 2个字节 4
        long 4 4
        float 4 4
        double 8 8
        char 1 1

      7. 变量的名字
        首字母:字母,下划线
        包含:字母,下划线,%, 数字
        不能使用c语言的保留字

      8. 全局变量和局部变量
        1)局部变量如何定义:在函数中定义的变量都成为局部变量。离开函数(调用完函数),该变量消失。
        2)全局变量如何定义:在main函数上边定义的变量成为全局变量。对所有的函数都生效。
        3)当局部变量和全局变量同名时,实际上修改的是局部变量。
        常量
        常量的定义

      define 常量名 常量值

      常量名要全用大写字母
      常量没有数据类型
      1.数组
      定义数组
      数据类型 数组名[N] ;
      N 代表数组的个数

      结构体
      定义
      Struct 结构体名
      {
      变量1
      变量2



      }
      例:
      Struct
      {
      Char name[8];
      Char sex[2];
      Int age;
      Int grade;
      } Stu_49[2]={{“张三”,”男”,18,60},{“李四”,”女”,19,100}};
      结构体的显示
      Printf(“ %s”,Stu_49[0].name);
      条件/分支逻辑
      Switch
      switch (表达式)
      {
      case 值1: 处理语句1;
      break;
      case 值2:处理语句2;
      break;
      case 值3:处理语句3;
      break;
      。。。。

      }
      注意1:值的数据类型要和表达式返回值的类型要匹配;
      注意2:不要忘了使用break退出后续执行;
      注意3:表达式要使用括号括起来;
      

      条件 只能输入固定的值
      If
      分支结构
      条件
      情况1: 对应流程图,假分支直接指向后续语句,不含有处理语句
      if (条件)
      处理语句1;
      处理语句2;

      情况2: 对应流程图,处理语句1和处理语句对应真分支,处理3和4对应假分支
      if (条件)
      处理语句1;
      处理语句2;

      else
      处理语句3;
      处理语句4;

      情况3
      If (表达式1)
      if(表达式2)
      语句2;
      Else
      语句3;
      Else
      语句1;
      循环
      For
      循环结构
      定义循环控制变量
      for (控制变量赋初始值;控制变量终止条件;累加(减)器)
      {
      循环体语句;
      }

      while (条件)
      {

      循环体语句;
      }

      do
      {
      循环体语句;
      } while (条件)

      for(表达式1;满足循环条件;表达式2)
      {
      循环体;
      }
      while
      while (表达式)
      {
      循环体
      }
      do…while
      do
      {
      循环体
      }
      While(表达式)
      申请卡号时,多申请一位 并用\0座位数据的结束
      Do while 在条件不满足时,会执行一次do中的循环体
      有参数有返回值的函数
      错误跟踪 写日志
      函数
      函数:

      1. 输出函数
        1.1 printf(控制格式,变量);
        控制格式 %d - 整形
        %c - 字符型
        %ld -长整形
        %f -浮点型 (想控制小数位 %.3f)
        %lf --双精度 (想控制小数位 %.5lf)
        1.2 printf(“你想输出的内容”);
      2. 输入函数
        scanf(“控制格式”,&变量1,&变量2,…);
        %c
        %d
        %ld
        %f
        %lf
        int x,y;
        x=234;
        y=234;
        scanf("%d%d", &x,&y);
      3. 存在的必要性
        1) 职能单一
        2)定位问题
        3)便于使用
        4) 减少代码冗余
      4. 项目中只能有一个main函数。否则移除。
      5. 函数使用
        先定义(在main函数外定义)-》调用-》申明(在main函数外边申明)
        注意1:定义的函数名、调用的函数名、申明的函数名必须同名
        5.无返回且无形参的函数
        定义:
        void 函数名()
        {
        语句1;
        语句2;
        。。。。。
        }
        调用:
        函数名();
        申明:
        void 函数名();
      6. 无返回有形参的函数
        定义:
        void 函数名(形参列表)
        {
        语句1;
        语句2;
        。。。。。
        }
        在这里,形参列表实际上就是变量定义列表,只是因为放在函数定义中就叫叫它形参。
        比如:int x,int y,int z,char m
        调用:
        函数名(实参列表);
        在这里,实参列表的个数和形参列表个数一致;类型一致;实参列表可以相同数据类型的值,也可以是相同数据类型的变量
        申明:
        void 函数名(形参列表);
      7. 有返回有形参的函数
        定义
        数据类型 函数名(形参列表)
        {
        语句1;
        语句2;
        。。。。。
        return 值
        }
        在这里,return的值必须和函数名之前的数据类型匹配。
        调用:
        定义一个和函数返回数据类型相同的变量
        变量=函数名(实参列表);
        申明
        数据类型 函数名(形参列表);
      8. 函数名在一个程序中不能同名
        程序结构
        #include 语句
        #include <stdio.h>
        函数申明
        main函数
        自己定义的函数
        其他
      9. 字节
      10. ascii
        char m;
        m=“k”;
        /* 输出k字符的ascii码*/
        printf(“m=%d\n”,m);
      11. 转义
        \ - 转义符
        \n -控制换行
        \t -控制tab键的距离
        \0 -空
      12. 注释
        单行
        跨行 /* 语句 */
        Void 函数名()
        Void 函数名(参数1,参数2…)
        Int 函数名()
        Int 函数名(参数1,参数2…)
        注:1调用函数时 传入的参数类型 要和函数参数的类型一致,返回值也是一样
        2对有参数没有返回值的函数测试
        3对没有参数 没有返回值的函数测试
        4 测试main()函数 复制了一个定义为test_main()

      补充知识:
      1个字节=8位 编码是ASCII码 又叫ANSI(美国标准码)
      用两个字节表示中文 编码是GB2312
      当16位全部占用时 编码是GB18030
      后来同意标准 全部用16位表示 编码用UTF-8 只翻译16位中的低8位
      注: C语言中main()函数默认是返回int 类型的值

      第七章 Windows环境搭建
      一、名词注解与定义:
      环境:分为{1、生产环境;2、测试环境;3、开发环境。
      生产环境(也称为:上线环境)是运维人员的工作环境,有时候测试人员也会参与运维的部署工作)。
      测试环境:测试人员为了测试软件在生产环境中的功能和性能的表现,而尽量可能的模拟了一个生产环境来进行软件测试。
      开发环境:就是开发人员编写软件代码的工作环境。
      一个软件要从开发环境——>测试环境——>生产环境这个环境流程。
      问:为什么不在开发环境中进行软件测试,要测试环境中进行?
      答:因为开发环境它具有可变性,其影响测试的准确性,所以为了保证数据独立性和其测试的准确性,软件测试最好在测试环境中进行。
      测试环境-分为:1、硬件环境;2、OS(操作系统)环境;3、软件环境。
      其硬件环境和OS(操作系统)环境都是要根据被测软件的需求来搭建;软件环境包括:被测试软件和一些用户常用软件,主要测试被测软件和常用软件之间的兼容性、冲突。
      搭建:先要根据需求架设硬件环境,再根据需求架设OS系统环境,要保证架设的OS系统是无毒的,最后架设软件环境,卸载无用的软件,确认软件的证件号来保证一些不必要的错误和冲突。
      为什么要保证架设的OS操作系统环境是无毒的?因为病毒可能产生一些和被测软件无关的BUG。解决方法:可安装杀毒软件,重装系统来防止和保证。
      被测软件-分为:1、单机版;2、C/S(client/server);3、B/S(browser/server)。三种运行模式。
      C/S(client/server):是分为客户端、服务端和数据库端(如:PPS、QQ需要用户先安装客户端)。其架设的软件会用客户端来分担一部分工作;
      优点:运行速度快、部分数据存放在本地;
      缺点:兼容性差,要根据不同的系统来开发不同的系统版本,成本高和测试成本高。
      B/S(browser/server):是可以用IE浏览器直接访问和运行的一种模式,不用预先安装客户端(如:网页游戏、网上订票系统等)。
      优点:兼容性好,数据保密性好;
      缺点:运行速度较慢。
      软件要根据不同的运行环境、性能的要求来选择使用C/S架设,还是用B/S架设。
      扩展内容:
      app:应用软件,是安装在OS(操作系统)上面的。
      光的三原色:红。绿。蓝。
      服务器(软件):
      1、应用服务器:IIS,Weblogic,JBoss;
      2、Web服务器软件:Apache,Nginx,LightHttpd;
      3、数据库服务器:SQL Server,MySQL(Strucrure Query Language),Oracle;
      4、邮件服务器:QMail,Exchange,Lotus;
      5、FTP服务器

      C/S
      海达票务系统
      1.硬件环境和操作系统(略)
      2.安装SqlServer,安装客户端和服务器端软件
      3.测试数据准备,环境初始化
      DROP DATABASE hdpw1;
      CREATE DATABASE hdpw1;
      RESTORE DATABASE hdpw1 FROM DISK=‘D:\training\doc\win\student\海达票务\hdpw1’;
      4.参数配置
      4.1 Client端配置,和Server端的链接
      4.2 服务器端配置,和数据库的链接
      4.3 数据库端配置(略)
      5.启动整个海达票务系统
      系统更新时,需要更新C和S端,而B/S架构只用更新S端
      B/S
      安装虚拟机:
      1.打开VMWare
      2.新建一个虚拟机
      3.更改光驱加载的ISO
      4.开启电源
      5.将鼠标焦点放到GuestOS里(如何到HostOS?热键)
      6.格式化磁盘
      7.后续安装的步骤
      8.配置网络
      9.安装VMWareTools

      配置共享文件夹:

      进销存系统
      1.安装IIS (通过本机IP访问和netstat查看进程是否成功启动)

      2.把jxc文件夹拷贝到guest
      3.在IIS里新建一个虚拟目录->指向jxc文件夹

      4.设置jxc文件夹的权限

      5.启动相关扩展

      6.启用虚拟目录的父路径

      7.设置默认首页

      OA系统
      1.安装JDK

      2.将Jdk的bin目录追加到环境变量的Path变量里(如:C:\jdk6\bin)
      注:放在path里可以在cmd中输入命令运行,系统将自动定位jdk所在目录

      3.新建一个系统变量 JAVA_HOME,值为jdk的安装目录(如:C:\jdk6)

      4.新建一个系统变量 CLASSPATH,(如:.;C:\jdk6\lib\tools.jar;C:\jdk6\lib\dt.jar) . 指当前目录 注:CLASSPATH (java的类库)

      注: . 表示当前目录 允许jdk查找当前目录
      5.安装Tomcat,解压后运行startup.bat
      通过127.0.0.1:8080 访问,可以看到Tomcat的欢迎页面
      也可以修改conf/server.xml文件,更改Tomcat启动的端口号

      注:在conf下server.xml中查找8080(默认端口)修改端口号 更改配置后要重启服务器
      用startup.bat启动tomcat
      6.安装MySql

      7.部署OA的程序,将程序拷贝到tomcat的webapps目录

      1)先到Mysql里把测试数据导入
      登录mysql mysql -uroot -p
      进入mysql控制命令行,显示如下
      mysql>

      从硬盘上导入一个sql文件

      mysql> source c:~~~~~\oa\setup\redmoon.sql (本质是执行Sql文件里的每一个SQL语句)
      2)修改和数据库的连接、日志和缓存参数
      oa/WEB-INF/proxool.xml 改里面的数据库密码即可

      oa/WEB-INF/log4j.properties 改日志的路径,并创建相应的路径

      oa/WEB-INF/classes/cache.ccf 改缓存的路径

      8.重新启动Tomcat
      访问 127.0.0.1/oa
      admin
      111111
      注:参考 windows环境搭建
      补充知识:
      查看服务:

      MySql相关命令
      show databases 查看有哪些库
      show tables 查看库有哪些表

      desc 表名 查看表结构

      浏览器引擎: 1.渲染页面 2.执行客户端脚本JavaScript 3.执行自由控件
      w3school.com.cn学习前端语言的网站

      Trident IE
      Gecko FireFox
      Presto Opera
      Webkit Safari

      Cookies 保存用户名 密码 根据浏览器、域名保存 一个浏览器、域名一个Cookies 唯一标识一个客户
      Session 和cookies类似 是服务器端保存的
      Session 和cookies是一一对应的
      TCP/IP分四层 OSI七层

      应用层传输协议:http pop3 smtp
      传输层协议:tcp udp
      网络层协议:ip arp
      物理层协议:mac pppo
      三次握手
      目的:建立连接
      1.给服务器发送一个包[SYN] 处于send状态
      2.服务器回复一个包[SYN,ACK] 处于receive状态
      3.给服务器返回一个包[ACK] 两边同步待命 准备发送

      注:参考 网络模型和协议.vsd
      Session/Cookie:Session是存在服务器的,关闭浏览器则删除Cookie存在客户端,可以设置生命周期

      JAVA环境搭建
      1.安装jdk程序
      2.配置环境变量
      1)增加JAVA_HOME,值为jdk的根目录
      2)修改Path,在后面追加 ;%JAVA_HOME%/bin
      3)增加CLASS_PATH,值为 .;%JAVA_HOME%/lib/tools.jar
      3.运行cmd,检查java版本
      java -version
      4.运行一个java程序
      1)编辑文件 HelloWorld.java,内容为
      public class HelloWorld {
      public static void main(String[] args) {
      System.out.println(“Hello, world!”);
      }
      }
      2) 编译java文件,生成字节码文件
      javac HelloWorld.java
      3) 运行字节码文件
      java HelloWorld

      安装Tomcat

      1. 解压至某目录
      2. 运行 bin/startup.bat
      3. 使用浏览器访问
        http://127.0.0.1:8080

      安装MySQL

      1. 运行MySQL安装程序,next
      2. MySQL的配置
        1. 编码
        2. 密码
        3. 服务
      3. mysql -uroot -p

      部署oa

      1. 将程序文件拷贝到tomcat的webapps目录
      2. 初始化测试数据,登录到mysql控制台,运行source命令
        mysql> source c:…\redmoonoa.sql
      3. 程序配置
        1. oa程序和数据库的连接配置
          WEB-INF\proxool.xml
          修改用户名和密码
        2. oa的日志配置文件
          log4j.properties
          log4j.appender.R.File=C:/apache-tomcat-7.0.6/webapps/oa/log/oa.log
        3. oa的缓存配置文件
          WEB-INF\classes\cache.ccf
          jcs.auxiliary.DC.attributes.DiskPath=C:/apache-tomcat-7.0.6/webapps/oa/CacheTemp
      4. 重启一下tomcat
      5. 访问
        http://127.0.0.1:8080/oa
        admin
        11111

      第八章 需求管理
      1.什么是需求
      明确要什么做什么
      2. 需求工程在做什么
      ㈠需求开发:需求获取 需求分析 需求格式化 需求验证
      ㈡需求管理:需求分配 需求评审 需求基线 需求变更 需求跟踪
      3. ★需求变更
      a)为什么要变更:外因:市场,客户。内因:技术不足 缺陷 人员资源
      b)变更影响了什么:SRS HLD LLD SP UI ZI CODE
      c)怎么做变更的控制(需求变更控制目标):控制项目成本,控制项目风险
      d)需求变更的越早,影响范围越小,变更越晚,影响范围越大
          原则 方法
      变更控制的目标 降低变更引起的成本 防止随意的变更 通过评审和会议让用户或者企业负责人在变更上签字来确认变更
      尽量早的发生变更 多设计一些产品原形,由用户确认,
      尽量控制变更影响的范围 尽量不变更,如果变更尽量发生在后续版本
      尽量减少变更所引起的反工 当变更的需求稳定后在介入开发和测试
      降低变更引起的风险 高内聚,低耦合 代码内部干的是一件事,函数与函数之间关联尽量小,尽量使变更只影响到局部,而不影响到整个系统
      4.★需求的跟踪
      a)目的(为什么要需求变更跟踪)将和SRS有关的文档统一管理和关联起来,从而可以从任何一点找到其他文档的相关内容
      b)★★★★★输入、输出(RTM)
      ①开发的需求跟踪:SRS HLD LLD
      ②系统的需求跟踪:SRS ST计划 ST方案 ST用例
      ③集成的需求跟踪:HLD IT计划 ITf方案 IT用例
      ④单元的需求跟踪:LLD UT计划 UT方案 UT用例
      输出(RTM)Requirement Tvace Matrix需求跟踪矩阵
      c)每个阶段,跟踪的内容和变更的跟踪.
      SRS编号 SRS名称 系统测试项ID ST描述 ST子项ID ST子项描述 系统测试用例ID 系统测试用例描述
      HLD编号 HLD名称 集成测试项ID IT描述 IT子项ID IT子项描述 集成测试用例ID 集成测试用例描述
      LLD编号 LLD名称 单元测试项ID UT描述 UT子项ID UT子项描述 单元测试用例代码声明 单元测试用例代码描述
      需求跟踪矩阵的作用:
      开发RTM: 保证所有的需求都被设计实现了
      测试RTM: 保证所有的需求都被测试了
      保证可以通过需求,确定需求变更影响的范围,找到所有的成果物(HLD、LLD、系统测试计划…)
      需求的特点:
      只关心想要什么,不关心怎么去做
      需求工程

      不同阶段的需求变更的影响范围      
             
      需求阶段需求变更影响      
      需求规格说明书 系统测试计划    
      开发RTM 系统测试RTM    
             
      概要设计需求变更影响      
      需求规格说明书 概要设计    
      系统测试计划 系统测试方案 系统测试用例  
      集成测试计划      
      开发RTM 系统测试RTM 集成测试RTM  
             
      详细设计需求变更影响      
      需求规格说明书 概要设计 详细设计  
      系统测试计划 系统测试方案 系统测试用例  
      集成测试计划 集成测试方案 集成测试用例  
      单元测试计划      
      开发RTM 系统测试RTM 集成测试RTM 单元测试RTM
             
      编码以及后期测试阶段需求变更      
      需求规格说明书 概要设计 详细设计 编码
      系统测试计划 系统测试方案 系统测试用例  
      集成测试计划 集成测试方案 集成测试用例  
      单元测试计划 单元测试方案 单元测试用例  
      开发RTM 系统测试RTM 集成测试RTM 单元测试RTM
      补充知识:
      1代码编写原则:
      1).高内聚,低耦合
      2).可续性高
      3).查阅代码编写规范
      2在公司中出现以下问题如何解决
      (1)业务背景不同,导致项目延期
      明确需求文档的格式和标准,尽可能细化需求文档
      (2)需求变化频繁
      建立变更控制
      (3)需求相关的代码,用例找不到,找不全
      建立雪球跟踪

      CR(Changes requirement)需求变更
      CCB(Changes control board)变更控制委员会
      CMO(Configuration management officer)配置管理员
      PM 项目经理
      SWE 软件开发工程师
      STE 软件测试工程师
      QA 质量保证人员
      CI 基线

      —基线变更流程
      1)项目成员提交CR
      2)CMO将CR状态标识为已提交,并将CR提交给CCB进行签发
      3)CCB召开会议对CR进行评估
      4)未通过CMO将CR状态标识为已拒绝并返回提交人
      5)通过,CMO将CR状态标识为已接受,将CR与要修改的配置项发给项目组成员并开放CI的配置库权限
      6)项目组成员执行更改并进行验证
      7)CCB召开会议对修改进行审核,如果通过将CR状态标识为已验证,发给CMO,否则返回修改人
      8)CMO检查验证CR记录,收回配置权限,将CR状态标识为已关闭,返回提交人
      变更控制流程图

      第九章 缺陷管理
      缺陷相关概念
      1什么是缺陷:被测得产品部符合需求和用户使用的实际结果,不符合法律法规
      软件:满足某个功能的逻辑体
      系统:硬件、支撑软件、人员、数据等,综合起来满足某个业务需求的集合体
      2什么可以被定义为缺陷:(缺陷的分类)
      ①缺陷(defect)产品设计与需求设计部符合
      ②错误(error)没有定义的或者未知的错误信息
      ③故障(fault)由于一些原因导致产品失效,重新启动调整后可以恢复用户使用
      ④失效(failure)由于一些原因产品失效,无法自行恢复
      3缺陷提出的目的和意义
      对开发:更好发现缺陷现象,重现和定位缺陷,查找原因,保证所有的缺陷都被修复
      对测试:记录和保证BUG完整一致,回归保证所有的 BUG都验证
      提出问题,把问题交给开发去改
      跟踪缺陷,看是否已经修改
      测试报告,统计数据
      缺陷管理相关概念
      1.BUG管理的目的:
      ①.保证每个缺陷都被修改
      ②.保证每个缺陷都被回归
      ③.缺陷的完整性和一致性
      ④.避免纠纷,降低沟通成本
      2缺陷管理的意义:
      ①提高工作效率(BUG分类,状态负责人)
      ②记录唯一的缺陷信息,保证BUG完整一致(通过设置权限实现)
      ③记录中间环节,是BUG可追溯
      ④统计为测试报告提供数据
      3.参与缺陷管理的角色:
      测试工程师:发现和回归BUG
      测试经理:判断BUG的有效性
      开发经理:分配BUG
      开发工程师:修改BUG
      评审:解决矛盾
      4.缺陷的分类(属性)
      ①按模块分类:例如:登录模块,查询模块
      ②按严重级别分类:blocker阻碍的(不修改该BUG之后的开发测试无法执行)
      Critical崩溃(系统部能用)
      major严重的(严重影响功能使用流程)
      anormal一般的(不会影响主要的功能流程)
      minor轻微的(不会2影响业务流程也不影响使用)
      trvival 界面的
      suggestion建议(可用性,易用性,侧重用户体验)
      ③按优先级别分类:P1----P5(同意 BUG可能会变)
      BUG管理基本流程:

      BUG管理基本流程及相关角色
      1缺陷管理常见流程
      1)BUG回归时没有修改好:测试工程师REOPEN——开发工程师
      2)测试经理认为BUG无效,原因:不是BGU,对需求的理解误差,描述不清楚。BUG不全,重复
      测试工程师NEW----测试经理CAN OPEN-----REJECTED-----测试工程师CLOSED
      3)开发工程师拒绝修改BUG,原因:修复提高项目风险,理解分歧,技术难度大,修复成本高,修改范围广,优先级低
      测试工程师NEW----测试经理OPEN-----开发经理ASSIGNED-----开发工程师CANFIX------开发经理
      4)开发经理拒绝修改或分配BUG,原因:开发与测试已经不同意,偶发,项目风险高,关系进度成败,技术难度大,无法实现,修改成本高,难度大,影响大,影响进度优先级别低
      测试工程师NEW----测试经理OPEN----开发经理ASSIGNED----评审委员会CAN LATER----Y(LATER)-----N开发经理
      5)一般BUG生命周期
      测试工程师NEW----测试经理OPEN—开发经理ASSIGNED----开发工程师fixed----测试工程师CLOSED
      2缺陷状态:
      New新BUG单 Open确认 Reject拒绝 Assigned已分配 Fixed已修复 Reopen回归时未修改正确重新开放 Closed关闭 Later稍后再改 Postpone延迟 Abandon放弃 duplicate重复 verify验证
      测试人员: 无 → New Fixed → Reopen Fixed → Close
      测试组长: New → Open New → Abandon
      开发经理: Open → Reject Open → Postpone Open → Assign
      开发人员: Assign → Fixed
      项目经理: Reject → Passed Reject → Faild Faild → Abandon
      BUG单
      1.BUG单写作准则(5C):
      correct(准确)每个组成部分的描述准确,不会引起误解
      clear(清晰)每个组成部分的描述清晰,易于理解
      concise(简洁)只包含必不可少的信息,不包括任何多余的内容
      complete(完整) 包含复现改缺陷的完整步骤和其他本质信息
      consistent(一致)按照一致的格式书写全部缺陷报告

      2.BUG单模板

      注意:
      1一定可以重现的BUG可以不写“重复几次操作,出现几次,我认为,标题里不能写步骤,不能用主观的话描述,我在 。。。。的,不确定语句:某些好像,禁止使用”之后”,然后之类的语句”之类的话
      2需求规格说明书以外的错误可以当建议报告,不当BUG报告,开发可以改,也可以不改
      3若是随机出现的BUG,要写出操作几次,出现几次
      4若被测软件是跨平台软件,要写上在其他平台下无误
      5禁止写冗余的操作的步骤。常识性的步骤不用写进缺陷操作步骤
      6写明环境数据,如何选择数据,数据如何被破坏
      7一定要交代清楚测试书记,明确处理对那些数据进行操作

      第十章 测试需求分析
      概念:
      1.什么是需求分析:明确做什么,明确测什么,怎么测
      2.需求分析的目的(针对测试而言):
      1)对需求进行细化和分解,从而找到所有的测试点
      2)使从测试覆盖所有的需求(方法:先覆盖业务流,然后模块,关联 非功能)
      3)更细致的需求分析有利于提高测试质量(非软件质量)
      3.测试需求分析的特征
      1)所有的需求项要通过需求分析被核实
      2)测试需求分析应明确指出满足需求的前置条件和不满足需求的前置条件
      3)测试需求分析不涉及具体的测试数据,测试数据是在测试用例中产生
      ★如何做测试需求分析
      1.明确系统框架,有多少个业务流程
      2.明确业务流中有多少个功能测试点,细化分解业务流:
      a)明确每个功能模块的输入、输出、逻辑
      b)满足功能需求的条件和不满足功能需求的条件
      3.明确每个功能的独立处理流程关系
      4.明确功能之间的处理、联系
      5.明确非功能需求和隐性需求 如:安全性、性能、界面美观、易用性等…
      6.系统运行环境包括代码 硬件、软件、外设、数据库、网络
      罗老师的答案
      1考虑非功能性需求
      2挖掘规范需求形成规范需求流程
      3仔细阅读需求规格说明书(找出问题所在)形成问题列表
      4明确该系统的子系统,模块,子模块,功能,子功能(可以借助用例图的方法)
      5明确功能,子功能的流程和逻辑(可以使用活动图,状态图或流程图)
      6挖掘隐性功能,形成隐性功能规范需求
      7找出模块与模块,功能与与功能之间的 关系,确定组合测试需求
      ★UML统一建模语言(Unified Modeling Language)
      1.用例图:被称为参与者的外部用户所能观察到的系统功能模型图
      关系:
      1.关联
      2.泛化 指向父用例 如:
      3.依赖
      a)扩展 指向被扩展者
      b)包含 大的指向小的
      2.活动图:描述了一组顺序的或并发的活动
      状态 活动 开始 结束
      状态转移 循环 集 判断
      泳道
      3包含3个因素:参与者(Actor执行者),系统(Use Case用例),关系(Association关联,Dependency依赖,Generalize继承)

      第十一章 配置管理
      1.什么是配置管理
      a)对所有配置项进行标识,解决了在不同时间周期内,这些文档贯穿整个项目的生命周期并且对配置项进行权限的控制
      b)配置管理的目的(配置管理在解决生命事情,为什么要进行配置管理):解决了保证了软件产品的完整性,一致性,共享性、权限,变更可控、可追溯性
      c)配置管理管理了什么(配置项都包括哪些):配置项 版本 状态
      配置项:项目过程中每个阶段文档产物(SRS,HLD,LLD)代码,开发工具,测试工具,环境(应用服务器,数据库服务器)第三方软件、用户手册,方案、用例等等,
      对象的版本:XX.YY.ZZ.PP
      XX 主版本号——内核程序,核心代号
      YY 子版本号——主要功能、添加功能
      ZZ 维护版本号——增加次要功能,功能改进
      PP 补丁号——SP
      对象的状态状态: 未检查 入基线 冲突 锁
      注:BUG单也算配置项,但是一般单独管理 常用管理工具:QC、Jira、Bugfree、Bugzilla
      2.配置管理流程

      角色:
      项目经理(Project Manger PM)配置管理员(Configuration Mange Officer CMO)开发经理(Development Manger)测试经理 开发工程师 测试工程师
      质量保证人员(Quality Assurance)变更控制委员会(Change Control Board CCB)
      3.SVN实战
      开发可以生成branch 测试经理可以合并branch入trunk 评审可以使trunk入基线并打tag
      启动数据库服务器subversion: 用start svnserve.exe –d –r

      为每个文档建立trunk 然后再为单独的文档建立branch 测试后合并入trunk生成新版本的该文档
      优点:节省空间 缺点:tag版本不配套

      为所有文档建立trunk 每次建立branch都包括所有文档
      优点:所有文档版本相同 缺点:浪费空间
      配置管理工具SVN操作过程手册
      一、如何创建“project”项目版本库
      第一步:在D盘根目录下创建文件夹:“SVNROOT”如图所示:

      第二步:在“SVNROOT”文件夹内创建两个文件夹分别为:“project”,“project1”两个项目。

      第三步:对“project”创建版本库;
      A.选中“project”文件夹,点击右键;

      B.点击“在此创建版本库”。

      C.版本库创建成功后,“project”文件内自动生产以下文件;

      D.打开“conf”文件夹

      备注:对上述三个文件进行解释
      “authz”文件设置“project”操作人员的权限“read、write”;
      “passwd”文件设置操作的用户名和密码;
      “svnserve.conf”文件是“系统配置文件”
      E.对上述3个文件分别进行修改;
      修改“svnserve.conf”

      未修改
      修改处:

      修改方法:将“#”及空格,去掉即可。

      修改后
      修改后对文件另存,存储过程中格式选择“UTF-无BOM”然后点击“保存”。

      点击“保存后”在原文件夹内生产如图文件,这个是ultra edit 的备份文件

      修改完成。
      

      修改“authz”文件

      未修改前
      添加内容:
      p1_group_a=p1_a1
      p1_group_d=p1_d1,p1_d2
      p1_group_t=p1_t1

      [/]
      *=r
      root=rw

      [project:/]
      @p1_group_a=rw
      @p1_group_d=rw
      @p1_group_t=rw

      修改后
      修改后对文件另存,存储过程中格式选择“UTF-无BOM”然后点击“保存”。
      点击“保存后”在原文件夹内生产如图文件

      修改完成。
      修改“passwd”文件

      未修改前
      添加内容为:
      p1_a1=p1_a1
      p1_d1=p1_d1
      p1_d2=p1_d2
      p1_t1=p1_t1

      修改后对文件另存,存储过程中格式选择“UTF-无BOM”然后点击“保存”。
      点击“保存后”在原文件夹内生产如图文件

      修改完成。
      二、如何查看创建的“project”项目版本库
      通过“版本库浏览器”进行查看
      任意空白处点击“鼠标右键”

      点击:“版本库浏览器”

      输入:“svn://localhost/project”

      备注:“localhost”本机的IP地址;
      Project为项目工程名;
      点击“确定”

      问题:为何会出现“无法连接主机“localhost”:由于目前机器积极拒绝,无法连接”
      分析:“Subversion”服务器端“svnserve”服务未启动;

      如何启动“svnserve”服务,操作步骤:
      A.桌面“开始”----“运行”----输入“cmd”;

      B.用“DOS”命令打开此服务
      首先找到该文件:cd c:\Program Files\subversion 进入该目录

      查看该目录里面有哪些文件,用到命令“dir”

      3启动该项服务
      输入:start svnserve.exe –d –r D:/SVNROOT
      备注:D:/SVNROOT为客户端路径。

      运行后弹出一个窗口

      表示此服务已经运行。

      备注:在SVN运行过程中,此窗口 必须一直打开运行。

      服务运行后再次查看创建的版本库

      如图所示,创建版本库成功。
      三、在版本浏览器里面,创建文件,并进行检出
      如何在版本库里面创建文件
      A.在根目录下点击“右键”点击“创建文件夹”

      C.点击“创建文件夹”

      输入文件夹名“trunck”
      D.填写“创建日志”

      E.认证:输入用户名称和密码:
      用户名:p1_a1
      密码:p1_a1

      F.创建成功
      按照此方法在“trunck”根目录下创建“需求分析、RTM文档、测试报告、代码文档、概设文档、详设文档、用例文档”7个文件夹。

      在代码文档里面添加5个代码程序

      A.将5个代码程序 选中后直接拖入“代码文档”中;
      B.点击“复制项到此”

      添加成功。
      C.同样的方法,添加另外4个文件:min.c;mul.c;div.c;main.c;

      添加完成。
      检出添加的文件夹及文件
      A.A.在D盘根目录下建立文件夹“worksp”

      备注:此文件夹为空文件夹
      B.空白处点击“点击右键”

      C.点击“SVN检出(K)….”

      D.检出完成

      备注:检出成功
      E.打开“wroksp”文件夹,出现“trunck”文件夹

      F.打开“trunckt”文件

      G.打开“代码文档”

      备注:版本库浏览器里面的文件全部被检出,检出成功(如图所示)。

      四、如何对该项目入基线
      第一步:打开D盘文件夹“worksp”找到“trunck”文件夹。
      第二步:选中“trunck”文件夹点击“右键”
      选择“分支/标记”

      点击“确定”

      第三步:在D盘根目录中选择“worksp”文件夹,点击“右键”选择“提交更新”

      第四步:查看入基线是否成功,打开文件“worksp”

      第五步:通过“版本浏览器”进行查看;

      入基线成功。

      五、分支文件进行合并
      第一步:在D盘根目录下创建两个文件夹“group1”、“group2”

      第二步:用入基线的操作的方式,创建两个分支“branch1”、“branch2”

      “group1”文件夹

      “group2”文件夹

      第二步:
      “group1”–“branch1”中“代码文档”内添加文件:chengfang.c
      “group2”—“branch2”中“代码文档”内添加文件:kaifang.c
      以添加“chengfang.c”为例:
      A.添加文件“chengfang.c”

      B.选中“chengfang.c”文件点击“增加”

      C.点击“增加”后

      D.选中后“右键”点击“SVN提交”:

      备注:未提交前“代码文档”显示为:

      E.点击确定、添加成功

      添加“kaifang.c”
      同样的方法进行添加
      添加成功后:

      校验是否添加成功
      方法1:点击“worksp”进行更新,检查“branch1”、“branch2”中是否存在添加的两个文件;
      方法2: 版本浏览器查看

      将“chengfang.c”和“kaifang.c”进行合并;
      A.“合并”前“trunck”里面如图

      B.“合并”步骤:
      a.点击 “worksp”中的“trunck”点击“右键”

      将“kaifang.c”合并

      同样的方法对“branch1”中的“changfang.c”进行合并
      C.对“trunck”文件右键进行“提交”

      D.查看合并是否成功
      方法1:“worksp”----“trunck”----“代码文档”查看

      方法二:版本浏览器进行查看

      六、分支冲突的解决
      在D盘根目录下创建2个文件夹分别为“dev1”、“dev2”

      分别点击该文件夹的“右键”—“检出”—“trunck”

      针对“dev1”里面的“代码文档”

      进行修改添加“除数不能为0”;

      修改后“保存”

      “右键”点击“提交”

      针对“dev2”—“代码文档”里面

      进行修改添加“除数不能为0”;

      修改后“保存”

      “右键”进行提交“提交”

      提交失败,起冲突。
      解决冲突
      A.对“dev2”中的“div.c”文件进行更新

      B.更新完成后打开该文件:

      C.对该程序进行修改,完成后对该文件进行“提交”

      D.然后对“代码文档” —“右键”进行“更新”

      E.查看冲突是否解决
      方法1:“worksp”—“trunck”—“代码文档”—“dev.c”
      方法2: 版本浏览器进行查看。

      第十二章 系统测试
      概念:
      1什么事系统测试
      在对软件,硬件,外设,第三方软件,数据,人员,环境,代码,数据库考虑了的情况下,尽可能的模拟用户的使用环境下所做的测试
      另一答案:将已集成的软件系统,作为整个基于计算机系统的一个元素,与计算机硬件、外设、数据、支撑软件、人员等其他元素结合在一起,在实际运行环境下,对计算机系统进行的一系列测试活动
      注:代码称之为数据流,数据称之为信息流
      2系统测试在做什么工作
      验证系统是否满足需求规格说明书SRS
      验证是都满足隐性需求
      验证系统可以支付用户使用
      3系统测试的工作过程
      系统测试个阶段(计划,设计,实现,执行)的输入,输出,入口准则,出口准则
      4系统测试的对象:对整个产品(整个软件系统)
      5系统测试依据什么:SRS
      6系统:整体性、独立性、功能性、环境适应性
      7软件系统:包括支撑软件、数据、硬件、外设、人员及目标软件
      分类:
      功能测试:(Function testing中国 Feature testing国际)
      根据产品的功能是否满足用户需求
      工作内容 1业务,业务流是否正确实现
      2功能点是否正确实现
      3输入是否正确实现
      4输出是否正确实现
      测试工具:QTP(使用 B/S和C/S软件),LR(C/S软件),RIA TEST(针对Flash,Flex软件,用Flash编写),Selenium(firefox的插件), IBM Rational Robot
      工作原理:模拟用户操作
      性能测试:(Sercarity testing)
      定义:验证产品是否满足性能需求
      常用测试点:响应时间和资源性能(CPU,I/O,内存,信道,传输速度)
      例:1.先确认记事本的性能需求(加入50万行内正常)
      2.先输入50万行文本(造场景)
      3.监控所占用的系统资源
      4.报告,提出改进意见
      注:1内存和硬盘的区别
      内存临时存储,电脑关机,信息就消失,内存容量速度快
      硬盘是靠执行存储,断电后也能保存数据,硬盘存储量大,速度慢
      2信道与宽带有关,与访问人数有关
      3吞吐量,每个时间单元的处理数据
      4测试方法:压力测试(stres stesting)短时间
      负载测试(load testing)正常负荷下,长时间运行
      容量测试(volume testing)最大访问量
      5高级录制能找到每个按钮的控件名,低级录制只能找到鼠标移动到的位置
      6没有需求的性能测试无法进行
      测试工具:LR,Webload , Jmeter(开源软件,JAVA编写),Silk Performance
      工作原理:(B或者C端通过传送协议与S进行通信)
      录制协议,模拟多个永和传送协议(可以几句到以点,同时发给S也可以迭代发送给S)通过IP骑在变成不通的IP地址,突显多线程并发操作
      安全性测试:(Security Testing)

      定义:验证产品在系统的内部的安全保护机制和系统外对入侵的防护能力
      考虑内容:1内部包括身份验证,权限,数据的完整一致,数据的保密性(DB中有些数据加密保存)
      2外部,病毒木马,未授权攻击,传输数据安全(传输过程中密码加密,通过HTTP协议传输)
      注:病毒与木马的区别:病毒主要是针对计算机程序的破坏,木马主要用于盗取计算机内的相关机密
      测试工具:MBSA(Microsoft Basehne Sercurity Analyzer),IBM Rational Appscan,X-scan(某黑客组织开发)
      工作原理:监控服务器或客户端那些端口应该被禁止
      安装测试
      定义:产品的安装过程和结果进行测试
      工作内容:根据软件的测试特性列表,软件安装,配置文档,设计安装过程的测试用例
      包括安装前
      安装后
      安装过程中
      安装时异常终止包括:进程终止(操作系统未关闭)断电模式,断网
      测试对象:安装文件、安装系统、安装文档、配置项
      安装后检查:1件是否产生,是否正确
      2否按人工修改的方式安装
      3装日志是否记录正确
      4否有临时目录,垃圾文件,是否清理掉冷补丁(需要关闭系统的补丁) 热补丁(多数网站补丁属于热补丁)
      GUI测试(Graphical user interface)
      又称为用户界面测试,接口测试
      注:GUI测试无法脱离功能测试而独立存在,否则只能测试外观,布局,无法测试行为
      测试内容:对界面元素进行测试,
      验证产品界面是否与SRS设计一致(包括布局,外观,配色,元素行为,元素功能)
      验证界面元素的交互是否正确
      界面元素包括:整体界面,独立元素组合,独立元素
      思路:先找整体界面,再测独立元素组合和独立元素(据对用户的影响严重程度不同)
      测试步骤:对完整的界面进行测试 (包括布局,功能组合,页面展现的外观)
      组合元素(包括拆分,组合行为,独立行为,展现,外观)
      独立元素(包括外观,为)
      工具:所有做功能测试的工具都可以做GUI的测试
      可用性测试(Usability testing)
      又称易用性测试

      定义:验证用户管理和使用软件的容易程度
      工作内容:是否符合用户的实际习惯
      是否符合用户的特殊要求
      操作是否合理,简单,容易理解
      是否有明确的提示可以指导下一步操作
      异常性测试
      系统允许的操作
      健壮性测试,系统不允许的操作
      文档测试
      说明书,与易用性一起做
      备份测试
      主要测试备份策略
      目的:为了解决风险
      备份策略包括:本地备份,异地热备份(实时备份),本地异步备份,异地异步备份
      还原策略:(又称恢复策略)
      配置测试
      又称兼容性测试
      包括软件配置和硬件配置,验证系统都可以使用那些软硬件配置
      网络测试

      主要测试网络中的协议和数据
      工作内容:1网络协议测试(协议是否正确)
      2网络传输是否正确(不同网络是否正常)
      3网络结果测试

      第十三章 用例设计
      等价类
      定义:1、等价:如果多个输入在程序中处理方式(路径)相同,则认为这些输入是等价的,测试一个即可。(前提:测试不能穷举)
      2、输入:分为两类,有效输入(可以保存)、无效输入(不可保存)
      3、结合:有效等价类、无效等价类
      满足规则:只需寻找一个全部满足规则的(有效等价类)
      不满足规则:需分开,每条不满足条件的举出一个,方便定位错误(无效等价类)
      规则的几种情况:
      1 若规则是布尔式的
      有效、无效分别取一个 一个真,一个假
      2. 若规则是区
      有效的取一个 无效的,在小于区间的取一个,大于区间的取一个,空或零取一个
      3. 规则是集合:
      有效取一个 无效的在集合外取一个
      4. 规则是必须满足的一个条件:
      对无效,要细分无效(先试试其他有效等价类,再试试全部等价类全都不满足)
      例:邮箱注册,注册名只能以小写字母开头,设计无效等价类时,先试试其他有效等价类,如大写字母、数字等,再试试其他有效全部都不满足的情况
      有效等价类:程序规格说明有意义,合理的输入数据
      无效等价类:程序规格说明无意义,不合理的输入数据

      ASCII码
      7位 表示27=128个字符 每个字符存储占用1个字节
      分类:不可见字符
      控制字符:LF(换行)、CR(回车)
      通信字符
      NULL(空)
      可见字符
      空格
      数字
      字母(大写、小写)
      符号
      练习
      1.1年龄注册
      注册页面要求输入年龄,限制:1到150期间的正整数
      1、需求分析—找出全部的输入条件
      1)、正整数
      2)、[1,150]
      注意:分解的过程中,条件之间不用组合(完全独立),在设计有效用例输入的时候再考虑组合(一对多)
      2、绘制等价类表格
      条件 有效等价类 有效编号 无效等价类 无效编号
      正整数 >1 A01 数字 小数 B01
      负数 B02
      0 B03
      非数字 空(NULL) B04
      空格 B05
      字母 B06
      符号 B07
      [1,150] [1,150] A02 <1 B08
      >150 B09

      3、设计测试用例输入
      原则:有效输入—尽可能多去覆盖有效等价类 (一对多)
      无效输入—只能覆盖一个无效等价类 (一对一)
      目的:A、出现问题可以更好的去定位
      B、有可能第一个无效处理后,后续无效值被漏测
      输入序号 有效输入值 覆盖有效等价类 输入序号 无效输入值 覆盖无效等价类
      1 100 A01、A02 2 1.8 B01
      3 -9 B02
      4 0 B03、B08
      5 空(NULL) B04
      6 空格 B05
      7 W B06
      8 @ B07
      9 200 B09
      1.2.年龄注册
      某保险公司注册页面要求输入年龄,限制:1到150期间的正整数,其中:
      [1,10] 适用的费率 10%
      [11,50] 适用的费率 30%
      [51,150] 适用的费率 80%

      条件 有效等价类 有效编号 无效等价类 无效编号
      正整数 >1 A01 数字 小数 B01
      负数 B02
      0 B03
      非数字 空(NULL) B04
      空格 B05
      字母 B06
      符号 B07
      [1,150] [1,10] A02 <1 B08
      [11,50] A03 >150
      [51,150] A04

      输入序号 有效输入值 覆盖有效等价类 输入序号 无效输入值 覆盖无效等价类
      1 5 A01、A02 4 1.8 B01
      2 30 A01、A03 5 -9 B02
      3 100 A01、A04 6 0 B03、B08
      7 空(NULL) B04
      8 空格 B05
      9 W B06
      10 @ B07
      11 200 B09
      1.3.扩充
      考虑全角和半角问题(GB231)
      其中,半角占1个字节
      全角占2个字节

      字符集
      1、ASCII
      2、GB2312 -> GB18030 一个汉字占2个字节
      BIG5(繁体)
      3、ISO Unicode (UTF-16) -> UTF-8(变长存储) 一个汉字可能占3个字节
      条件 有效等价类 有效编号 无效等价类 无效编号
      正整数 >1(半角) A01

      			0	B03
      >1(全角)	A02	半角字符	空(NULL)	B04
      			空格	B05
      			字母	B06
      			符号	B07
      		全角字符	空格	B08
      			字母	B09
      			符号	B10
      		汉字
      

      (字符集) GB-2312 B11
      BIG-5 B12
      [1,150] [1,150] A03 <1 B13
      >150 B14

      分解粒度:根据功能的重要性决定(用例图----执行者角色,考虑用户的关注功能)
      根据成本、时间决定
      取消负数、小数的原因:
      1、前提:在编辑框内输入年龄,程序在接收编辑框的内容时,一般以字符(或字符串)的形式接收,再根据需要进行类型转换,如年龄,需要转换为整型
      2、小数中的“小数点”和负数中的“负号”都认为是符号,不允许保存
      边界值
      取值(5个):上点、内点、离点
      1、上点、内点取值与区间的开闭无关
      2、离点和上点互为有效
      作用:(有序、有范围)等价类的补充
      补充:考虑数据类型的边界
      如 int 类型 占4个字节 即 32bit 取值范围[-231, 231-1]
      上点:边界上的点
      内点:区间内的点
      离点:离边界值最近且与上点不属于同一等价类的点(对于小数,没有离点,不用取)
      规则的几种情况:

      1. 规则是区间:
        按上点、内点、离点取
      2. 规则是取值的个数:
        取最小、最大、中间个数
        3.规则是a~z序列:
        取a、z
        4.规则是集合:
        取一个集合内的,取一个集合外的
        (0,20)上点是0,20 离点是1,19 [0,20]上点是0,20 离点是-1,21
        若规则是下拉菜单:建议每个下拉值都选择一个
        2.1.年龄
        条件 有效等价类 有效边界值 有效编号 无效等价类 无效边界值 无效编号
        正整数 >=1 上点:1 A01 数字 小数 B01
        内点:100 A02 负数 B02
        离点:0 0 B03
        非数字 空(NULL) B04
        空格 B05
        大写字母 上点:A B06
        上点:Z
        内点:M
        符号 离点:@ B07
        离点:[
        [1,150] [1,150] 上点:1 A03 离点: 0 B08
        上点:150 A04 离点: 151 B09
        内点:100 A05
        有效用例输入:1 、100、150
        2.2.用户名注册

      1、测试需求分析
      1、内容:字母、数字、
      2、长度:[6,18]
      3、约束:字母开头
      字母或数字结尾
      不允许重名
      不允许使用保留字
      自动去除首尾空格
      2、等价类划分
      条件 有效等价类 有效编号 无效等价类 无效编号
      内容 字母 大写字母 A01 符号(除下划线) B01
      小写字母 A02 NULL(空) B02
      数字 [0,9] A03 空格 B03
      下划线 下划线 A04 GB2312 B04
      BIG5 B05
      长度 [6,18] [6,18] A05 <6 B06
      >18 B07
      约束 字母开头 大写字母开头 A06 数字开头 B08
      小写字母开头 A07 下划线开头 B09
      符号(非下划线)开头 B10
      汉字开头 B11
      字母或数字结尾 大写字母结尾 A08 下划线结尾 B12
      小写字母结尾 A09 符号(非下划线)结尾 B13
      数字结尾 A10 汉字结尾 B13
      不允许重名 不重名 A11 重名 B15
      去除首尾空格 A12
      不允许使用保留字 不使用 A13 使用保留字 B16
      3、用例设计
      序号 有效输入 有效边界值 序号 无效输入 无效边界值
      1 (当前系统无AAb_4)
      AAbb_4 A01、A02、A04、A03
      A05、A06、A10
      A11、A13 5 abc@a B01
      2 (当前系统无AAb_4)
      aAbcvb_A A01、A02、A04、A03
      A05、A07、A08
      A11、A13 …………
      3 (当前系统无AAb_4)
      aA555b_b A01、A02、A04、A03
      A05、A07、A09
      A11、A13 (当前系统存在aaf5bc)
      (空格)aaf5bc(空格) B15
      4 (当前系统无aaf5bc)
      (空格)aaf5bc(空格) A12 Administrator B16
      2.3.变量命名
      在某一版的编程语言中对变量名称规格作如下规定:变量名称是由字母开头的,后跟字母或者数字的任意组合构成,并且区分字母大小写。编译器能够区分的有效字符数为8个,并且变量名称必须先声明,后使用,在同一声明语句中,变量名称至少必须有一个。
      1、测试需求分析
      内容:字母、数字
      长度:[1,8]
      约束:字母开头
      大小写敏感
      先声明后使用
      变量的个数[1,?] (需要和需求人员沟通)
      在同一作用域中不允许重名
      不能使用关键字
      2、等价类划分
      3、确定边界值
      4、设计用例输入
      2.4.进销存价格

      代码实现:
      if (isNumberString(document.form2.tichen.value,“1234567890.”)!=1)
      {
      alert(“价格只能为数字!”);
      return false;
      }

      根据代码的实现,价格编辑框只接受键盘的“数字键”和“小数点”共11个字符

      等价类
      条件 有效等价类 无效等价类
      内容 数字 字母
      字母、符号处理方式(路径)相同,认为都是等价的
      小数点
      约束 小数点最多有1个 >1个小数点

      2.5.Windows文件命名
      目录 目录长度 文件最大长度 目录+文件最大长度
      C:\ 3 255个 = 258
      C:\ABCD 7 251个 =258
      C:\ABCD\AAAA 12 246个 =258

      根目录: 255
      非根目录: 254 (文件夹最小长度为1)

      1、测试需求分析
      内容:非“/😗?"<>|”的字符
      长度: 根目录: 255
      非根目录: 254 (文件夹最小长度为1)
      约束:同目录下不能重名(去除首尾空格)
      不同扩展名使用不同的图标
      不能为空
      总结
      1、适用范围:针对程序的输入
      2、使用步骤
      1)、测试需求分析,找出全部条件(显示、隐士)(条件之间不能交叉或者组合,到设计用例的时候再考虑多条件的组合)
      2)、划分等价类
      划分依据:相同的处理方式(路径)
      分类:有效等价类、无效等价类
      3)、使用边界值补充(有序、有范围的)等价类
      内容:上点、离点、内点
      要求:上点、内点与区间开闭无关,离点和上点互为有效
      分类:将边界值分为有效边界和无效边界,填入等价类表格
      4)、对每个等价类进行唯一的编号
      5)、设计用例的输入
      原则:有效等价类,一对多
      无效等价类,一对一
      3、优点:对输入的考虑充分
      4、缺点:如果不清楚系统的实现方式,造成大量的冗余用例(黑盒方法共有)
      对于多输入的组合不太适宜
      规则的几种情况:
      1 .若规则是布尔式的
      有效、无效分别取一个 一个真,一个假
      2. 若规则是区间
      有效的取一个 无效的,在小于区间的取一个,大于区间的取一个,空或零取一个
      3. 规则是集合:
      有效取一个 无效的在集合外取一个
      4. 规则是必须满足的一个条件:
      对无效,要细分无效(先试试其他有效等价类,再试试全部等价类全都不满足)
      例:邮箱注册,注册名只能以小写字母开头,设计无效等价类时,先试试其他有效等价类,如大写字母、数字等,再试试其他有效全部都不满足的情况
      有效等价类:程序规格说明有意义,合理的输入数据
      无效等价类:程序规格说明无意义,不合理的输入数据
      边界值
      上点:边界上的点
      内点:区间内的点
      离点:离边界值最近且与上点不属于同一等价类的点(对于小数,没有离点,不用取)
      规则的几种情况:

      1. 规则是区间:
        按上点、内点、离点取
      2. 规则是取值的个数:
        取最小、最大、中间个数
        3.规则是a~z序列:
        取a、z
        4.规则是集合:
        取一个集合内的,取一个集合外的
        (0,20)上点是0,20 离点是1,19 [0,20]上点是0,20 离点是-1,21
        若规则是下拉菜单:建议每个下拉值都选择一个

      第十四章 系统测试执行
      测试用例
      编号组成: 项目名—测试阶段—需求—用例
      测试环境搭建文档:
      1.为日后回归测试等搭建环境做指导
      2.刚开始写完后,评审,防止日后因环境搭建而引起测试时的问题
      3.可为日后上线的文档做参考
      4.可以做自动化步骤的参考
      5.项目留存
      用例执行:
      1.严格按照用例步骤,执行用例
      2.发现结果与预期结果不一致:
      a)重复步骤,重现发现的问题
      b)找同类型的数据,重新执行用例
      c)定位发现问题的步骤 (每执行一步都要做记录)
      3.提交BUG (先确认不是重复BUG)
      填BUG报告:
      (一)若开发返回”不可重现的BUG”,可能原因:
      1.开发步骤不对
      2.测试环境和开发环境不同
      3.出现时有概率的,或者其他原因导致,不是每次重现 (环境、概率)
      (二)合并BUG的原则
      1)同样的原因产生的BUG可以合并
      2)与开发沟通后如果修改一处就可以修改一些BUG可以合并
      3)当BUG之间有制约关系,BUG可以合并
      (三)补充 为什么.TXT文件中报春”联通”重新打开后会有乱码
      文件保存格式默认为ASCII码,但恰好”联通”是以EF开头的,保存时误认为UFT-8格式,导致重新打开时歘先乱码
      (四)书写测试用例应该注意一下几点
      1)测试输入数据必须是唯一的,并且明确的
      2)步骤要完整,按照步骤可以测试测试点和预期结果,建议每个步骤后面都有预期结果,步骤要编号
      3)结果要和需求规格说明书完全一致,如果SRS没有明确结果,需要产品人员补充和定义
      4)无效等价类不能合并

      第十五章 QC(Quality Center)
      QC (Quality Control)质量控制
      QC(前身TD Test Director与QTP、LoadRunner同是MI公司开发)
      QC是B/S架构的
      QC 9.0支持JBoss、IIS两款服务器支持SQL Server和Oracle两个数据库
      QC默认端口是8080 数据库连接端口是1433
      Quality Center QC前台
      Site Administration QC后台
      Add-Ins Page QC插件
      Qcsiteadmin_db 是保存后台数据的 而前台中项目的数据,是单独保存在另一个数据库中
      QC预置5个用户组,只能查看,不能修改权限
      Developer Project Manger QATester TDAdmin Viewer
      外部测试人员,只有Defects Module权限,只执行测试,报BUG
      组内测试人员,有QC所有模块权限
      QC后台:
      Site Project 设置项目
      Create Domain 建立区域
      Create Project 建立项目
      Create an empty Project 建立一个空项目
      Create project by copying data from an existing project
      从已有项目拷贝创建一个新项目

      Create a project by importing data from an exported Quality Center project file
      从一个已有项目的导出文件创建一个新项目

      QC前台:
      TOOLS下的Customize…选项
      Customize Project Entities 设置输入项 可添加新选项
      Customize Project Lists 项目列表 可设置下拉列表中的项
      Requirements 需求模块
      菜单栏下Requirements菜单项
      Covert to Tests 将需求转换成测试用例 用于比较系统的测试
      Generate Test…将需求生成测试执行 用于临时的测试
      菜单栏中View菜单项
      Expend 扩展,全部展开
      Collapse 收起
      Numeration 排序
      Full Coverage 完全覆盖(考虑测试覆盖率)
      Requirements Tree 需求树结构 用于项目经理等管理者
      Requirements Grid 需求表结构 用于浏览者(可用Favorites)
      Requirements Coverage 需求覆盖率 用于测试人员
      Coverage Analysis 需求分析视图 用于测试管理者
      菜单栏中Analysis菜单项
      Reports选项下
      Standard Requirements Report 标准需求表 用于评审
      Tabular Requirements 概要表 用于产品经理
      Requirements with Coverage Tests 带覆盖率的表 用于测试经理
      Requirements with Coverage Tests and Steps 带步骤的 用于测试用例评审
      Requirements with Linked Defects 带缺陷的 用于生成测试报告
      Graphs选项下
      Progress 给项目经理
      Requirements Coverage 给测试经理
      Trend 给BOSS
      工具条中Set filter/Sort 过滤器 用*做通配符
      View Order 结果排序 同级才能排序
      双击一条需求 Requirement Details 需求详细信息
      Coverage 覆盖率
      Linked Defects 连接缺陷
      需求的状态:not covered not run not complete passed failed
      Test Plan 测试用例模块
      点击一条测试用例,右侧在Design Steps标签页下
      Call to Test 调用测试用例 只能调用到一个参数 可用于回归测试
      Generate Script 生成脚本
      Insert Parameter 添加参数
      Renumber Steps 重新写序号 (不影响步骤的内容)
      菜单栏中Tests菜单项
      Flag for Follow up 标记一个执行
      Mark as Template Test 标记成为模板用例
      菜单栏下View菜单项
      Trace Changes 变更跟踪警告
      Analysis中所有报表均是测试工程师用
      Test Lab 测试执行模块
      需要添加一个集,用例才能被添加到集
      菜单栏下Test Sets菜单项
      Reset Test Set 重置测试集 用于测试回归,所有状态均为No Run
      Purge Runs 清理执行的状态 清理执行的状态,上个是全部,此为条件式
      状态优先级:
      Failed > Not Complete或N/A或No Run > Passed
      Trace Changes
      在Test Plan中,跟踪的是需求Requirements
      在Test Lab中,跟踪的是缺陷Defects状态时”Fixed”时
      在Defects中,跟踪的是Test Lab成功运行时
      其中红色! 表示未看过 灰色表示已看过
      QC中,Defects只能连接自己,不能连接其他而 Requirements、Test Plan、Test Lab可以连接其他任何一个,不能连接自己,所以,Defects单独划出一个模块
      权限设置:
      需求人员:写需求
      测试人员:用例、BUG、执行用例
      开发人员:改BUG
      项目经理:所有权限
      当产生纠纷时,在设置中增加一个状态,在Defects中的Description选项中的Comments下添加分歧的描述、原因等等,分配给解决纠纷的人,只有被分配的人可以修改状态,其他人不能更改

      变更控制:
      能否变更 用Reviewed(评审)字段,将之设置成必填项,默认值是Not Reviewed
      设置权限中,不给需求人员修改Reviewed的权限

      第十六章 PYTHON
      Python 是面向过程、面向对象,跨平台的高级脚本语言。 是解释性语言,执行源代码,提供丰富的库,支持多线,多进程,网络编程,可以支持C/C++的代码,可以测试C/C++和Python开发的单元产品,Python越来越多的成为开源测试自动化工具的首选语言
      Python的安装
      1.安装之前,先退出杀毒软件
      2.安装 缺省安装
      3.完毕后,配置系统环境变量 path (把解释器pathon.exe所在目录加入path)
      Python的集成环境:
      1.Python文件夹下IDLE
      2.新建文件 New Window
      3.保存(用Save As…后缀.py)
      4.运行方式:
      a)Run Module (若提示”Socket Error”是因为杀毒软件引起的错误)
      b)命令行方式 在DOS下,进入文件目录,输入命令python hello.py
      python可以用#来做注释
      输入中文时在前面加#coding:gbk
      在GUI界面下 若不加保存时会报警告

      补充知识:
      DOS命令:
      切换盘符 盘符名:
      进入文件夹 cd 文件夹名\文件夹名…
      退到根目录 cd
      退出一层目录 cd…
      数据类型:
      Str字符型字符串(可以用单引号、双引号) Int 整形 long长整形 float浮点型 bool(布尔型):True真/False假(首字母大写,不用加引号)
      运算符:
      算术运算符: + — * /
      逻辑运算符: and or not
      比较运算符: 相等 = = 不等于 != < > <= >=
      缩进:
      在行首用空格或者Tab 缩进相当于C语言中的{ } 表示对应一段完整的逻辑
      一般用TAB 因为一段代码中不能同时使用两种缩进方式,默认是TAB
      控制语句:
      IF条件
      1 if (条件1):
      处理语句1
      处理语句2
      处理语句3

      语法解释:满足条件1执行语句1,2,3,不满足条件1执行语句
      2 if (条件1):
      处理语句1
      处理语句2
      elif
      处理语句3

      语法解释:满足条件1执行语句1,2不满足条件1,执行语句3
      3 (1) if (条件1): (2)if (条件1):
      处理语句1 处理语句1
      处理语句2 处理语句2
      elif (条件2): else:
      处理语句3 if(条件2):
      处理语句4 处理语句3
      … 处理语句4
      else: else:
      处理语句5 处理语句5
      处理语句6 处理语句6
      … 。。。。
      处理语句7 处理语句7

      语法解释:满足条件1执行语句1,2,7,不满足条件1,满足条件2,执行语句3,4,7,不满足条件1,2,执行语句5,6,7
      注:条件中可以用逻辑运算符 比较运算符
      条件后面要加“;”
      WHILE循环
      while (条件):
      处理语句1
      处理语句2

      处理语句3

      语法解释:条件为真(满足条件)执行语句1,2,在判断条件,还满足条件的话,还执行1,2直到不满足条件,执行语句3

      while (条件1):
      if (条件2):
      处理语句1
      处理语句2

      elif (条件3):
      处理语句3
      处理语句4

      else:
      处理语句5
      处理语句6

      处理语句7

      语法解释:条件1为真,判断条件2,条件2为真,执行语句1,2,在判断条件1,当条件1 为假,执行7
      条件1为真,判断条件2,条件2为假,,在判断条件3,当条件3为真,执行语句3,4,判断条件1,当条件1为假,执行语句7
      条件1为真,判断条件2,条件2为假,,在判断条件3,当条件3为假,执行语句5,6,判断条件1,当条件1为假,执行语句7
      FOR循环
      for 变量 in 集合函数: 注:range是一个集合函数
      处理语句1
      处理语句2

      处理语句3

      语法解释:变量值在这个集合函数之内执行语句1,2,循环执行1,2,直到变量值不在集合函数范围内,执行语句3
      例题:for I in range(1,7); #循环了6次
      print”sjsddsj”
      BREAK \ CONTINUE
      break \ continue 只能用在循环语句中(for ,while)。
      break:跳出循环,执行循环体外的第一条语句,无论循环体内还有多少语句
      continue:跳过循环体内的语句去执行循环条件的条件判断

      	while (条件1):
      		  处理语句1
              处理语句2
      			if (条件2):
          			处理语句3
         			break
      		 	else:
          			处理语句4
          			continue
      

      处理语句5
      处理语句6

      语法解释:条件1为真,条件2为真,执行1,2,3,6
      条件1为真,条件2为假,执行语句1,2,4,1,2,4执行到条件1为假后,执行语句6
      条件1为假,执行语句6
      这个程序没有执行过语句5

      程序举例:
      a=1
      i=1
      while (a<=10):
      a=a+1
      if (a==10):
      break
      else:
      continue
      i=i+1
      print a
      print i
      运行结果:a=10 i=1
      函数
      1 type () 查看变量的数据类型

      2 Raw-input (“提示信息”) 输入函数(从界面输入的均是字符型)

      3 isdigit() 判断变量a是否是纯数字

      4 int() 强制转换类型

      5 Print输出函数
      6 range 集合函数
      Range(起始值,结束值,步长)求从开始值到小于结束值,并且以步长为某一个值的等差数列

      定义:
      Def 函数名(形参列表):
      函数体语句
      Return 返回值 #若没有返回值,不加这句
      程序举例:Def fun(a,b,c):
      Print a,b,c
      Return a+b+c
      调用:
      有返回值
      变量名=函数名(实参列表)
      例:M=fun(‘3’,’4’,’asd’)
      无返回值
      函数名(实参列表)

      第十七章 单元测试
      单元测试概念:
      1什么是单元测试:对软件的基本组成单元所作的测试(面向过程(一组函数或一个函数)面向对象(类中得方法))
      2语句:真正的处理语句才算是语句(判断框中的语句不算)。
      判定:流程图中的菱形框;
      判定数:流程图中菱形框的个数;
      分支:判定的真或假;
      分支数:判定数2;
      条件:判定中关系(比较)运算符;
      条件数:判定中关系(比较)运算符的个数;
      条件结果数:条件数
      2(每个条件有真、假两个取值)。
      3单元测试的目的:与LLD是否符合;与SRS是否符合;编程是否存在问题。
      4关注重点包括:单元接口(类型,顺序,长度,参数个数);局部数据结构;独立路径;边界值;出错处理。
      5单元测试环境包括:被测单元、驱动单元(把被测单元驱动起来,完成被测单元的调用)、桩单元(被测单元的调用的替代品,替代输入与输出),测试用例(测试数据)。
      6驱动单元的四个职责1)接收侧四数据包含测试用例输入好预期输出
      2)吧测试用例输入传送给要测试的单元
      3)将被测单元的实际输出和预期输出进行比较,得到测试结果
      4)将测试结果输出到指定位置
      7辅助技术:评估,框架应用
      8桩单元:通过一组输入和输出模拟被替代单元的行为
      单元测试静态测试:
      1.从详设的评审开始介入
      2.详设评审、编码完成后,作代码的静态检查
      (可以用专门的检查工具 如:PC_lint)
      3.代码的交叉走读 (要制定标准,标准越清晰,任务被分配者越有目标,工作越细)
      单元测试动态测试:
      1写用例之前,先确定覆盖率标准
      2写用例
      3搭建测试环境
      4执行
      5测试报告
      测试评价准则:
      系统测试评价准则:需求覆盖率(=至少被用例覆盖一次的需求项数/测试需求分析列表中的需求项数)。
      单元测试评价准则:逻辑覆盖率(=item至少被评估一次的次数/item总数)【这是一个总公式】。
      逻辑覆盖率
      逻辑覆盖率包括以下几种:语句覆盖率、分支覆盖率、条件覆盖率、分支条件覆盖率、路径覆盖率。【掌握计算公式、每种覆盖率的问题】
      1语句覆盖率=语句至少被执行一次的次数/语句总数。
      问题:有可能语句覆盖率为100%,有可能发现逻辑运算符的问题
      2判定覆盖率=每个分支取值至少被执行一次的次数/分支总数(判定数2)
      问题:当分支覆盖率为100%时,可能不能发现关系运算符的缺陷
      3条件覆盖率=每个条件取值至少被执行一次的次数/条件结果总数(条件数
      2)
      问题:条件覆盖率为100%时,有可能某个分支没有执行到,若该分支有缺陷,可能会遗漏。
      4分支覆盖率=(每个分支至少被执行一次的次数+每个条件取值至少被执行一次的次数)/(分支总数+条件结果数)
      问题:分支条件覆盖率为100%时,有可能漏路径,若该路径上有缺陷,可能遗漏
      5路径覆盖率=每个路径至少被执行一次的次数/路径总数
      问题:路径覆盖率为100%时,条件覆盖率可能不为100%
      注:独立路径覆盖,若路径覆盖率100%则条件、语句、分支覆盖率均100%
      路径一定要从始点到终点
      可以用软件来计算路径覆盖率 如BullseyeCoverage

      单元测试策略
      孤立、自顶向下、自底向下。
      ⑴ 孤立测试
      缺点:需要大量的桩和驱动
      优点:改方法是最简单最容易操作的 ,可以达到高的结构覆盖率,该方法是纯粹的单元测试
      方法:不考虑每个模块与其他模块之间的关系,为每个模块设计桩模块和驱动模块,每个模块进行独立的单元测试
      【例1】
      对象 驱动 桩
      A Driver-A Stub-B
      B Driver-B Stub-C
      C Driver-C X

      【例2】
      对象 驱动 桩
      A Driver-A Stub-B,C
      B Driver-B Stub-D
      C Driver-C Stub-E
      D Driver-D X
      E Driver-E X

      ⑵自顶向下的单元测试策略
      方法:先对最顶层的单元进行测试,把顶层所调用的单元做成桩模块。其次,对第二层进行测试,使用上面已测试的单元做驱动模块。如此类推直到测试完所有模块。
      优点:可以节省驱动函数的开发工作量,测试效率高。
      缺点:随着被测单元一个一个被加入,测试过程将变得越来越复杂,并且开发和维护的成本将增加。
      【例1】
      对象 驱动 桩
      A Driver-A Stub-B
      B Driver-A Stub-C
      C Driver-A Stub-D
      D Driver-A X

      【例2】
      对象 驱动 桩
      A Driver-A Stub-B,C,D
      B Driver-A Stub-E,C,D
      C Driver-A Stub-E,D
      D Driver-A Stub-F,E
      E Driver-A Stub-F
      F Driver-A X

      【例3】
      对象 驱动 桩
      A Driver-A Stub-B,C
      B Driver-A Stub-C,D
      C Driver-A Stub-E,D
      D Driver-A Stub-F,E
      E Driver-A Stub-F
      F Driver-A Stub-G,H
      G Driver-A Stub-H
      H Driver-A X

      a. 看被测函数下边有没有调用,如果被调用则打一个桩
      b. 假如曾经被测过的函数的时候,这些函数下边是否有调用,而那些调用是否也被测过,如果没有被测过,也需要打桩
      c. 只要驱动单元驱动的时候,所依赖的函数要run的时候,相关的调用都需要加入
      ⑶自底向上的单元测试方法
      方法:先对模块调用层次图上最低层的模块进行单元测试,模拟调用该模块的模块做驱动模块。然后再对上面一层做单元测试,用下面已被测试过的模块做桩模块。以此类推,直到测试完所有的模块
      优点:可以节省桩函数的开发工作量,测试效率较高。
      缺点:不是纯粹的单元测试,底层函数的测试质量对上层函数的测试将产生很大的影响。
      对象 驱动 桩
      E Driver-E X
      C Driver-C X
      F Driver-F X
      B Driver-B X
      D Driver-D X
      A Driver-A X

      如果桩难写,采用自底向上;如果驱动难写,采用自顶向下。
      打桩原则:1被测函数有没有调动,若有调动则打桩
      2加入曾经被测过的函数,这些函数是否有调动,这些调动是否被测过,都没有则打桩
      【例子】
      自底向下
      对象 驱动 桩
      F Driver-F X
      I Driver-I X
      J Driver-J X
      G Driver-G X
      H Driver-H X
      E Driver-E X
      C Driver-C X
      D Driver-D X
      B Driver-B X
      A Driver-A X
      自顶向下
      对象 驱动 桩
      A Driver-A Stub-B
      B Driver-A Stub-C,D
      C Driver-A Stub-E,D
      D Driver-A Stub-E
      E Driver-A Stub-F,G,H
      F Driver-A Stub-G,H
      G Driver-A Stub-I,H
      H Driver-A Stub-I,J
      I Driver-A Stub-J
      J Driver-A

      单元测试用例设计(基本路径覆盖法)★ (面试)
      步骤:(所有的循环仅执行一次)
      1)画流程图
      2)根据流程图画出流图
      3)根据流图找出独立路径
      4)根据独立路径设计用例
      结点:表示一个或者多个无分支的语句
      边:表示处理流向
      分支:判定真假的语句
      区域:由结点和边构成的,域的个数等于独立路径的条数
      注:路径一定要从始点到终点
      复杂性计算 :V(G)=E-N+2
      V ( G ) =P+1
      E:边,
      N:结点数量,
      P:条件结点的数量,
      V最好不要大于10
      程序控制流图
      1顺序结构
      2if结构
      3while循环结构
      4until重复结构
      5Case分支结构(swith结构)

      单元测试执行
      单元测试执行的过程:
      单元计划—单元设计—单元测试用例脚本----单元测试执行
      1.搭建环境 引入googletest
      a)将googletest的include和lib两个文件夹复制到VS的项目文件夹下
      b)在Visual Studio中选择项目,属性,将include和lib导入
      c)引入googletest头文件
      #include “gtest/gtest.h”
      d)在main函数中初始化GTEST
      testing::InitGoogleTest(&argc,argv); 初始化google test
      RUN_ALL_TESTS(); 运行当前工程所有test
      2.加入被测代码
      将被测代码头文件引入
      3.新建测试代码
      新建一个文件,编写测试代码
      调用googletest宏
      TEST(测试套名字,测试用例名字)
      {
      ………
      }
      用断言函数(ASSERT、EXPECT)来判断预期结果与实际结果
      ASSERT:致命断言,若前一个执行失败,则不继续执行
      EXPECT:一般断言,前一个执行失败,继续执行
      系统测试中发现不了在单元测试中比较容易发现的问题,如内存泄露、算法缺陷
      补充:
      C语言中,用malloc申请内存,free释放内存
      C++中,用new申请内存,delete释放内存
      TDD(测试驱动开发)
      内存中的堆、栈
      编译器自动分配的内存是在栈中,栈会自动维护、清理
      手工分配的内存是在堆中,堆不会自动清理,需要手工释放,容易忽略造成内存泄露

      单元测试框架

      1. 框架是一组为重用而设计的方法,单元测试框架包括junit\cppunit\phpunit\c#unit\pyunit
      2. pyunit是 d:\py26\unittest.py
      3. 单元测试框架概念
        测试固件(test fixture)
        一组测试函数执行前或执行后要执行的语句。
        例如,void insertDB(chr sql[30])
        {
        //执行insert语句
        }
        若现在测试该函数,实际上每次测试之前都要建立数据库连接,测试完成之后都要断开断开数据库连接。
        建立连接和断开连接称之为测试固件。测试固件在框架如何体现:
        setUP(…) —表示测试函数执行之前要执行的语句,比如建立连接
        teardown(…) —表示测试函数执行之后要执行的语句,比如断开连接
        有没有测试固件,取决于被测函数在测试执行需要否

      测试用例
      主要以测试函数为主,什么是测试函数?就是对被测单元完成测试的函数,类似于原始的驱动单元。
      在框架中一般来说要继承单元测试框架的TestCase。

      测试套件
      装配测试用例的车间。
      在框架中一般来说使用TestSuite的addTest方法来进行装配,装配的就是测试用例,实际上装配的用例中的测试函数。

      测试运行器
      加载测试套件,对套件中装配的测试函数的运行。
      在框架中一般来说使用TestRunner中的run方法来进行运行TestSuite。
      4. pyunit框架中有:
      unittest.py
      测试固件 -----》TestCase类中有setUp和tearDown有这两个方法
      测试用例 -----》TestCase类,在该类中写测试函数的方法 ????
      测试套件 -----》通过TestSuite类中的addTest方法将测试用例中的测试函数加载
      测试运行器-----》通过TextTestRunner中的run方法将测试套件运行起来。
      5. 实例:
      见例子
      6. 使用pyunit单元测试步骤:
      1)import unittest
      2)继承unittest.TestCase构建自己的测试类
      3)在自己构建的测试类中,若对于测试函数有测试固件,则在setUp和tearDown中进行代码编写。否则跳到1)

      第十八章 集成测试
      1什么是集成测试
      依据概要设计说明书,对软件组成的所有函数模块和子模块进行的测试
      2目的:检查软件是否符合概要设计说明书,是否符合需求
      3关注重点
      全局变量 组合功能(集成后的问题)单元接口(1穿越模块的数据是否会丢失,即做输入输出的的形参定义是否正确2全局数据结构是否被异常修改)
      4集成测试环境
      集成后的功能:单个功能都没有问题,组合在一起时否有问题,单个功能之间是否相互影响
      进程:是一个程序在计算机上的一次执行活动,当运行了一个程序就启动了一个进程,进程是操作系统进行资源分配的单位
      线程:是进行中的一个片段
      集成测试没有联系,不存在集成,联系时全局变量,全局变量可能是内存的一片区域,也可能是同一份文件,数组,堆栈,字段,记录,变量,队列,集成也需要考虑到性能匹配问题,网络集成
      5集成测试的依据:LLD
      6集成测试的对象:接口
      7集成测试策略:大爆炸集成测试,自顶向下,自底向上,三明治集成,基于集成,分层集成,基于功能集成,基于消息集成,基于进度的集成,基于风险的集成
      1)大爆炸集成测试
      方法:对每个模块分别进行单元测试,在吧所有单元组装在一起测试
      优点:从未投入模块间,子系统间角度节省时间,减少桩和驱动的开发,节省成本,方法简单

      使用范围:小型项目,大型项目已经稳定,只有少量修改
      2)自顶向下集成测试

      深度优先:在系树的根优先,根—左—右
      广度优先:从上到下,从左到右,一层一层的
      注:调用没有加入过的都需要打桩
      优点:减少驱动的开发,测试充分(一个模块一个模块的加入)定位问题容易,效率有所下降,最容易让高层人物建立信心
      缺点:打桩开发成本较高,效率有所下降,下层容易测试不充分
      适用范围:上层稳定,下层相对不稳定的系统
      3)自底向上集成测试
      优点:桩少,定位问题容易,小测试成分,下层测试充分,问题容易暴漏
      缺点:驱动开发成本高,顶层测试不充分
      适用范围:下层稳定,上层变化较多
      4)三明治集成测试方法

      优点:桩和驱动都减少,测试灵活,问题好隔离,好定位
      缺点:测试中间层可能不充分
      适用范围:大项目
      注:采用哪种方法根据系统本身确定
      8集成测试用例可借用单元测试和系统测试用例设计技术进行用例设计
      9接口覆盖率:每个接口至少被覆盖一次的次数/系统中所有的接口
      10集成测试的层次:子系统间集成测试,模块内集成测试,子系统内集成测试,还要考虑模块间集成测试

      11集成测试过程:计划(输入HLD测试计划,输出IT计划)——设计(输出IT方案)——实施(输出IT用例,脚本——执行(输出集成测试报告,缺陷报告)

      第一阶段总结
      基础课程:测试基础、测试过程、测试方法、软件质量
      开发基础:SQL、C语言
      需求分析、需求管理(变更控制、需求跟踪)
      环境搭建
      配置管理、QC
      缺陷管理
      系统测试、集成测试、单元测试、python
      要做好测试还应该学习DB 网络知识 数据结构 算法 语言(C JAVA PYTHON)OS
      所有课程全部基于测试目的:尽量多、尽量的发现BUG,并预防BUG
      在做测试之前,先考虑可以套用哪些软件质量特性,再根据特性考虑测试点

      Test platform
      管理工具:QC ,RQM
      执行工具:QTP,LR ,WinRunner,BRAT
      数据库:SQL,Oracle,MySQL
      配置管理工具:SVN,CVS,VSS,CC,DB2
      服务器:Tomcat,IIS,JBOSS
      2. 系统测试流程:
      测试流程:需求阶段(产出测试计划):1)来自客户(用户需求)特点:用户自身根据自己的需要提出来,不考虑技术的实现能力,功能和具体细节的实现不2)来自研发(开发文档):特点,进一步明确客户的需求3)来自标准协议(手机网络协议:CSM,CDMA,WCDMA,TD_WCDMA,EDEE)
      需求分析(产出测试方案):分析测试项。罗列功能模块和功能点,产出测试项1)从质量特性的角度对测试项进行分析,包括6大特性,27个子特性2)从功能交互的角度对测试项进行分析,功能是否存在交合,交互过程中有什么影响3)按用户场景进行测试分析
      设计阶段(产出测试用例)设计方法:等价类、边界值、状态迁移图、因果图等
      执行阶段(产出测试报告)提交缺陷报告: 测试结束,研发人员根据提交的bug进行修改,之后release 1.1(新版本),进行回归测试(REG)。
      补充:
      敏捷开发模式 scrum 短小、快。 没有需求、不便于管理。
      User story 功能点。
      3. 与bug相关
      Bug的其他说法
      Defect、CR(change Request)(Moto使用这种说法、submit a CR)、issue。
      缺陷流程:
      缺陷管理工具:QC、Mantis(开源工具)、bugfree(开源)、bugzilla、DDTS(Moto)、DMS(索爱)。
      缺陷状态:New、open、fixed、reopen、assigned、reject、later(postpone)、closed、abandon、duplicate(很常见的一个状态,重复bug,原有的有效,引用时引用原来的bug)。摩托罗拉的缺陷管理系统DDTS
      Postpone原因:有争议的、项目进度紧,优先级低的bug、以后版本就没有这个功能了。
      Retest时可能是不同的测试人员做回归测试:testerA(原)、TesterB(新),测试完后需要测试经理verify
      验证完成后bug没问题tester是否可以直接closed?如果tester没有对bug进行测试,直接closed后可能导致bug遗漏。

      第二阶段项目笔记
      JXC项目
      扩展名为ASP的文件是微软开发的
      扩展名为JSP的文件是JAVA编写的
      一.建立项目JXC
      1把JXC项目方在d:
      2点JXC右键—共享和安全----WEB共享----编辑别名----执行包括脚本等权限都选上
      3删掉JXC布置:控制面板—管理工具—Internet—网站----默认网站----JXC—右键删除
      4给权限:d:\点上边的文件夹—JXC—data—右键属性----安全与共享----添加—everyone----检查名称----确定----点中everyone—权限都选上—确定
      5登录:控制面板—管理工具—Internet信息服务-----JXC—右边栏里找到index.asp右键—浏览
      6找WEB共享或者安全:工具—文件夹—查看—使用简单文件共享前面的对号去掉
      7客户端需要建TSVN,服务器需要建SVN(必须)/TSVN(可建,可不建)
      二.布置JXC
      1建立仓库:新建文件夹SVN—新建文件夹jxc52-niuxiaoqing和文件夹JXC—在文件夹jxc52-niuxiaoqing里分别新建文件夹trunk branches tags—在文件夹trunk里分别新建文件夹doc code tools—在文件夹doc里分别建立文件夹croup person—在文件person里分别新建文件夹niu wang guo
      2点SVN文件夹—jxc52-niuxiaoqing右键----create repository here
      3创建的文件结构放到仓库:SVN文件夹------tortoisvn----import
      4binary文件时二进制文件(可执行的文件)
      5.Dll动态链接库文件有什么作用
      6 1)开始—运行—CMD—目录—cd空格c:\program files\svbversion\bin(svnserve的路径)—回车
      2)svnserve.exe空格–(2个下划线)help-------回车
      3)svnserve.exe空格-d空格-r空格d:\svn\jxc52-niuxiaoqing----回车
      4)停掉服务ctrl+c
      5)上光标,又出现3)回车,启动服务

      三.配置SVN
      1、svn搭建的服务环境:svnserve方式

      2、修改文件:

      svnserve.conf //修改服务器配置文件
      anon-access = none //去除注释 匿名访问 不允许
      auth-access = write //去除注释 指定用户访问 允许

       password-db = passwd //去除注释 启用密码文件passwd
       authz-db = authz     //去除注释 启用用户文件authz
      

      passwd //增加用户并设置密码
      zhangsan = 1111 // 用户名 = 密码

      authz //控制仓库的访问权限
      [groups]
      组名 = 用户名(逗号分隔)

       [/] 代表仓库的根目录
       如果使用组:@组名 = rw
      
       [/trunk/doc/person/lisi] 控制仓库里具体目录的权限
      
       如果没有特别规定某个目录的权限,则使用根目录[\]权限
      

      3、启动服务
      1、进入svn安装目录:cd C:\Program Files\Subversion\bin

      四.访问SVN
      1 svn checkout
      输入要访问的电脑IP
      File:///仓库建立在之间的计算机上
      SVN://仓库建立在其他机器上,要通过网络方式访问
      Apache为HTTP协议请求提供服务
      Tomcat为JAVA的容器,为JAVA编译的文件解释
      IIS为ASP提供服务
      QC的前身叫testdirector
      9.0之前是mercury公司
      10.0之后是惠普公司
      支持的数据库SQL ,Oracle
      支持的应用服务器JBoss
      支持的WEB服务器JBoss,IIS

      进销存项目
      上传图片:数据库中保存的是图片名称,实体保存在jxc/upload下。access中没有存储图片的类型。

      【SqlServer数据库中binary(二进制)类型可以用来保存图片。】

      为什么改名? ------有可能重名,同一个windows目录下不能重名

      为什么是日期时间?------重名的可能性小

      在哪见过类似的实现方式?----QC生成日志,日志保存名称,年月日秒毫秒(1秒=1000毫秒)
      系统生成的文件,为了解决文件重名的问题,使用日期时间命名,做好精确到毫秒级。

      日志功能怎么测?
      保存4个内容:日志级别、日志的最大保存行数(边界值)、保存天数(边界值)、日志保存路径。

      QC非活动状态(选择域后项目下拉列表中没有这个项目了)才能导出(export)----没有人操作

      离点(10001):预期结果(有三种实现方式):保存一个新的日志、覆盖第一条、整个全删了从第一条开始写。

      保存天数(-1):不限制。
      保存路径:目录空间是否够,如果不限制保存时间,硬盘保存空间不够时怎么办?tester是否对硬盘空间

      可操作?

      安装文件后会有一个bin目录,存有大量二进制文件(编译后),扩展名为.exe,为可运行程序。

      路径写到上一级,不包括本级
      文字相同

      001 用户名 用户名和编号
      002 密码

      新密码 确认新密码合为一个需求 新密码处验证特殊符号等,确认新密码只验证是否与新密码相同。

      排序 翻页 打印 详细信息

      所在仓库 有读取数据库的代码

      测试需求:

      测试需求的目的:保证测试的完整性。
      将需求导入QC中,能得出什么东西??-------not covered 应该被用例覆盖但是还没被覆盖。
      细化需求
      每个需求项下边的description:描述该项需求具体的 测试内容,提供测试思路。
      例如:
      产品图片:
      1.浏览功能
      支持的图片格式 jpg、gif(打开文件窗口对该文件类型进行过滤,默认显示过滤类型为jpg、gif)(不区分扩展名的大小写)。
      浏览本地路径、网络路径。
      2.上传功能
      被选文件路径是否合法(选择U盘中的文件,上传前拔掉U盘;存在本地,上传前删除);
      文件的大小限制(0,1M】
      被上传文件是否被独占打开(需要编写程序来独占打开该图片)。
      图片被上传到服务器的upload目录中,而且被修改图片名称(防止该目录下出现重名文件),名称格式:YYYYMMDDHHMMSS。
      上传成功后相关图片信息(图片的新名称)被保存到buy(photo字段)和produit(photo字段)。
      3.预览功能
      预览模式:平铺、拉伸、居中【一般预览功能就这几种模式】
      使用“居中”的预览模式。

      Buy表中 shulian(数量)保存时采用四舍五入。(有bug)。如何提bug???
      输多个小数点出错 编辑框输入的内容按字符(字符串)处理,放到数据库前需要进行字符转换,多个小数点时不能转换成float型,导致语法错误。
      Bug:
      页面允许输入浮点类型,数据库中为整形。
      页面控制的类型和数据库的类型不一致。
      进销存项目总结
      测试需求分析
      工作思路参考QC需求工作流:

      1、定义测试范围

          依据:ISO9126质量模型
          确定测试范围:被测质量特性
      

      2、建立需求项
      参考需求(SRS),明确具体要测试的需求项(测试点、需求点、功能点。。。)
      树形结构,考虑分析的“粒度”(参考QC)

          (1)、粗:文件夹级(只分解到模块或者页面层次)
          (2)、中:用例级  (只分解到页面中的具体控件,如“产品名称”、“入库数量”,意味这最底层需求可以直接转换为测试用例)
          (3)、细:步骤级  (分解到用例的操作步骤 Step)
          (4)、默认使用级别:用例级
      
           考虑后期用例执行,分解出一些特殊的需求(以后会专门对应某些测试类型)
      
          (1)、页面同名:(作为模板),只考虑该页面中所有控件都输入最正确的值
                         (控件同名的需求,目的从有效、无效两方面反复验证该控件输入的合法性)
          (2)、页面同名 Page: 以后作为“界面测试”使用
          (3)、模块同名:(调用该模块内所有页面同名的用例)作为预测试使用,证明版本的基本功能是否正确
      

      3、细化需求项
      描述每个需求项的详细内容

      详细内容:
      1、页面:(星号)是否允许为空
      2、数据库: 输入类型、长度(边界值)
      3、设计:跑到(所有)的路径----精简测试用例的个数

      如:入库管理模块–新产品入库页面–入库数量控件:
      1、页面:入库输入量不能为空

      2、数据库:
      数字类型(整型)
      边界:-231 ~ 231-1
      31:整型类型占用4个字节(4B),每个字节有8位(8bit),每位有两个取值(0、1),考虑符号(正、负)占用1位
      2:代表每位(bit)有两个取值(0、1)
      31:除去符号位,还剩31位

      3、代码实现:
      1)、当键盘抬起的时候,重置输入
      测试思路:(1)、抬起按键,非法字符的输入被重置
      (2)、绕过该事件,按下字母键不抬起进行鼠标焦点切换
      2)、当粘贴之前,重置输入
      考虑粘贴功能的实现(鼠标右键进行粘贴,快捷键粘贴 Crtl+V)
      3)、小数点个数最多1个(考虑边界值0,1,2个)

       具体分析思路:
      

      4.需要进行评审
      借助Rose的活动图统一思路

      4、需求覆盖率分析
      借助工具----QC
      将写好的需求导入到QC中的需求模块
      切换到需求的第四种视图方式:Coverage Analysis (需求覆盖率分析),看需求的状态(Not Covered 未覆盖状态),得知应该被覆盖到的需求的数量(只统计最底层需求的个数)(被测对象的测试规模),进而预测试出用例的数量

      当粘贴之前
      课前复习:
      需求名称为必填项,有空行不能导到QC中。
      把相同需求分类
      从需求详细描述从哪几方面去找?(1)页面角度 获取需求(星号—是否允许为空);(2)数据库 (长度----边界值、类型);(3)代码 实现方式----【目的:精简用例的个数,路径全部覆盖】
      代码实现讲解:
      onKeyUp="value=value.replace(/[^\d.]/g,’’)
      Onkeyup:当键盘键抬起的时候
      Replace:重新设置
      (/[^\d.]/g,’’):正则表达式 d----代表数字(0~9) .------代表小数点
      整个句子解释:
      当键盘抬起的时候,判断按键是否属于数组或者小数点,如果不属于这些键,则重置该输入(取消该输入)。

      这样只要设计2个用例就可(1)输入字母;(2)输入1.5。
      如果没有的代码,只按照等价类边界值的思想设计用例,需要考虑很多情况(此处略)。
      此处总结如下:

      onbeforepaste=“clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d.]/g,’’))” value=“1”>
      onbeforepaste:当粘贴之前
      入库数量测试(设计):
      1.输出-------入库输入量不能为空;
      2.代码实现:
      (1)当键盘抬起的时候,重置输入;
      测试思路:绕过该事件,按下字母键不抬起鼠标焦点切换
      (2)当粘贴之前,重置输入
      考虑粘贴功能的实现(鼠标右键进行粘贴,快捷键粘贴Ctrl+V)
      3.小数点个数最多1个
      测试需求分析:
      如何做??1.工作思路参考QC需求工作流
      2.定义测试范围; 依据:ISO9126质量特性确定测试范围:被测质量特性
      3.建立需求项------参考需求(SRS)明确具体要测试的需求项(又叫测试点、需求点、功能点….)树型结构,考虑分析的“粒度”
      【粗—文件夹级(只分解到模块或者页面层次);
      中------用例级(只分解到页面中的具体控件,如“产品名称”、“入库数量”)
      细-----步骤级】
      考虑后期用例执行,分解出一些特殊的需求(以后)
      1.页面同名
      2.页面同名page
      3.模块同名
      4.细化需求项
      5.需求覆盖率分析

      判定表
      解决:多个输入的组合问题

      方法1:利用数据库的查询命令—笛卡尔积(全排列组合)
      计算最终的组合数量:每个表记录数的乘积
      如:A(a1,a2)
      B(b1,b2,b3,b4)
      C(c1,c2,c3)
      Select * from A、B、C

      方法2:判定表多个条件,每个条件2个取值

      3.1.读书选择
      1、如果觉得不疲倦,并且对书中的内容不感兴趣,同时书中的内容让你不糊涂,跳到下一章去读
      2、如果觉得不疲倦,并且对书中的内容不感兴趣,同时书中的内容让你糊涂, 跳到下一章去读
      3、如果觉得不疲倦,并且对书中的内容感兴趣, 同时书中的内容让你不糊涂,继续读下去
      4、如果觉得不疲倦,并且对中书的内容感兴趣, 同时书中的内容让你糊涂, 回到本章重读
      5、如果觉得疲倦, 并且对书中的内容不感兴趣,同时书中的内容让你不糊涂,停止阅读,请休息
      6、如果觉得疲倦, 并且对书中的内容不感兴趣,同时书中的内容让你糊涂, 请停止阅读,休息
      7、如果觉得疲倦, 并且对书中的内容感兴趣, 同时书中的内容让你不糊涂,继续读下去
      8、如果觉得疲倦, 并且对书中的内容感兴趣, 同时书中的内容让你糊涂, 回到本章重读

      提炼需求:多个条件的组合生成不同的结果
      1、需求分析:
      条件:是否疲倦(是、否)、是否感兴趣(是、否)、是否糊涂(是、否)
      结果:跳到下一章、继续读、本章重读
      2、绘制判定表
      1、分别填入条件和结果,确定表格的“行数”
      2、计算条件组合的数量,规划表格的“列数”
      3、将条件进行排列组合(全排列–笛卡尔积),利用二进制原理(0代表否,1代表是)。
      4、根据每种组合方式(每列),推出其对应的结果

      	1	2	3	4	5	6	7	8
      

      条件 是否疲倦 0 0 0 0 1 1 1 1
      是否感兴趣 0 0 1 1 0 0 1 1
      是否糊涂 0 1 0 1 0 1 0 1
      结果 跳到下一章 X X
      继续读 X X
      本章重读 X X
      休息 X X
      注:虽然1、2的结果是一样的,但是不能使用等价类的思想将其合并,原因:处理路径不同。(时间紧张可以合并)。

      3、编写测试用例
      原则1:判定表中的每一列生成一个测试用例,多个测试用例
      原则2:判定表中的每一列生成一个测试用例的步骤,一个测试用例

      我们项目使用:原则2
      两个原则测试的充分程度(覆盖率)相同;
      第二种进行需求跟踪更简单易操作;

      原则1:----8个测试用例
      用例编号 用例标题 用例输入 操作步骤 预期结果
      ST-001 不疲倦+没兴趣+不糊涂 是否疲倦: 否
      是否感兴趣:否
      是否糊涂: 否 1、启动系统
      2、输入以上内容
      3、点击“提交”按钮 跳到下一章
      ST-002 不疲倦+没兴趣+糊涂 是否疲倦: 否
      是否感兴趣:否
      是否糊涂: 是 1、启动系统
      2、输入以上内容
      3、点击“提交”按钮 跳到下一章
      ST-008 。。。。。。。。 。。。。。。。。 。。。。。。。。 。。。。。。。。

      原则2:-----1个测试用例,8个步骤
      用例编号 用例标题 步骤名称 步骤输入 操作描述 预期结果
      ST-001 读书选择 启动系统 。。。。。。。。 。。。。。。。。 。。。。。。。。
      准备测试 。。。。。。。。 。。。。。。。。 。。。。。。。。
      Step 1不疲倦+没兴趣+不糊涂 是否疲倦: 否
      是否感兴趣:否
      是否糊涂: 否 1、启动系统
      2、输入以上内容
      3、点击“提交”按钮 跳到下一章
      Step 2不疲倦+没兴趣+糊涂 是否疲倦: 否
      是否感兴趣:否
      是否糊涂: 是 1、启动系统
      2、输入以上内容
      3、点击“提交”按钮 跳到下一章
      Step 8 。。。。。。。。 。。。。。。。。
      3.2.Counter

      1、测试需求分析
      条件:是否统计代码行、是否统计空行、是否统计注释行、是否统计总行
      结果:统计代码行、统计空行、统计注释行、统计总行

      2、绘制判定表
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
      条件 是否统计代码行 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
      是否统计空行 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
      是否统计注释行 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
      是否统计总行 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
      结果 统计代码行 X X X X X X X X
      统计空行 X X X X X X X X
      统计注释行 X X X X X X X X
      统计总行 X X X X X X X X

      3、生成测试用例
      每一列生成一个测试用例,一共16种组合方式
      原则1:----16个用例
      用例编号 用例编号 用例输入 操作步骤 预期结果 编写人 编写时间
      ST-001 1.
      ST-002 1.
      ST-003
      ST-004
      ST-005

      原则2:----1个测试用例,16个步骤
      用例编号 用例标题 步骤名称 步骤输入 操作描述 预期结果 编写人 编写时间
      ST-001 Counter统计

      3.3:word中的判定表举例
      Word中的判定表举例:
      (1)字体和字号

      输入太多,选择有代表的处理(等价类—减少输入个数)。
      字体:中文、英文(英文又可以分为2类:带横线(serif—如times new roman)、不带横线(sens serif----arial Unicode ))
      (2)

      组合:4个条件,每个条件2个值。
      (3)

      这个不能用判定表,因为不能同时选中“左对齐”和“右对齐”,不满足判定表使用条件。

      3.4.合并判定表
      前提:时间紧张,成本过高;
      原则:结果相同,条件有一个不同(貌似该条件没有作用);
      风险:被合并的条件可能走不同的“路径”,合并可能会造成漏测。
      对练习1(读书选择)中的判定表进行合并:

      	1	2	3	4	5	6	7	8
      

      条件 是否疲倦 0 0 0 0 1 1 1 1
      是否感兴趣 0 0 1 1 0 0 1 1
      是否糊涂 0 1 0 1 0 1 0 1
      结果 跳到下一章 X X
      继续读 X X
      本章重读 X X
      休息 X X

      判定表合并:

      	1	2	3	4
      	1、2	3、7	4、8	5、6
      

      条件 是否疲倦 0 ---- ---- 1
      是否感兴趣 0 1 1 0
      是否糊涂 — 0 1 —
      结果 跳到下一章 X
      继续读 X
      本章重读 X
      休息 X

      前提:
      合并:时间紧张,成本过高
      原则:结果相同,条件有一个不同(“貌似”该条件没有作用)
      风险:被合并的条件可能走不同的“路径”,合并会造出漏测

      3.4.密码修改
      若需修改密码,系统验证旧密码正确,两个新密码相同,则更新密码,旧密码即失效,其他修改项也生效,并提示“用户信息修改成功”; 若旧密码不正确,则提示“用户密码错”,系统将不修改个人信息;若两个新密码不同,则提示“新密码与验证新密码不同”,系统将不修改个人信息。
      若只修改密码外其他信息,则不需输入两个新密码,系统只验证旧密码正确,就成功更改个人信息,并提示“用户信息修改成功”;如果系统验证旧密码输入不正确,则提示“用户密码错”。
      流程图如下

      答案:
      (1)需求分析
      条件:只修改密码外其他信息(是/否)、旧密码(正确/错误)、新密码和验证新密码(相同/不相同)
      结果:提示“用户信息修改成功”、提示“用户密码错”、提示“新密码与验证新密码不同”
      (2)绘制判定表
      1 2 3 4 5 6 7 8
      条件 只修改密码外其他信息 0 0 0 0 1 1 1 1
      旧密码 0 0 1 1 0 0 1 1
      新密码和验证新密码 0 1 0 1 0 1 0 1
      结果 提示“用户信息修改成功” x x x
      提示“用户密码错” x x x
      提示“新密码与验证新密码不同” x
      说明 无效 无效
      (3)编写测试用例
      原则2:----1个测试用例,8个步骤
      用例编号 用例标题 步骤名称 步骤输入 操作描述 预期结果
      ST-001 修改信息 启动系统 无 双击 系统正常启动
      Step1:修改密码+旧密码错误+新密码与验证密码一致 是否只修改密码外其他信息:否;
      旧密码是否正确:否;
      新密码和验证新密码是否一致:否 1.启动系统;
      2.输入以上修改信息;
      3.点击“提交”按钮
      无任何提示信息
      Step2:修改密码+旧密码错误+新密码与验证密码一致 是否只修改密码外其他信息:否;
      旧密码是否正确:否;
      新密码和验证新密码是否一致:是 1.启动系统;
      2.输入以上修改信息;
      3.点击“提交”按钮
      提示“用户密码错”,个人信息未修改
      Step3:修改密码+旧密码正确+新密码与验证密码不一致 是否只修改密码外其他信息:否;
      旧密码是否正确:是;
      新密码和验证新密码是否一致:否 1.启动系统;
      2.输入以上修改信息;
      3.点击“提交”按钮
      提示“新密码与验证新密码不同”,个人信息未修改
      Step4:修改密码+旧密码正确+新密码与验证密码一致 是否只修改密码外其他信息:否;
      旧密码是否正确:是;
      新密码和验证新密码是否一致:是 1.启动系统;
      2.输入以上修改信息;
      3.点击“提交”按钮
      提示“用户信息修改成功”,旧密码生效,其他个人信息修改
      Step5:只修改密码外信息+旧密码错误 是否只修改密码外其他信息:是;
      旧密码是否正确:否;
      新密码和验证新密码是否一致:否 1.启动系统;
      2.输入以上修改信息;
      3.点击“提交”按钮
      提示“用户密码错”,个人信息未修改
      Step7:只修改密码外信息+旧密码正确 是否只修改密码外其他信息:是;
      旧密码是否正确:是;
      新密码和验证新密码是否一致:否 1.启动系统;
      2.输入以上修改信息;
      3.点击“提交”按钮
      提示“用户信息修改成功”,其他个人信息修改

      3.5.进销存
      进销存中的下列选框可以使用判定表的方法设计用例:

      (1)需求分析
      条件: 仓库(所有仓库/具体仓库)(0表示所有仓库,1表示具体仓库)【“具体”只测试一个即可,处理方式相同,等价类思想】
      类别(包括大类和小类,有三种组合,分别为所有/所有、具体/所有、具体/具体)(分别使用0、1、2表示)
      关键字(填/不填)(0表示不填,1表示填)
      结果:所有仓库所有库存、所有仓库具体库存、具体仓库所有库存、具体仓库具体库存
      (2)绘制判定表
      1 2 3 4 5 6 7 8 9 10 11 12
      条件 仓库 0 0 0 0 0 0 1 1 1 1 1 1
      类别 0 0 1 1 2 2 0 0 1 1 2 2
      关键字 0 1 0 1 0 1 0 1 0 1 0 1
      结果 所有仓库所有库存 X X
      所有仓库具体库存 X X X X
      具体仓库所有库存 X X
      具体仓库具体库存 X X X X
      (3)编写测试用例
      使用原则2:----1个测试用例,12个步骤
      用例编号 用例标题 步骤名称 步骤输入 操作描述 预期结果
      ST-001 库存查询信息组合查询 进入库存查询页面。 无 1.打开进销存网页;2.点击库存管理模块中的库存查询页面。 界面显示库存查询页面。
      Step1:所有仓库+所有大类+所有小类+不填关键字 仓库:所有仓库;
      类别:所有大类和所有小类;
      关键字:不填 1.在页面右上角搜索处选择所有仓库;
      2.在页面右上角搜索处选择所有大类和所有小类;
      3.不填写关键字;
      4.点击“查询”按钮。 页面中显示所有仓库的所有库存信息
      Step2:所有仓库+所有大类+所有小类+填关键字 仓库:所有仓库;
      类别:所有大类和所有小类;
      关键字:填 1.在页面右上角搜索处选择所有仓库;
      2.在页面右上角搜索处选择所有大类和所有小类;
      3.填写关键字;
      4.点击“查询”按钮。 页面中显示所有仓库的所有库存信息
      Step3:所有仓库+具体大类+所有小类+不填关键字 仓库:所有仓库;
      类别:具体大类和所有小类;
      关键字:不填 1.在页面右上角搜索处选择所有仓库;
      2.在页面右上角搜索处选择具体某一个大类和所有小类;
      3.不填写关键字;
      4.点击“查询”按钮。 页面中显示所有仓库的具体库存信息
      Step4:所有仓库+具体大类+所有小类+填关键字 仓库:所有仓库;
      类别:具体大类和所有小类;
      关键字:填 1.在页面右上角搜索处选择所有仓库;
      2.在页面右上角搜索处选择具体某一个大类和所有小类;
      3.填写关键字;
      4.点击“查询”按钮。 页面中显示所有仓库的具体库存信息
      Step5:所有仓库+具体大类+具体小类+不填关键字 仓库:所有仓库;
      类别:具体大类和具体小类;
      关键字:不填 1.在页面右上角搜索处选择所有仓库;
      2.在页面右上角搜索处选择具体某一个大类和具体某一个小类;
      3.不填写关键字;
      4.点击“查询”按钮。 页面中显示所有仓库的具体库存信息
      Step6:所有仓库+具体大类+具体小类+填关键字 仓库:所有仓库;
      类别:具体大类和具体小类;
      关键字:填 1.在页面右上角搜索处选择所有仓库;
      2.在页面右上角搜索处选择具体某一个大类和具体某一个小类;
      3.填写关键字;
      4.点击“查询”按钮。 页面中显示所有仓库的具体库存信息
      Step7:具体仓库+所有大类+所有小类+不填关键字 仓库:具体仓库;
      类别:所有大类和所有小类;
      关键字:不填 1.在页面右上角搜索处选择具体某一个仓库;
      2.在页面右上角搜索处选择所有大类和所有小类;
      3.不填写关键字;
      4.点击“查询”按钮。 页面中显示具体仓库的所有库存信息
      Step8:具体仓库+所有大类+所有小类+填关键字 仓库:具体仓库;
      类别:所有大类和所有小类;
      关键字:填 1.在页面右上角搜索处选择具体某一个仓库;
      2.在页面右上角搜索处选择所有大类和所有小类;
      3.填写关键字;
      4.点击“查询”按钮。 页面中显示具体仓库的所有库存信息
      Step9:具体仓库+具体大类+所有小类+不填关键字 仓库:具体仓库;
      类别:具体大类和所有小类;
      关键字:不填 1.在页面右上角搜索处选择具体某一个仓库;
      2.在页面右上角搜索处选择具体某一个大类和所有小类;
      3.不填写关键字;
      4.点击“查询”按钮。 页面中显示具体仓库的具体库存信息
      Step10:具体仓库+具体大类+所有小类+填关键字 仓库:具体仓库;
      类别:具体大类和所有小类;
      关键字:填 1.在页面右上角搜索处选择具体某一个仓库;
      2.在页面右上角搜索处选择具体某一个大类和所有小类;
      3.填写关键字;
      4.点击“查询”按钮。 页面中显示具体仓库的具体库存信息
      Step11:具体仓库+具体大类+具体小类+不填关键字 仓库:具体仓库;
      类别:具体大类和具体小类;
      关键字:不填 1.在页面右上角搜索处选择具体某一个仓库;
      2.在页面右上角搜索处选择具体某一个大类和具体某一个小类;
      3.不填写关键字;
      4.点击“查询”按钮。 页面中显示具体仓库的具体库存信息
      Step12:具体仓库+具体大类+具体小类+填关键字 仓库:具体仓库;
      类别:具体大类和具体小类;
      关键字:填 1.在页面右上角搜索处选择具体某一个仓库;
      2.在页面右上角搜索处选择具体某一个大类和具体某一个小类;
      3.填写关键字;
      4.点击“查询”按钮。 页面中显示具体仓库的具体库存信息

      3.6.总结
      1、什么时候用:
      (1)有多个输入需要组合的时候,采用判定表进行用例设计;
      2、怎么用:
      (2)使用判定表进行用例设计,有以下3个步骤:
      a)需求分析,通过对多个条件的组合生成不同的结果进行分析,得出条件和结果。
      b)绘制判定表。
      i.分别填入条件和结果,确定表格的“行数”;
      ii.计算条件的组合数量,规划表格的“列数”;
      iii.将条件进行排列组合,利用二进制原理;
      iv.根据每种组合方式,推出其对应的结果。
      c)编写测试用例
      有2种方式:判定表中的每一列生成一个测试用例,最终生成多个测试用例;
      判定表中的每一列生成一个测试用例的步骤,最终生成一个测试用例。
      3判定表的优点和缺点
      (3)优点:组合充分,没有遗漏;
      缺点:当条件数多的时候(超过5个)用例数量多,成本高。

      因果图

      条件和结果之间的关系:

      恒等:条件成立,结果成立
      非: 条件成立,结果不成立
      或: 只要有一个条件成立,结果成立
      与: 必须所有条件都成立,结果成立

      条件之间的关系:

      E:不能同时为“真”
      I:不能同时为“假”
      O:有且仅有一个为“真”

      第一个举例:呼吸,用鼻子和嘴(异)
      因果图作用:1、条件和结果之间的关系:分析业务逻辑(类似流程图的作用)
      2、条件之间的关系:去除判定表中的无效的列
      使用viso绘制因果图:
      操作步骤:
      (1):在viso中选择基本流程图,
      (2)按照等价(处理方式相同)条件,添加中间节点(临时结果)。如:A、B处理相同(等价类),做中间节点(如A or B)。
      (3)分析条件和结果之间的关系(恒等、与、或、非)。
      如果不是一次退出结果,或者连线较多,可以增加中间节点。
      (4)分析条件之间的关系(E、I、O)。

      4.1.字母判定
      第一列字符必须是A或B,第二列字符必须是一个数字(每列只能输入一个字符),在此情况下(只有这个时候才)进行文件的修改,但如果第一列字符不正确,则给出信息L;如果第二列字符不是数字,则给出信息M。
      不能使用等价类【不是单一条件】

      1、测试需求分析
      条件:第一列是A、第一列是B、第二列是数字
      结果:修改文件、 提示L、 提示M

      2、绘制因果图

      3、绘制判定表
      假设:当判断完是否是AorB条件后,如果取“否”,则退出系统运行。【实际工作中不允许假设】。

      利用因果图条件之间的关系,去除无效列

      	1	2	3	4	5	6	7	8
      

      条件 第一列是A 0 0 0 0 1 1 1 1
      第一列是B 0 0 1 1 0 0 1 1
      第二列是数字 0 1 0 1 0 1 0 1
      结果 修改文件 X X
      提示L X X
      提示M X X
      实际输入 CC T7 B@ B5 AF A6 无效 无效

      第一种条件是提示L还是提示L、M,在公司中要找开发人员询问,不能主观猜测。

      编写测试用例
      原则2:----1个测试用例,8个步骤
      用例编号 用例标题 步骤名称 步骤输入 操作描述 预期结果 编写人 编写时间
      ST-001 修改文件

      4.2.自动售货机
      有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计。其规格说明如下:若投入5角钱或1元钱的硬币,押下〖橙汁〗或〖啤酒〗的按钮,则相应的饮料就送出来。若售货机没有零钱找,则一个显示〖零钱找完〗的红灯亮,这时在投入1元硬币并押下按钮后,饮料不送出来而且1元硬币也退出来;若有零钱找,则显示〖零钱找完〗的红灯灭,在送出饮料的同时退还5角硬币。

      1、测试需求分析:
      条件:有零钱、投1元、投5角、选啤酒、选橙汁
      结果:红灯亮、退1元、找5角、出啤酒、出橙汁

      2、绘制因果图

      3、绘制判定表

      红色列为无效组合

      4、生成测试用例
      经办人不能为空,程序中通过管理员ID判断当前登陆用户是否为管理员,如果在数据库login表中删除再添加一个管理员后id变了,导致查询错误。
      Admin登陆,下拉列表中显示所有系统的用户,非admin登陆,下拉列表中只显示当前登陆用户。
      关于下拉列表的问题:

      关于单元测试逻辑覆盖率:
      在只有一个条件时,路径覆盖率为100%时,条件覆盖率也是100%。
      如果条件不是布尔类型,可以使用数据库中的多表关联,计算笛卡尔积。
      如:
      A表(a1、a2)
      B表(b1、b2、b3、b4)
      C表(c1、c2、c3)
      使用select * from A、B、C;查询。

      状态迁移
      5.1.飞机售票系统
      1、客户向航空公司打电话预定机票—>此时机票信息处于“完成”状态
      2、顾客支付了机票费用后—>机票信息就变为“已支付”状态
      3、旅行当天到达机场后,拿到机票后—>机票信息就变为“已出票”状态
      4、登机检票后—>机票信息就变为“已使用”状态
      5、在登上飞机之前任何时间可以取消自己的订票信息,如果已经支付了机票的费用,则还可以得到退款,取消后—>订票信息处于“已被取消”状态

      1、测试需求分析
      状态:完成、已支付、已出票、已使用、已被取消

      2、绘制状态迁移图
      使用rose画状态图:
      方法:
      (1)右键,新建状态图New -----stagechar Diagram。

      特点:每个状态只出现一次

      3、生成用例 — 路径覆盖
      绘制状态迁移树-----每个树枝生成一个测试用例

      特点:
      1、每个状态可以出现多次
      2、箭头方向统一向“右”延伸
      3、状态转换如果出现循环,该路径只遍历一次
      4、编写测试用例
      用例编号 标题 步骤名称 步骤描述 预期结果
      STC-001 售票流程 启动系统
      准备测试数据和环境
      Step 1 完成-取消 1、客户向航空公司打电话预定机票
      2、取消该机票 1、此时机票信息处于“完成”状态
      2、订票信息处于“已被取消”状态
      Step 2 完成-支付-取消 。。。。。 。。。。。
      Step 3 。。。。。 。。。。。
      Step 4 。。。。。 。。。。。
      那些软件适合状态迁移
      淘宝买东西、QC需求、配置管理状态(normal、modified.;……)、缺陷状态(new、open……)
      QC需求状态(只考虑一次运行)

      5.2.缺陷跟踪

      流程分析
      使用ROSE中的活动图进行分析

      状态:吃饭中(有一个延续,使用ing)。
      活动:吃饭
      方法:
      (1)右键,新建状态图New -----activity Diagram。

      6.1.处理流程
      在某嵌入式系统中,将待发送的数据打包成符合CAN协议的帧格式后,便可写入发送缓站区,并自动发送。该发送子程序的流程为:
      1、首先进入发送子程序
      2、系统判断是否有空闲发送缓冲区,如果没有则返回启动发送失败消息。
      3、如果有空闲缓冲区,将数据包写入空闲发送缓冲区
      4、系统判断是否写入成功,如果不成功则返回启动发送失败消息
      5、如果写入成功,则启动发送命令
      6、返回启动发送成功消息
      1、绘制流程(活动)图

      2、生成测试用例------ 路径覆盖
      1、(A) (B) (C) (D) (E) (F) 基本流
      2、(A) (B) (G) 备选流
      3、(A) (B) (C) (D) (G) 备选流

      6.2.系统登录

      C/S程序。
      先判断是否为空,再去判断是否合法,涉及到效率问题。
      把判断时间短的放前边。

      用例:6个(路径)
      单个测试用户名考虑:空、最大值、特殊符号、匹配、不匹配
      6.3.字母判断

      用例:
      基本流: (1) (2) (3)
      (1A) (2) (3) 6列
      (1B) (2) (3) 4列
      备选流1:(1) (4) 1、2列
      备选流2:(1) (2) (5)
      (1A) (2) (5) 5列
      (1B) (2) (5) 3列

      	1	2	3	4	5	6	7	8
      

      条件 第一列是A 0 0 0 0 1 1 1 1
      第一列是B 0 0 1 1 0 0 1 1
      第二列是数字 0 1 0 1 0 1 0 1
      结果 修改文件 X X
      提示L X X
      提示M X X
      实际输入 CC T7 B@ B5 AF A6 无效 无效

      合并判定表
      1 2 3 4 5
      1、2 3 4 5 6
      条件 第一列是A 0 0 0 1 1
      第一列是B 0 1 1 0 0
      第二列是数字 ---- 0 1 0 1
      结果 修改文件 X X
      提示L X
      提示M X X
      实际输入 CC B@ B5 AF A6
      使用流程图和判定表
      都可以,使用流程图前提要保证流程图正确
      6.4.组合查询
      库存管理–库存查询代码实现:
      //
      nowkeyword–输入在查询关键字
      nowku-------输入在仓库名对应在id
      nowbigclass—输入的大类对应的id
      nowsmallclass—输入的小类对应的id
      &—+加在之前sql语句后边

      语句覆盖100%:1个用例;
      分支覆盖100%:2个用例;
      路径覆盖100%:16个用例。
      可以使用独立路径(每个路径只走一次):A-----、AB------、AC------、AD------、AE------(非法用例,不选大类不能选小类,使用ADE)。可以再找一个全选ABCDE。共6个用例。

      用例:
      1、 (A) (F) 独立路径
      2、 (A) (B) (F) 独立路径
      3、 (A) (C) (F) 独立路径
      4、 (A) (D) (F) 独立路径
      5、 (A) (D) (E) (F) 独立路径
      6、 (A) (B) (C) (D) (E) (F) 补充
      补充1关于where中1=1的问题:

      两个查询是一样的。为什么要加上1=1呢??因为每个select查询语句调教中只能加一个where,可以加多个and;如果在这句中不加1=1,之后的sql语句需要判断之前是否加过where,再做处理,影响查询效率。
      查询效率高。
      如果查询的是两个表,两个表查询就不用写了,两个表关联时就把where语句占用了。
      补充2取仓库ID,而不是仓库名称:
      代码实现:

      下拉列表由2部分组成,分别为value和库名。

      课前复习
      单个输入------- 等价类边界值
      多条件组合------判定表(全排列组合,组合个数2n(n代表条件个数)条件是布尔类型,如果不是布尔类型,参考数据库笛卡尔积,条件取值个数相乘)。
      ------因果图(帮助描述中间处理过程,去除判定表中的无效组合,3种约束:E、I、O)
      ------正交试验(两两组合)
      每个条件取值不规范,使用allpairs工具。
      处理流程问题------状态迁移(强调状态属性,用状态来描述流程)
      -----流程分析(活动图活流程图)
      生成用例原则:单元测试的路径覆盖。路径太多可以取独立路径或分支覆盖。

      正交试验
      7.1.环境搭建
      假设一个WEB站点,该站点有大量的服务器和操作系统,并且有许多具有各种插件的浏览器浏览:

      环境配置 Web浏览器 浏览器插件 操作系统 服务器
      配置选项 Netscape RealPlayer WinXP IIS
      IE Flash Win2000 Tomcat
      Firefox PDF Reader Win2003 Weblogic

      1、测试需求分析,找出条件和取值
      条件:4个
      取值:每个条件有3个取值

      2、选择正交表: L9_3_4
      9:代表最终生成用例的个数
      4:因素(因数),代表条件的个数
      3:水平,代表每个条件取值的个数

      3、生成用例
      因素 Web浏览器 浏览器插件 操作系统 服务器
      实验1 Netscape RealPlayer WinXP IIS
      实验2 Netscape Flash Win2000 Tomcat
      实验3 Netscape PDF Reader Win2003 Weblogic
      实验4 IE RealPlayer Win2000 Weblogic
      实验5 IE Flash Win2003 IIS
      实验6 IE PDF Reader WinXP Tomcat
      实验7 Firefox RealPlayer Win2003 Tomcat
      实验8 Firefox Flash WinXP Weblogic
      实验9 Firefox PDF Reader Win2000 IIS

      正交表的特点:
          1、任意一列,每个取值出现的次数一致(均匀)(本题出现3次)
          2、任意两列,任何两个值得组合出现的次数一致(均匀)(本题出现1次)
          3、任意一列,该列的每个值都和其他列的所有值成对组合过(均匀)(本题组合1次)
             正交表:充分的两两组合(9个用例)
             判定表:全排列组合(两两组合、三三、四四。。。。组合)(81个用例)
             
      使用原则:根据经验,如果充分的两两组合不出问题,那么多次组合出问题的可能性很小,基于成本、时间等因素,可以考虑正交试验方法生成测试用例
      

      7.2.Counter

      因素 代码行 注释行 空行 总行
      实验1 选 选 选 选
      实验2 选 选 选 不选
      实验3 选 不选 不选 选
      实验4 选 不选 不选 不选
      实验5 不选 选 不选 选
      实验6 不选 选 不选 不选
      实验7 不选 不选 选 选
      实验8 不选 不选 选 不选
      补充 不选 不选 不选 选
      补充 不选 不选 不选 不选

      7.3.组合
      题目:
      土壤的酸碱度:酸性、碱性、中性
      土壤的潮湿度:潮湿、干燥
      土壤的温度: 高温、低温
      提供标准正交表:
      因素 A B C
      实验1 0 0 0
      实验2 0 1 1
      实验3 1 0 1
      实验4 1 1 0

      答案:
      方法1)、正交试验方法:
      正交表:L4_2_3
      土壤的酸碱度:0(酸性)、1(碱性+中性)
      土壤的潮湿度:0(潮湿)、1(干燥)
      土壤的温度: 0(高温)、1(低温)

      因素 酸碱度 潮湿度 温度
      实验1 酸性 潮湿 高温
      实验2 酸性 干燥 低温
      实验3 碱性+中性 潮湿 低温
      实验4 碱性+中性 干燥 高温

      拆分正交表
      

      因素 酸碱度 潮湿度 温度
      实验1 酸性 潮湿 高温
      实验2 酸性 干燥 低温
      实验3 碱性 潮湿 低温
      实验4 中性 潮湿 低温
      实验5 碱性 干燥 高温
      实验6 中性 干燥 高温

      方法2)、判定表方法:
      绘制判定表
      1 2 3 4 5 6 7 8
      条件 酸碱度 0 0 0 0 1 1 1 1
      潮湿度 0 0 1 1 0 0 1 1
      温度 0 1 0 1 0 1 0 1

      带入判定表
      1 2 3 4 5 6 7 8
      条件 酸碱度 酸性 酸性 酸性 酸性 碱性+中性 碱性+中性 碱性+中性 碱性+中性
      潮湿度 潮湿 潮湿 干燥 干燥 潮湿 潮湿 干燥 干燥
      温度 高温 低温 高温 低温 高温 低温 高温 低温

      拆分判定表
      1 2 3 4 5 6 7 8 9 10 11 12
      条件 酸碱度 酸性 酸性 酸性 酸性 碱性 中性 碱性 中性 碱性 中性 碱性 中性
      潮湿度 潮湿 潮湿 干燥 干燥 潮湿 潮湿 潮湿 潮湿 干燥 干燥 干燥 干燥
      温度 高温 低温 高温 低温 高温 高温 低温 低温 高温 高温 低温 低温

      时间不充裕选择正交实验法,否则选择判定法(充分)

      方法3)、Allpairs工具实现
      使用allpairs工具:
      Cmd-----进入allpairs目录下 cd C:\Documents and Settings\51testing\桌面\allpairs----
      新建空白excl文件,将条件复制到excl中,

      TEST CASES
      case 土壤酸碱度 土壤潮湿度 土壤温度
      1 酸性 潮湿 高温
      2 酸性 干燥 低温
      3 碱性 潮湿 低温
      4 碱性 干燥 高温
      5 中性 潮湿 高温
      6 中性 干燥 低温

      7.4.环境搭建
      假设一个WEB站点,该站点有大量的服务器和操作系统,并且有许多具有各种插件的浏览器浏览:

      环境配置 Web浏览器 浏览器插件 操作系统 服务器
      配置选项 IE RealPlayer WinXP IIS
      Firefox Flash Win2000 Tomcat
      PDF Reader Win2003 Weblogic
      Baidu Win 7
      XunLei

      练习:进销存

      条件:
      仓库:所有、具体
      大类和小类:所有-所有、具体-所有、具体-具体
      关键词:不填、货号(模糊)、产品名称(模糊)

      其他
      输入域
      寻找输入中的特殊值
      如:注册页面输入用户名:hujintao、admin、administrator…….
      如:结构化输入(相互制约)要考虑组合:日期(年月日)、国家—城市,进销存权限复选控制(库存查询、删除)
      【上下级关系的选项】
      员工权限
      Bug:不选库存查询可以选择修改和删除。
      输出域
      找输出或者设计的等价类和边界值----根据结果的边界反推出输入
      如:数据库涉及时间的查询(首尾时间参考数据的第一条和最后一条记录的时间)
      如:QC需求,同级最大的需求数量:263
      最多的子集层数:255/3 = 85
      如:QC中的日志最大行数、
      如:QC中添加字段最多可以添加24个字段(可以通过查看数据库中的表得到)。

      异常分析
      可靠特性:容错、恢复
      如:SQL Server的导入功能(在源数据上构造错误数据,看异常处理功能的代码是否正确)
      如:进销存的数据还原

      错误猜测
      凭经验
      如:数字输入框(非数字字符的输入控制,小数点的个数)
      数据库的设计(约束关系)

      作业:
      三角形问题:

      成立条件:两边之和大于第三边。
      1、等价类
      2、判定表
      3、流程分析。
      密码修改问题:
      1、判定表
      流程分析

      展开全文
    22. 计算机组成原理

      万次阅读 多人点赞 2019-06-02 14:13:55
      在计算机内部,存储时要转换成机内码,转换方法: 34 73 +80 80 = B4 F3 习题: 1、写出十进制数-35的8位补码定点数 X= - 35D = - 10 0011B [X]原 = 1010 0011B;高位补0,符号位负数为1 [X]反 = 1101 1100B;...
    23. C#基础教程-c#实例教程,适合初学者

      万次阅读 多人点赞 2016-08-22 11:13:24
      面向对象程序设计方法提出了一个全新的概念:类,它的主要思想是将数据(数据成员)及处理这些数据的相应方法(函数成员)封装到类中,类的实例则称为对象。这就是我们常说的封装性。 类的基本概念 类可以认为是对...
    24. d和harry.HireDay引用了同一个对象,对调用更改其方法就可以自动的改变这个雇员对象的私有状态。如果这里在main函数中更改引用的salary,就不会出现这个问题,如: class Employee { private String name; ...
    25. 什么是 openAPI ?

      万次阅读 2019-07-09 16:24:56
      对象详细说明了可与应用程序交互的路径,可用的方法以及这些交互包含的内容的详细信息。该对象包括请求参数和预期结果:   paths: /preference: get: summary: 根据ID发现用户设置 description: ...
    26. 客户关系系统定时(如24:00点)把客户数据的更新存放在某个约定的位置,营销系统也定时(如01:00点)去约定位置读取更新数据。请问以下用例图最准确地描绘了该营销系统有关客户数据更新功能需求的是(A) 应用题: ...
    27. 面向对象OOA、OOD、OOP

      千次阅读 2017-05-15 18:03:23
      Object-Oriented Analysis:面向对象分析方法 OOA是指在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别,OOA强调在系统调查资料的基础上,针对OO方法所...
    28. Linux实用教程(第三版)

      万次阅读 多人点赞 2019-08-27 22:55:59
      引进网络分组技术作为链路聚集的捆绑备用方法,对NetworkManager进行大量改进,提供动态防火墙守护进程firewalld,加入DNSSEC域名系统安全扩展,附带OpenLMI用来管理Linux系统提供常用的基础设施,引进了可信网络...
    29. 实体引言在领域驱动设计里,实体的设计可以说是通用语言的核心,也是最开始在模型划分中需要考虑的。怎么样设计实体和怎么样划分限界上下文同样重要。实体的概念就是要保证通用语言的完整性。领域驱动让设计实体的...
    30. 行有行规,面向对象编程的Java语言也不例外,遵循其相关原则,才能高效快速的编写高性能的代码。那么期间过程学习很重要,从一开始的基础知识学习,到大量的编写代码,回过头来再将学习的理论和实践相结合,每一个...
    31. webService详细

      万次阅读 多人点赞 2019-07-11 10:28:02
      表面上看WebService就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的方法API,能用编程的方法通过Web调用来实现某个功能的应用程序。 深层次上看WebService是一种新的Web应用程序分支,它们是自包含、...
    32. 第一章 面向对象及软件建模概述

      千次阅读 2017-12-01 09:03:41
      面向对象的软件建模 n6.统一建模语言UML 1 软件与软件工程  软件: 程序+文档+数据  特点:  (1)软件规模大。  (2)软件开发规范并趋于标准化。  (3)软件开发方法多,有大量的软件工具...
    33. JavaScript中对象转换为原始值的步骤

      千次阅读 2017-01-14 16:06:02
      JavaScript中对象转换为原始值的步骤
    34. JavaScript基础之对象与内置对象(三)

      千次阅读 多人点赞 2021-07-30 16:07:54
      在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。 对象是由属性和方法组成的: 属性:事物的特征,在对象中用属性来表示(常用名词) 方法:事物的...
    35. 上一篇博文我们使用json-lib来对json字符串和java对象进行互转 https://blog.csdn.net/liuying1802028915/article/details/92068465 这篇博文我们来使用jackson来对json字符串和java对象进行互转 这里引用一下...
    36. C语言再学习 -- 段错误(核心已转储)

      万次阅读 多人点赞 2016-12-21 12:22:57
      参看:Linux下的段错误产生的原因及调试方法参看:Linux环境下段错误的产生原因及调试方法小结参看:维基百科--Segmentation fault参看:LINUX内核段错误调试详细指南精品培训PPT讲义一、什么是段错误?一旦一个程序...
    37. Scala面向对象编程

      万次阅读 2018-11-07 11:18:49
      Scala面向对象编程 Scala程序设计 第2版 - 原版.pdf 下载: ... 目录: 1 类与对象初步 2 引用与值类型 3 价值类 4 父类 5 Scala的构造器 ... 6.2 一元方法 7 验证输入 8 调用父类构造器与良好的面向...
    38. Java核心语法

      千次阅读 2017-07-15 08:41:30
      3.OOP(面向对象编程) 二、编程规范 1.命名 2.文档注释 3.快捷键使用 三、JDK API 1.经常使用的API 2.核心API (1)日期操作 (2)集合操作 四、字符串 1.String 2. StringBuffer和StringBuilder 五、...
    39. Java:线程:CPU核心数目 与 多线程

      千次阅读 2018-10-01 00:16:29
       开始(创建):在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。  就绪:当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前...
    40. 面向对象复习总结

      千次阅读 2016-12-07 21:11:27
      面向对象方法是一种分析方法、设计方法和思维方法。 面向对象方法学的出发点和所追求的基本目标是使人们分析、设计与实现一个系统的方法尽可能接近人们认识一个系统的方法。 使描述问题的问题空间和解决问题...
    41. 阅读本博客前,需要了解基本的同步概念,传送门:http://note.youdao.com/noteshare?id=7f10475c6bb01658b955eaca531c0be6&amp;sub=590214A72B3C455FAB266C4...概括起来分为对象头、对象体和对齐字节。如下图所...
    42. 场景介绍 有时候用JPA的时候,想拥有mybatis如此轻松...之前的文章,介绍了用JPA进行关联查询并返回到一个接口类上面去,我还是用了这个方法作为前奏。具体可以看之前的文章,用一个interface来接收JPA返回的结果。 ...
    43. C++ 面试题大全

      千次阅读 多人点赞 2017-05-31 09:42:54
      1.new、delete、malloc...delete会调用对象的析构函数,和new对应,free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内
    44. 如何计算Java对象所占内存的大小

      万次阅读 多人点赞 2018-05-24 11:42:12
      摘要:本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、锁原理、分代GC、OOP-...
    45. 说明所有的对象都继承有toString() 和 valueOf() 方法对象到字符串,对象到数字的转换,会通过调用待转换对象的这两个方法中的一个来完成。 解释toString( )方法的作用是:返回一个反映这个对象的字符串,而很多类...
    46. Hutool核心,包括Bean操作、日期、各种Util等 <一>:Convert万能转换器。 (1):转换为字符串 long[] b = {1,2,3,4,5}; //bStr为:"[1, 2, 3, 4, 5]" String bStr = Convert.toStr(b); ------------------------...

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 57,619
    精华内容 23,047
    关键字:

    对象是00方法的核心