精华内容
下载资源
问答
  • 小甲鱼零基础入门学习python笔记

    万次阅读 多人点赞 2019-08-14 11:06:30
    017函数:Python的乐高积木 018 函数:灵活即强大 019函数:我的地盘听我的(局部变量与全局变量) 020函数:内嵌函数和闭包 021函数:lambda表达式 022 函数:递归是神马 023 递归:这帮小兔崽子 024 递归:汉诺塔...

    小甲鱼老师零基础入门学习Python全套资料百度云(包括小甲鱼零基础入门学习Python全套视频+全套源码+全套PPT课件+全套课后题及Python常用工具包链接、电子书籍等)请往我的资源(https://download.csdn.net/download/qq_32809093/13099592查看

    目录:

    000 愉快的开始
    001 我和Python的第一次亲密接触
    002 用Python设计第一个游戏
    003 小插曲之变量和字符串
    004 改进我们的小游戏
    005 闲聊之Python的数据类型
    006 Pyhon之常用操作符
    007 了不起的分支和循环
    008 了不起的分支和循环2
    009 了不起的分支和循环3
    010 列表:一个打了激素的数组
    011列表:一个打了激素的数组2
    012列表:一个打了激素的数组3
    013元组:戴上了枷锁的列表
    014字符串:各种奇葩的内置方法
    015字符串:格式化
    016 序列!序列!
    017函数:Python的乐高积木
    018 函数:灵活即强大
    019函数:我的地盘听我的(局部变量与全局变量)
    020函数:内嵌函数和闭包
    021函数:lambda表达式
    022 函数:递归是神马
    023 递归:这帮小兔崽子
    024 递归:汉诺塔
    025 字典:当索引不好用时
    026 字典:当索引不好用时2
    027 集合:在我的世界里,你就是唯一
    028 文件:因为懂你,所以永恒
    029 文件:一个任务
    030 文件系统:介绍一个高大上的东西
    031 永久存储:腌制一缸美味的泡菜(pickle)
    032 异常处理:你不可能总是对的
    033 异常处理:你不可能总是对的2
    034 丰富的else语句及简洁的with语句
    035 图形用户界面入门:EasyGui
    036 类和对象:给大家介绍对象
    037 类和对象:面向对象编程
    038 类和对象:继承
    039 类和对象:拾遗
    040 类和对象:一些相关的BIF
    041 魔法方法:构造和析构
    042 魔法方法:算术运算
    043 魔法方法:算术运算2
    044 魔法方法:简单定制
    045 魔法方法:属性访问
    046 魔法方法:描述符(Property的原理)
    047 魔法方法:定制序列
    048 魔法方法:迭代器
    049 乱入:生成器
    050 模块:模块就是程序
    051 模块:__name__='__main__'、搜索路径和包
    052 模块:像个极客一样去思考
    053 论一只爬虫的自我修养
    054 论一只爬虫的自我修养2:实战
    055 论一只爬虫的自我修养3:隐藏

    064 GUI的终极选择:Tkinter
    065 GUI的终极选择:Tkinter2
    066 GUI的终极选择:Tkinter3
    067 GUI的终极选择:Tkinter4
    068 GUI的终极选择:Tkinter5
    069 GUI的终极选择:Tkinter6
    070 GUI的终极选择:Tkinter7
    071 GUI的终极选择:Tkinter8
    073 GUI的终极选择:Tkinter10
    074  GUI的终极选择:Tkinter11
    075 GUI的终极选择:Tkinter12
    076 GUI的终极选择:Tkinter13
    077 GUI的终极选择:Tkinter14

    078 Pygame:初次见面,请大家多多关照

     

    000 愉快的开始

    python跨平台。
    应用范围:操作系统、WEB、3D动画、企业应用、云计算
    大家可以学到什么Python3的所有常用语法、面向对象编程思维、运用模块进行编程、游戏编程、计算机仿真

    Python 是脚本语言
    脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序。以简单的方式快速完成某些复杂的事情通常是创造脚本语言的重要原则,基于这项原则,使得脚本语言通常比 C 语言、C++语言 或 Java 之类的系统编程语言要简单容易。也让脚本语言另有一些属于脚本语言的特性:
    •  语法和结构通常比较简单
    •  学习和使用通常比较简单
    •  通常以容易修改程序的“解释”作为运行方式,而不需要“编译”
    •  程序的开发产能优于运行性能
    一个脚本可以使得本来要用键盘进行的相互式操作自动化。一个 Shell 脚本主要由原本需要在命令行输入的命令组成,或在一个文本编辑器中,用户可以使用脚本来把一些常用的操作组合成一组串行。主要用来书写这种脚本的语言叫做脚本语言。很多脚本
    语言实际上已经超过简单的用户命令串行的指令,还可以编写更复杂的程序。

    IDLE 是一个 Python Shell,shell 的意思就是“外壳”,基本上来说,就是一个通过键入文本与程序交互的途径!像我们 Windows 那个 cmd 窗口,像 Linux 那个黑乎乎的命令窗口,他们都是 shell,利用他们,我们就可以给操作系统下达命令。同样的,我们可以利用 IDLE 这个 shell 与 Python 进行互动。

    注:在 Python 中不能把两个完全不同的东西加在一起,比如说数字和文本

    如果我需要在一个字符串中嵌入一个双引号,正确的做法是:你可以利用反斜杠(\)对双引号转义:\",或者用单引号引起这个字符串

    001 我和Python的第一次亲密接触

    IDLE启动Python

    IDLE是一个Python Shellshell的意思就是“外壳”,基本上来说,就是一个通过键入文本与程序交互的途径

    我们看到>>>这个提示符,Ta的含义是告诉你,Python已经准备好了,在等着你键入Python指令呢

    好了,大家试试在IDLE里输入:

    >>>print (“I love fishc.com”)

    我们尝试点儿新的东西,我们输入

    >>>print(5+3)

    或者直接输入

    >>>5+3

    不妨在试试计算

    >>>1234567890987654321*987654321012345678

    还有我们可以将两个字符串“相加”在一起,这种做法叫做拼接字符串

    >>>print("well water"+"river")

    先试试

    >>> print("I love fishc.com"*2)

    >>> print("I love fishc.com\n"* 2)

    002 用Python设计第一个游戏

    实例1:

    print("---------我爱鱼C工作室----------")
    temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
    guess = int(temp)
    if guess == 8:
        print("我草,你是小甲鱼心里的蛔虫嘛?!")
        print("哼,猜中了也没有奖励!")
    else:
        print("猜错了,小甲鱼现在心里想的是8!")
        print("游戏结束,不玩啦")

    BIF 就是 Built-in Functions,内置函数。为了方便程序员快速编写脚本程序(脚本就是要编程速度快快快!!!),Python 提供了非常丰富的内置函数,我们只需要直接调用即可,例如 print() 的功能是“打印到屏幕”,input() 的作用是接收用户输入。

    在 Python 或 IDLE 中,输入 dir(__builtins__) 可以看到 Python 提供的内置方法列表(注意,builtins 前后是两个下划线哦)其中小写的就是 BIF。如果想具体查看某个BIF 的功能,比如 input(),可以在 shell 中输入 help(input),就会得到这个 BIF 的功能描述。哦,答案应该是 68 个

    >>> dir(__builtins__)  查看 Python 提供的内置方法列表

    >>> help(input)  查看input的具体使用说明 

    注:

    只有当标识符已经赋值后( Python 的变量是不用先声明的)才能在代码中使用,未赋值的标识符直接使用会导致运行时错误

    缩进是 Python 的灵魂

    Python 不允许 if 条件中赋值,所以 if c = 1: 会报错!

     

    003 小插曲之变量和字符串

    插曲之变量

    变量名就像我们现实社会的名字,把一个值赋值给一个名字时,Ta会存储在内存中,称之为变量(variable),在大多数语言中,都把这种行为称为“给变量赋值”或“把值存储在变量中”。

    不过Python与大多数其他计算机语言的做法稍有不同,Ta并不是把值存储在变量中,而更像是把名字贴在值的上边。

    所以有些Python程序员会说“Python”没有“变量”,只有“名字”。

    需要注意的地方

    在使用变量之前,需要对其先赋值。

    变量名可以包括字母、数字、下划线,但变量名不能以数字开头

    字母可以是大写或小写,但大小写是不同的。也就是说fishcFishC对于Python来说是完全不同的两个名字

    等号(=)是赋值的意思,左边是名字,右边是值,不可写反咯。

    插曲之字符串

    到目前为止,我们所认知的字符串就是引号内的一切东西,我们也把字符串叫做文本,文本和数字是截然不同的,咱看例子:>>>5+8

    >>> '5'+'8'

    要告诉Python你在创建一个字符串,就要在字符两边加上引号,可以是单引号或者双引号Python女士表示不挑剔。但必须成对,你不能一边单引号,另一边却花心的用上双引号结尾。

    如果字符串中需要出现单引号或双引号怎么办

    例如我想打印字符串:Let’s go!

    有两种方法,第一种比较常用,就是使用我们的转义符号(\)对字符串中的引号进行转义:

    >>> 'Let\'s go!'

    原始字符串

    好像反斜杠是一个好东西,但不妨试试打印:

    >>> str = 'C:\now'

    我们可以用反斜杠对自身进行转义:

    >>> str = 'C:\\now'

    原始字符串的使用非常简单,只需要在字符串前边加一个英文字母r即可(则都会以原始字符串输出):

    >>>str = r'C:\now'

    长字符串

    如果希望得到一个跨越多行的字符串,例如:

    我爱鱼C

    正如我爱小甲鱼,

    久久不肯散去……

    这我们就需要使用到三重引号字符串!

     

    004 改进我们的小游戏

    第一个改进要求:猜错的时候程序提示用户当前的输入比答案大了还是小了

    与操作and

    第二个改进要求:程序应该提供多次机会给用户猜测,专业点来讲就是程序需要重复运行某些代码。

    条件分支

    while循环

    实例1:找8

    temp = input("请输入一个数据:")
    guess = int(temp)
    i=0
    while guess != 8 and i < 3:
        i = i + 1
        temp = input("哎呀,猜错了,请重新输入吧:")
        guess = int(temp)
        if guess == 8:
            print("我草,你是小甲鱼心里的蛔虫嘛?")
            print("哼,猜对了也没有奖励")
        else:
            if guess > 8:
                print("哥,大了大了~~")
            else:
                print("嘿,小了!小了!!")
    print("游戏结束,不玩啦~~")

    random模块里边有一个函数叫做:randint()Ta会返回一个随机的整数。

    实例2:找随机数

    import random#导入随机数函数
    secret = random.randint(1,5)#随机生成1到5的一个随机数
    temp = input("请输入一个1-5的数据:")
    guess = int(temp)
    i=0
    while guess != secret and i < 6:
        i = i + 1
        guess = int(temp)
        if guess == secret:
            print("我草,你是小甲鱼心里的蛔虫嘛?")
            print("哼,猜对了也没有奖励")
        else:
            if guess > secret:
                print("哥,大了大了~~")
            else:
                print("嘿,小了!小了!!")      
            temp = input("请重新输入吧:")
    print("游戏结束,不玩啦~~")

     

    005 闲聊之Python的数据类型

    Python的一些数值类型:整型、布尔类型(True与False)、浮点型、e记法、复数类型等

    e记法(e4相当于10的四次方,e-10相当于10的-10次方)

    类型转换

    字符型转换为整型

    其它同上

    type()函数(可查看变量类型)

    isinstance()函数(用来判断两个输入参数类型是否一致)

     

    006 Pyhon之常用操作符

    算术操作符

    注:python中 \ 为除法, \\ 为整除 ,% 为取余

    幂运算(3的二次方)

    3的二次方后取负

    注:先幂运算、然后乘除、后加减、后逻辑

    3的负二次方

    比较操作符

    逻辑操作符

    优先级问题

    007 了不起的分支和循环

    打飞机游戏框架:

    加载背景音乐

    播放背景音乐(设置单曲循环)

    我方飞机诞生

    while True:
        if 用户是否点击了关闭按钮:
           推出程序
           
        interval += 1;
        if interval == 50:
           interval = 0;
           小飞机诞生
        小飞机移动一个位置
        屏幕刷新
        
        if 用户鼠标产生移动:
           我方飞机中心位置 = 用户鼠标位置
           屏幕刷新
           
        if 我方飞机与小飞机发生肢体冲突:
           我方挂,播放撞机音乐
           修改我方飞机图案
           打印“Game over"
           停止背景音乐,最好淡出

     

    008 了不起的分支和循环2

    现在小甲鱼来考考大家:

    按照100分制,90分以上成绩为A8090B6080C60以下为D,写一个程序,当用户输入分数,自动转换为ABCD的形式打印。

    score = int(input('请输入一个分数:'))
    if 100 >= score >= 90:
        print('A')
    elif 90 > score >= 80:
        print('B')
    elif 80 > score >= 60:
        print('C')
    elif 60 > score >= 0:
        print('D')
    else:
        print('输入错误!')

    条件表达式(三元操作符)

    有了这个三元操作符的条件表达式,你可以使用一条语句来完成以下的条件判断和赋值操作:

    x, y = 4, 5

    if x < y:

      small = x

    else:

      small = y

    例子可以改进为

    small = x if x < y else y    #如果x小于y,则small等于x,否则等于y

    断言(assert)

    assert这个关键字我们称之为“断言”,当这个关键字后边的条件为假的时候,程序自动崩溃并抛出AssertionError的异常。

    举个例子:

    >>> assert 3 > 4

    一般来说我们可以用Ta再程序中置入检查点,当需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert关键字就非常有用了

     

    009 了不起的分支和循环3

    while循环

    while 条件:

                      循环体

    for循环

    虽然说Python是由C语言编写而来的,但是Tafor循环跟C语言的for循环不太一样,Pythonfor循环显得更为智能和强大!

    语法:

    for 目标 in 表达式:

         循环体

    每次取FishC中一个字符及空格输出

    range()函数

    语法:range( [strat],[stop],[step] )

    这个BIF有三个参数,其中用中括号括起来的两个表示这两个参数是可选的。

    step=1表示第三个参数的值默认值是1setp为每步距离

    range这个BIF的作用是生成一个从start参数的值开始到stop参数的值结束的数字序列

     

    break语句(结束本层循环)

    实例:

    bingo = '小甲鱼是帅哥'
    answer = input('请输入小甲鱼最想听的一句话:')

    while True:
        if answer == bingo:
            break
        answer = input('抱歉,错了,请重新输入(答案正确才能退出游戏):')

    print('哎哟,帅哦~')
    print('您真是小甲鱼肚子里的蛔虫啊^_^')

    continue语句(当前位置结束本次循环,重新开始下次循环)

    实例:

    for i in range(10):
        if i%2 != 0:
            print(i)
            continue
        i += 2
        print(i)

    010 列表:一个打了激素的数组

    列表一个打了激素的数组

    创建列表

    创建一个普通列表

    创建一个混合列表

    创建一个空列表

    向列表添加元素

    append()函数向列表末尾添加一个元素

    extend()函数向列表末尾添加多个元素

    insert(n,xxx)函数向列表中第n个元素前插入一个元素

    注:0表示第一个元素

    011列表:一个打了激素的数组2

    从列表中获取元素

    跟数组一样,我们可以通过元素的索引值(index)从列表获取单个元素,注意,列表索引值是从 0 开始的。

    从列表删除元素

    remove()函数表示从列表中删除某个元素

    del()函数也表示从列表中删除某个元素

    pop()函数从列表中取出最后一个元素

    列表分片(Slice

    利用索引值,每次我们可以从列表获取一个元素,但是我们总是贪心的,如果一次性需要获取多个元素,有没有办法实现呢?利用列表分片,我们可以简单的实现这个要求。

    member[0:2]表示从第1个元素开始拷贝,一共拷贝两个元素,即member[0]和member[1]

    列表的拷贝

    012列表:一个打了激素的数组3

    列表的一些常用操作符

    比较操作符

    逻辑操作符

    连接操作符

    重复操作符

    成员关系操作符

    关于分片“拷贝”概念的补充

    >>> dir(list)可查看所有列表的操作函数

    count()函数可计算列表中相同元素个数

    index()函数可索引列表元素

    reverse()将列表中元素倒序

    sort()将列表中元素从小到大排序

    关于分片“拷贝”概念的补充

    注:list13=list11相当于多了个指向列表的标签,list12 = list[:]是实实在在的拷贝

    013元组:戴上了枷锁的列表

    由于和列表是近亲关系,所以元组和列表在实际使用上是非常相似的。

    我们这节课主要通过讨论元组和列表到底有什么不同来学习元组,酱紫大家就不会觉得老是重复一样的内容

    我们主要从以下几个点来讨论学习:

    创键和访问一个元组

    创建元组(括号可以没有,但逗号一定要有)

    访问元组前两个元素

    更新和删除一个元组

    更新一个元组

    注:其并未对原元组进行修改,而是生成了一个新的元组,并贴上temp名字标签而已。原元组由于标签没有了,则会被自动回收。

    删除一个元组

    元组相关的操作符

    注:元组不允许修改和删除。

    014字符串:各种奇葩的内置方法

     

    015字符串:格式化

    由于花括号被解释掉,所以不打印后面中文

    字符串格式化符号含义

    将ASCII码97对应的字符输出

    格式化整数

    格式化操作符辅助命令

    5表示输出为五位数

    Python 的转义字符及其含义

     

    016 序列!序列!

    列表、元组和字符串的共同点

    都可以通过索引得到每一个元素

    默认索引值总是从0开始

    可以通过分片的方法得到一个范围内的元素的集合

    有很多共同的操作符(重复操作符、拼接操作符、成员关系操作符)

    使用list方法

    元组转换为列表

    注:元组为小括号,列表为中括号。

    max() 返回序列或者参数集合中的最大值

    min() 返回序列或者参数集合中的最小值

    sum(iterable[,start=0]) 返回序列iterable和可选参数start的总和

    sorted()将元素从小到大重新排列

    reversed()将元素倒序排列

    注:元组是不可以修改和删除的,所以不可以直接对元组使用sorted与reversed命令

    enumerate()将每个元素插入枚举

    zip()返回由各个参数的序列组成的元组

     

    017函数:Python的乐高积木

    定义一个函数和调用

     

    018 函数:灵活即强大

    形参和实参

    >>> def MyFirstFunction(name):

      '函数定义过程中的name是叫形参'

      #因为Ta只是一个形式,表示占据一个参数位置

      print('传递进来的' + name + '叫做实参,因为Ta是具体的参数值!')

    >>> MyFirstFunction('小甲鱼')

    传递进来的小甲鱼叫做实参,因为Ta是具体的参数值!

    关键字参数

    默认参数(即形参中给定默认值,则在未给实参时会以默认值输出)

    收集参数

     

    019函数:我的地盘听我的

    函数与过程

    再谈谈返回值

    如果有返回值,函数则返回对应值;如果没有,则返回None

    可以返回多个值

    019函数:我的地盘听我的(局部变量与全局变量)

    def discounts(price, rate):
        final_price = price * rate
        old_price = 88 #这里试图修改全局变量
        print('修改后old_price的值是:', old_price)
        return final_price

    old_price = float(input('请输入原价:'))
    rate = float(input('请输入折扣率:'))
    new_price = discounts(old_price, rate)
    print('修改后old_price的值是:', old_price)
    print('打折后价格是:', new_price)

    global可将局部变量声明为全局变量

    020函数:内嵌函数和闭包

    内嵌函数

    闭包(closure

    注:使用nonlocal语句将x强制为不是局部变量

    021函数:lambda表达式

    lambda表达式的作用

    Python写一些执行脚本时,使用lambda就可以省下定义函数过程,比如说我们只是需要写个简单的脚本来管理服务器时间,我们就不需要专门定义一个函数然后再写调用,使用lambda就可以使得代码更加精简

    对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,有时候给函数起个名字也是比较头疼的问题,使用lambda就不需要考虑命名的问题了

    简化代码的可读性,由于普通的屌丝函数阅读经常要跳到开头def定义部分,使用lambda函数可以省去这样的步骤。

    过滤函数filter可筛选出非零元素

    筛选出奇数

    注:lambda x:x%2用来判断是否为奇,x为奇则输出1,否则输出0;range(10)可生成0-9的10个整数,filter用来筛选非零元素;如果为偶数,则被筛选掉;如果为奇数,则保留,但输出的是rang(10)产生的原始数,因为lambda只是用来判断是否为奇偶

    range生成的0-9给了x,x经过2倍运算后再赋值给x

    022 函数:递归是神马

    汉诺塔游戏

    树结构的定义

    谢尔宾斯基三角形

    递归求阶乘

    写一个求阶乘的函数

    正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。

    例如所给的数是5,则阶乘式是1×2×3×4×5,得到的积是120,所以120就是4的阶乘。

    假设我们n的值传入是5,那么:

    实例:求阶乘

    def factorial(n):
        result = n
        for i in range(1, n):
            result *= i

        return result

    number = int(input('请输入一个正整数:'))
    result = factorial(number)
    print("%d 的阶乘是:%d"  % (number, result))#格式化为整数类型

    实例2:递归求阶乘

    def factorial(n):
        if n == 1:
            return 1
        else:
            return n * factorial(n-1)

    number = int(input('请输入一个正整数:'))
    result = factorial(number)
    print("%d 的阶乘是:%d" % (number, result))

    023 递归:这帮小兔崽子

    坑爹的兔子

    斐波那契数列的迭代实现

    我们都知道兔子繁殖能力是惊人的,如下图:

    我们可以用数学函数来定义:

    课间练习:假设我们需要求出经历了20个月后,总共有多少对小兔崽子?(迭代 vs 递归

    def fab(n):
        n1 = 1
        n2 = 1
        n3 = 1

        if n < 1:
            print('输入有误!')
            return -1

        while (n-2) > 0:
            n3 = n2 + n1
            n1 = n2
            n2 = n3
            n -= 1
        
        return n3

    result = fab(20)
    if result != -1:
        print('总共有%d对小兔崽子诞生!' % result)

    斐波那契数列的递归实现

    递归实现(递归计算时间将拉长)

    def fab(n):
        if n < 1:
            print('输入有误!')
            return -1

        if n == 1 or n == 2:
            return 1
        else:
            return fab(n-1) + fab(n-2)

    result = fab(35)
    if result != -1:
        print('总共有%d对小兔崽子诞生!' % result)

    注:迭代计算时间远比递归少,因为递归要循环出入栈

    024 递归:汉诺塔

    递归求解汉诺塔

     

    对于游戏的玩法,我们可以简单分解为三个步骤

    将前63个盘子从X移动到Y上。

    将最底下的第64个盘子从X移动到Z上。

    Y上的63个盘子移动到Z上。

    问题一:将X上的63个盘子借助Z移到Y上;

    问题二:将Y上的63个盘子借助X移到Z上。

     

    对于游戏的玩法,我们可以简单分解为三个步骤

    将前63个盘子从X移动到Y上。

    将最底下的第64个盘子从X移动到Z上。

    Y上的63个盘子移动到Z上。

    问题一:将X上的63个盘子借助Z移到Y上;

    问题二:将Y上的63个盘子借助X移到Z上。

    实例:

    def hanoi(n, x, y, z):
        if n == 1:
            print(x, ' --> ', z)
        else:
            hanoi(n-1, x, z, y) # 将前n-1个盘子从x移动到y上
            print(x, ' --> ', z) # 将最底下的最后一个盘子从x移动到z上
            hanoi(n-1, y, x, z) # 将y上的n-1个盘子移动到z上

    n = int(input('请输入汉诺塔的层数:'))
    hanoi(n, 'X', 'Y', 'Z')

    025 字典:当索引不好用时

    映射

    创建和访问字典

    >>> dict4 = dict(小甲鱼='让编程改变世界',李宁='一切皆有可能')
    >>> dict4
    {'小甲鱼': '让编程改变世界', '李宁': '一切皆有可能'}

    >>> dict4['爱迪生'] = '天才是99%的汗水加1%的灵感'
    >>> dict4
    {'小甲鱼': '让编程改变世界', '李宁': '一切皆有可能', '爱迪生': '天才是99%的汗水加1%的灵感'}

    026 字典:当索引不好用时2

    fromkey()方法用于创建并返回一个新的字典它有两个参数,第一个参数是字典的键;第二个参数是可选的,是传入键的值。如果不提供,默认是None

    >>> dict1 = {}
    >>> dict1.fromkeys((1,2,3))
    {1: None, 2: None, 3: None}
    >>> dict2 = {}
    >>> dict2.fromkeys((1,2,3),"Number")
    {1: 'Number', 2: 'Number', 3: 'Number'}
    >>> dict3 = {}
    >>> dict3.fromkeys((1,2,3),('one','two','three'))
    {1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}

    访问字典的方法有key()、values()和items()

    key()用于返回字典中的键,value()用于返回字典中所有的值,item()当然就是返回字典中所有的键值对(也就是项)

    >>> dict1 = dict1.fromkeys(range(5),'赞')
    >>> dict1.keys()
    dict_keys([0, 1, 2, 3, 4])
    >>> dict1.values()
    dict_values(['赞', '赞', '赞', '赞', '赞'])
    >>> dict1.items()
    dict_items([(0, '赞'), (1, '赞'), (2, '赞'), (3, '赞'), (4, '赞')])

    get()方法提供了更宽松的方式去访问字典项,当键不存在的时候,get()方法并不会报错,只是默默第返回一个None,表示啥都没找到:

    >>> dict1.get(10)
    >>> dict1.get(4)
    '赞'

    如果希望找不到数据时返回指定的值,可以在第二个参数设置对应的默认返回值:

    >>> dict1.get(32,'木有')
    '木有'

    如果不知道一个键是否在字典中,可以使用成员资格操作符(in 或 not in)来判断
    >>> 31 in dict1
    False
    >>> 4 in dict1

    clear()可清空一个字典

    >>> dict1
    {0: '赞', 1: '赞', 2: '赞', 3: '赞', 4: '赞'}
    >>> dict1.clear()
    >>> dict1
    {}

    copy()方法是复制字典(全拷贝)

    >>> a = {1:'one',2:'two',3:'three'}
    >>> b = a.copy()
    >>> id(a)
    52448840
    >>> id(b)
    52503624
    >>> a[1] = 'four'
    >>> a
    {1: 'four', 2: 'two', 3: 'three'}
    >>> b
    {1: 'one', 2: 'two', 3: 'three'}

    pop()是给定键弹出对应的值,popitem()是随机弹出一个项

    >>> a.pop(2)
    'two'
    >>> a
    {1: 'four', 3: 'three'}
    >>> a.popitem()
    (1, 'four')
    >>> a
    {3: 'three'}

    setdefault()方法与get()方法相似,但setdefault()在字典中找不到相应的键值时会自动添加

    >>> a = {1:'one',2:'two',3:'three'}
    >>> a.setdefault(2)
    'two'
    >>> a.setdefault(4)
    >>> a
    {1: 'one', 2: 'two', 3: 'three', 4: None}

    update()方法可以更新字典

    >>> a = {1:'one','小白':None}

    >>> b = {'小白':'狗'}
    >>> a.update(b)
    >>> a
    {1: 'one', '小白': '狗'}

    027 集合:在我的世界里,你就是唯一

    字典的表亲--集合(在python3中,如果用大括号括起一堆数字但没有体现映射关系,那么就会认为这堆玩意儿就是个集合)

    >>> num1 = {}
    >>> type(num1)
    <class 'dict'>
    >>> num2 = {1,3,4}
    >>> type(num2)
    <class 'set'>

    集合中的元素都是唯一的(集合会自动帮我们把重复的数据清理掉,集合是无序的,所以不能试图去索引集合中的某一个元素

    >>> num = {1,2,3,4,5,5,4,3,2,1}
    >>> num
    {1, 2, 3, 4, 5}

    如何创建一个集合有两种方法:1、直接把一堆元素用大括号括起来;2、用set()

    一种是直接把一堆元素用花括号括起来

    >>> set1 = {'小甲鱼','小鱿鱼','小甲鱼'}

    一种是使用set()工厂函数

    >>> set2 = set(['小甲鱼','小鱿鱼','小甲鱼'])
    >>> set1 == set2
    True

    课堂搞搞看

    要求:去掉列表中重复的元素

    [0, 1, 2, 3, 4, 5, 5, 3, 1]

    方法一、

    >>> list1 = [1,2,3,4,5,5,3,1,0]

    >>> temp = list1[:]
    >>> list1.clear()
    >>> list1
    []
    >>> for each in temp:
        if each not in list1:
            list1.append(each) #append()表示向列表中添加元素

    方法二、

    >>> list1 = list(set(list1))
    >>> list1
    [0, 1, 2, 3, 4, 5]

    #set(list1)先将list1列表转变为集合, list(set(list1))再讲集合转变为列表

    如何访问集合中的值

    由于集合中的元素是无序的,所以并不能像序列那样用下标来进行访问,但是可以使用迭代把集合中的数据一个个读取出来

    可以使用for把集合中的数据一个个读取出来

    >>> set1 = {1,2,3,4,5,4,3,2,1,0}
    >>> for each in set1:
        print(each,end = ' ')

        
    0 1 2 3 4 5 

    •也可以通过innot in判断一个元素是否在集合中已经存在

    >>> 0 in set1
    True
    >>> 8 in set1
    False

    使用add()方法可以为集合添加元素,使用remove()方法可以删除集合中已知的元素:

    >>> set1.add(6)
    >>> set1
    {0, 1, 2, 3, 4, 5, 6}
    >>> set1.remove(5)
    >>> set1
    {0, 1, 2, 3, 4, 6}

    不可变集合(把元素给froze冰冻起来)(像元组一样不能随意地增加或删除集合中的元素)

    028 文件:因为懂你,所以永恒

    大多数u程序都是:首先接收输入数据,然后按照要求进行处理,最后输出数据

    虽然当前数据放在内存中存取的速度要比硬盘中快,但一旦断电则会丢失,所以尽量ctrl+s保持到硬盘中


    什么是文件

    打开文件

    open(file, mode='r', buffering=-1, encoding=None,errors=None, newline=None, closefd=True, opener=None)

    open()的第一个参数是传入的文件名,第二个参数是指定文件的打开模式

    文件对象方法

    >>> f = open("D:\\python3.3.2\Hello.txt")
    >>> f
    <_io.TextIOWrapper name='D:\\python3.3.2\\Hello.txt' mode='r' encoding='cp936'>
    >>> f.read()
    "A. HISTORY OF THE SOFTWARE\n==========================\n\nPython was created in the early 1990s by Guido van Rossum at Stichting\nMathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands\nas a successor of a language called ABC.  Guido remains Python's\nprincipal author, although it includes many contributions from others.\n\nIn 1995, Guido continued his work on Python at the Corporation for\nNational Research Initiatives (CNRI, see http://www.cnri.reston.va.us)\nin Reston, Virginia where he released several versions of the\nsoftware."
    >>> f.close()
    >>> f = open("D:\\python3.3.2\Hello.txt")
    >>> f.read(5)
    'A. HI'
    >>> f.tell()   #返回当前光标所在文件的位置
    5
    >>> f.readline()
    'STORY OF THE SOFTWARE\n'
    将f放入到列表

    >>> f = open("D:\\python3.3.2\Hello.txt",'w')#w模式写入会覆盖已存在的文件(即原文件内容全部被删除),a模式则在末尾追加写入
    >>> f.write('who are you')          #返回的是写入的字符数
    11
    >>> f.close()

    029 文件:一个任务

    任务:将文件(record.txt)中的数据进行分割并按照以下规律保存起来:

    小甲鱼的对话单独保存为boy_*.txt的文件(去掉“小甲鱼:”)

    小客服的对话单独保存为girl_*.txt的文件(去掉“小客服:”)

    文件中总共有三段对话,分别保存为boy_1.txt, girl_1.txtboy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt6个文件(提示:文件中不同的对话间已经使用“==========分割

    test1:

    f = open("record.txt")

    boy = []
    girl = []
    count = 1

    for each_line in f:
        if each_line[:6] != '======':#判断是否连续读到六个=
            (role,line_spoken) = each_line.split(':',1)#split以:进行字符切割,
            #将切得到的两部分内容依次存放在role与line_spoken中
            if role == '小甲鱼':
                boy.append(line_spoken)#将小甲鱼说的内容添加到列表boy中
            if role == '小客服':
                girl.append(line_spoken)#将小客服说的内容添加到列表girl中
        else:
            file_name_boy = 'boy_' + str(count) + '.txt'
            file_name_girl = 'girl_' + str(count) + '.txt'

            boy_file = open(file_name_boy,'w')#以w模式新建一个以file_name_boy命名的txt文件
            girl_file = open(file_name_girl,'w')#并贴上boy_file的标签

            boy_file.writelines(boy)#将列表boy中的内容写入到boy_file文件中
            girl_file.writelines(girl)

            boy_file.close()#关闭boy_file文件
            girl_file.close()

            boy = []#清空列表boy
            girl = []
            count += 1

    file_name_boy = 'boy_' + str(count) + '.txt'
    file_name_girl = 'girl_' + str(count) + '.txt'

    boy_file = open(file_name_boy,'w')
    girl_file = open(file_name_girl,'w')

    boy_file.writelines(boy)
    girl_file.writelines(girl)

    boy_file.close()
    girl_file.close()#记得关闭文件

    test2:

     

    def save_file(boy,girl,count):
        file_name_boy = 'boy_' + str(count) + '.txt'
        file_name_girl = 'girl_' + str(count) + '.txt'

        boy_file = open(file_name_boy,'w')
        girl_file = open(file_name_girl,'w')

        boy_file.writelines(boy)
        girl_file.writelines(girl)

        boy_file.close()
        girl_file.close()

    def split_file(file_name):
        f = open(file_name)

        boy = []
        girl = []
        count = 1

        for each_line in f:
            if each_line[:6] != '======':
                (role,line_spoken) = each_line.split(':',1)#split以:进行字符切割,
                #将切得到的两部分内容依次存放在role与line_spoken中
                if role == '小甲鱼':
                    boy.append(line_spoken)
                if role == '小客服':
                    girl.append(line_spoken)
            else:
                save_file(boy,girl,count)

                boy = []
                girl = []
                count += 1


        save_file(boy,girl,count)
        f.close()

    split_file('record.txt')

    030 文件系统:介绍一个高大上的东西

    os模块中关于文件/目录常用的函数使用方法

    >>> import os
    >>> os.getcwd()
    'D:\\python3.3.2\\小甲鱼python\\python程序\\第二十九课'

    >>> os.listdir('D:\\python3.3.2\\小甲鱼python\\python程序\\第二十九课')
    ['boy_1.txt', 'boy_2.txt', 'boy_3.txt', 'girl_1.txt', 'girl_2.txt', 'girl_3.txt', 'record.txt', 'test.py', 'test2.py']

    os.path模块中关于路径常用的函数使用方法

     >>> os.path.getsize('python.exe')  #获取文件的尺寸,返回值以字节为单位


    031 永久存储:腌制一缸美味的泡菜(pickle)

    python提供了一个标准的模块pickle可以非常容易地将列表、字典这类复杂的数据类型存储为文件。它几乎可以把所有python的对象都转化为二进制的形式存放,这个过程称为pickling,从二进制转换回对象的过程称为unpickling

    pickling过程

    >>> import pickle
    >>> my_list = [123,3,14,'小甲鱼',['another list']]

    >>> pickle_file = open('D:\\python3.3.2\小甲鱼python\python程序\第三十节课\my_list.pkl','wb')  #二进制写形式打开文件
    >>> pickle.dump(my_list,pickle_file)
    >>> pickle_file.close()

    unpickling过程       

    >>> import pickle
    >>> pickle_file = open('D:\\python3.3.2\小甲鱼python\python程序\第三十节课\my_list.pkl','rb')#以二进制读形式打开文件
    >>> my_list = pickle.load(pickle_file)
    >>> print(my_list)
    [123, 3, 14, '小甲鱼', ['another list']]

    实例:城市天气打包

    >>> pickle_file = open('D:\\python3.3.2\小甲鱼python\python程序\第三十一节课\city_data.pkl','wb')
    >>> pickle.dump(city,pickle_file)
    >>> pickle_file.close()

    032 异常处理:你不可能总是对的

    实例1:

    file_name = input('请输入需要打开的文件名:')
    file = open(file_name)
    print('文件的内容是:')
    for each_line in file:
        print(each_line)
    file.close()

    注:py文件与要打开的文件在同一个文件下则不需要加路径

    Python标准异常总结

    以下是 Python 内置异常类的层次结构:

            

    033 异常处理:你不可能总是对的2

    try-except语句

    try:

      检测范围

    except Exception[as reason]:

      出现异常(Exception)后的处理代码

    实例1:

    try:
        f = open('TE.txt')
        print(f.read())
        f.close()
    except OSError:
        print('文件打开过程中出错了!!!')

    实例2:

    try:
        f = open('TE.txt')
        print(f.read())
        f.close()
    except OSError as reason:
        print('文件打开出错原因是:\n' + str(reason))

    实例3:

    try:
        sum = 1 + '1'
        f = open('TE.txt')
        print(f.read())
        f.close()
    except OSError as reason:
        print('文件打开出错原因是:\n' + str(reason))
    except TypeError as reason:
        print('类型出错原因是:\n' + str(reason))

    实例4(多个异常统一处理):

    try:
        sum = 1 + '1'
        f = open('TE.txt')
        print(f.read())
        f.close()
    except(OSError, TypeError):
        print('出错了')

    注:try语句一旦检测到异常,剩下的语句将不会被执行

    try-finally语句

    try:

      检测范围

    except Exception[as reason]:

      出现异常(Exception)后的处理代码

    finally:

      无论如何都会被执行的代码

    实例5:

    try:
        f = open('test.txt')
        print(f.read())
        sum = 1 + '1'
    except (OSError,TypeError)as reason:
        print('出错了\n原因是:' + str(reason))
    finally:
        f.close()

    raise语句可以自己抛出一个异常

    034 丰富的else语句及简洁的with语句

    丰富的else语句

    要么怎样,要么不怎样

    if 条件:
        条件为真执行
    else:
        条件为假执行
          

    干完了能怎样,干不完就别想怎样

    实例1:

    def showMaxFactor(num):
        count = num // 2#//为整除,判断是素数,只需依次判断当前数num除以1到(num // 2)都不能整除即可
        while count > 1:
            if num % count == 0:#判断是否整除
                print('%d最大的约数是%d' % (num, count))
                break#跳出循环后else并不执行
            count -= 1
        else:#当while循环不成立时,或者理解为while循环完全被执行完了,没有给中途跳出(即break)
            print('%d是素数!' % num)

    num = int(input('请输入一个数:'))
    showMaxFactor(num)

    注:else与for语句搭配与while语句相同

    没有问题?那就干

    只要try语句块里没有出现任何异常,那么就会执行else语句块里的内容啦

    实例2:

    try:#尝试运行以下程序
        print(int('abc'))
    except ValueError as reason:#如果程序有异常时
        print('出错了:' + str(reason))
    else:#程序无异常时
        print('没有任何异常!')

    实例3:

    try:
        print(int('123'))
    except ValueError as reason:
        print('出错了:' + str(reason))
    else:
        print('没有任何异常!')

    简洁的with语句(with会自动帮你关闭文件)

    实例4:

    try:
        with open('test.txt','w') as f:
            for each_line in f:
                print(each_line)
    except (OSError,TypeError) as reason:
        print('出错了\n原因是:' + str(reason))

    035 图形用户界面入门:EasyGui

    图形用户界面编程,也就是平时常说的GUI(Graphical User  Interface),python有一个非常简单的GUI工具包:EasyGui

    GUI的安装

    导入方法一:

    >>> import easygui         #导入EasyGui
    >>> easygui.msgbox('嗨,亦我飞也')

    导入方法二:

    >>> from easygui import *
    >>> msgbox('嗨,亦我飞也')

    导入方法三(推荐使用):

    >>> import easygui as g
    >>> g.msgbox('嗨,亦我飞也')

    显示图片(注:图片需要为GIF格式,且存放在python.exe通目录

    >>> easygui.buttonbox(msg='你喜欢以下哪种水果',title='亦我飞也',choices=('草莓','西瓜','芒果'),image='aa.gif')

    实例1:

    import easygui as g
    import sys
     
    while 1:
        g.msgbox("嗨,欢迎进入第一个界面小游戏")
        msg = "请问你希望在鱼C工作室学习到什么知识呢"
        title="小游戏互动"
        choices=["谈恋爱","编程","OOXX","琴棋书画"]
        choice=g.choicebox(msg,title,choices)
     
        #note that we convert choice to string,in case
        #the user cancelled the choice,and we got None
        g.msgbox("你的选择是:"+str(choice),"结果")
        msg="你希望重新开始小游戏吗?"
        title=" 请选择"
        if g.ccbox(msg,title):  #show a Contiue/Cancel dialog
            pass #user chose Contonue
        else:
            sys.exit(0)  #user chose Cancel

    修改窗口大小(choicebox)

    修改文字大小(PROPORTIONAL_FONT)

    036 类和对象:给大家介绍对象

    给大家介绍对象

    把乱七八糟的数据扔进列表里,称数据层面的封装

    把常用的代码段打包成一个函数,称语句层面的封装

    把数据和代码都封装在一起,称对象层面的封装

    对象 = 属性 + 方法

    对象可以从静态(属性)动态(方法)两个特征来描述

    OO(面向对象)的特征

    继承

    class Turtle: # Python 中的类名约定以大写字母开头
        """关于类的一个简单例子"""
        # 属性
        color = 'green'
        weight = 10
        legs = 4
        shell = True
        mouth = '大嘴'

        # 方法
        def climb(self):
            print("我正在很努力的向前爬......")

        def run(self):
            print("我正在飞快的向前跑......")

        def bite(self):
            print("咬死你咬死你!!")

        def eat(self):
            print("有得吃,真满足^_^")

        def sleep(self):
            print("困了,睡了,晚安,Zzzz")

    调用类中的方法:

    >>> tt = Turtle()     #声明tt对象继承Turtle()
    >>> tt.climb()
    我正在很努力的向前爬......
    >>> tt.bite()
    咬死你咬死你!!

    定义一个带列表类MyList,将list2对象继承于它,则列表的功能继承它的对象都可以使用

    >>> class MyList(list):
        pass

    >>> list2 = MyList()

    >>> list2.append(5)
    >>> list2.append(6)

    >>> list2.append(1)
    >>> list2
    [5, 6, 1]
    >>> list2.sort()
    >>> list2
    [1, 5, 6]

    多态(下例中都调用的名字相同的方法,但实现不一样)

    >>> class A:
        def fun(self):
            print('我是小A。。。')

            
    >>> class B:
        def fun(self):
            print('我是小B。。。')

            
    >>> a = A()
    >>> b = B()
    >>> a.fun()
    我是小A。。。
    >>> b.fun()
    我是小B。。。

    037 类和对象:面向对象编程

    self是什么?

    Python的self其实就相当于C++的this指针。由同一个类可以生产无数对象,当一个对象的方法被调用的时候,对象会将自身的引用作为第一个参数传给该方法,那么python就知道需要操作哪个对象的方法了。

    >>> class Ball:
        def setName(self,name):
            self.name = name
        def kick(self):
            print('我叫%s,该死的,谁踢我。。。' % self.name)

            
    >>> a = Ball()

    >>> a.setName('球A')
    >>> b = Ball()

    >>> b.setName('球B')

    >>> a.kick()
    我叫球A,该死的,谁踢我。。。
    >>> b.kick()
    我叫球B,该死的,谁踢我。。。

    你听说过Python的魔法方法吗?

    python的这些具有魔法的方法,总是被双下划线所包围,例如__init__(),即构造方法,也称构造函数,这个方法会在对象被创建时自动调用。其实,实例化对象时是可以传入参数的,这些参数会自动传入__init__()方法中,可以通过重写这个方法来自定义对象的初始化操作

    实例:

    >>> class Ball():
        def __init__(self,name):
            self.name = name
        def kick(self):
            print('我叫%s,该死的,谁踢我。。。' % self.name)

            
    >>> b = Ball('小土豆')
    >>> b.kick()
    我叫小土豆,该死的,谁踢我。。。

    公有和私有?python内部采用了一种叫 name mangling(名字改编)的技术

    默认上对象的属性和方法都是公开的,可以直接通过点操作符(.)进行访问:

    >>> class Person:
        name = '亦我飞也'

        
    >>> p = Person()
    >>> p.name
    '亦我飞也'

    为了实现定义私有变量,只需要在变量名或函数名前加上"__"两个下划线,那么这个函数或变量就会变成私有的了:

    私有变量不可以直接由外部访问

    >>> class Person:
        __name = '亦我飞也'

        
    >>> p = Person()
    >>> p.__name
    Traceback (most recent call last):
      File "<pyshell#65>", line 1, in <module>
        p.__name
    AttributeError: 'Person' object has no attribute '__name'

    室友变量可以由内部(内部函数)进行访问

    >>> class Person:
        __name = '亦我飞也'
        def getName(self):
            return self.__name

        
    >>> p = Person()
    >>> p.__name
    Traceback (most recent call last):
      File "<pyshell#72>", line 1, in <module>
        p.__name
    AttributeError: 'Person' object has no attribute '__name'

    >>> p.getName()
    '亦我飞也'

    其实,name mangling(名字改编)技术,只是把双下划线开头的变量进行了改名而已。实际上在外部使用“_类名__变量名“即可访问双下划线开头的私有变量了

    >>> p._Person__name
    '亦我飞也'

    038 类和对象:继承

    继承

                      子类                              父类

    class DerivedClassName(BaseClassName):

    ……

    实例:一个子类可以继承它的父类的所有属性和方法

    >>> class Parent:
        def hello(self):
            print('正在调用父类的方法。。。')

            

    >>> class Child(Parent):    #子类继承父类
        pass     #直接往下执行

    >>> p = Parent()
    >>> p.hello()
    正在调用父类的方法。。。
    >>> c = Child()
    >>> c.hello()
    正在调用父类的方法。。。

    如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法和属性(即子类方法属性改变,父类是不变的)

    >>> class Child(Parent):
        def hello(self):
            print('正在调用子类的方法')

            
    >>> c = Child()
    >>> c.hello()
    正在调用子类的方法
    >>> p.hello()
    正在调用父类的方法。。。

    实例2:

    import random as r
    class Fish:
        def __init__(self):
            self.x = r.randint(0,10)
            self.y = r.randint(0,10)

        def move(self):
            self.x -= 1
            print('我的位置是:',self.x,self.y)


    class Goldfish(Fish):
        pass

    class Garp(Fish):
        pass

    class Shark(Fish):
        def __init__(self):
            self.hungry = True

        def eat(self):
            if self.hungry:
                print('吃货的梦想就是天天有的吃')
                self.hungry = False
            else:
                print('太撑了,吃不下了!')

    >>> fish = Fish()
    >>> fish.move()
    我的位置是: -1 10
    >>> fish.move()
    我的位置是: -2 10
    >>> goldfish = Goldfish()
    >>> goldfish.move()
    我的位置是: 2 3
    >>> goldfish.move()
    我的位置是: 1 3
    >>> shark = Shark()
    >>> shark.eat()
    吃货的梦想就是天天有的吃
    >>> shark.eat()
    太撑了,吃不下了!
    >>> shark.move()    #报错原因时因为子类重写构造函数,覆盖了父类D的构造函数
    Traceback (most recent call last):
      File "<pyshell#9>", line 1, in <module>
        shark.move()
      File "D:\python3.3.2\小甲鱼python\python程序\第三十八节课\fish.py", line 8, in move
        self.x -= 1
    AttributeError: 'Shark' object has no attribute 'x'

    注:继承父类属性的子类,其变量值只属于当前子类,是子类的局部变量

    报错修改部分解决方法一:调用未绑定的父类方法

    >>> shark = Shark()
    >>> shark.move()
    我的位置是: 2 1
    >>> shark.move()
    我的位置是: 1 1

    报错修改部分解决方法二:使用super函数super函数会帮我们自动找到基类的方法,而且还自动为我们传入self参数

    >>> shark = Shark()
    >>> shark.move()
    我的位置是: 1 1
    >>> shark.move()
    我的位置是: 0 1

    多重继承

    class DerivedClassName(Base1, Base2, Base3):

    ……

    实例:子类c同时继承基类Base1和基类Base2

    >>> class Base1:
        def fool1(self):
            print('我是fool1,我为Base1代言。。。')

            
    >>> class Base2:
        def fool2(self):
            print('我是fool2,我为Base2代言。。。')

            
    >>> class C(Base1,Base2):
        pass

    >>> c = C()
    >>> c.fool1()
    我是fool1,我为Base1代言。。。
    >>> c.fool2()
    我是fool2,我为Base2代言。。。

    039 类和对象:拾遗

    组合(将需要的类一起进行实例化并放入新的类中)

    实例:

    class Turtle:
        def __init__(self,x):
            self.num = x

    class Fish:
        def __init__(self,x):
            self.num = x

    class Pool:
        def __init__(self,x,y):
            self.turtle = Turtle(x)
            self.fish = Fish(y)

        def print_num(self):
            print('水池里一共有乌龟 %d 条,鱼 %d 条' % (self.turtle.num,self.fish.num))

    >>> pool = Pool(5,2)
    >>> pool.print_num()
    水池里一共有乌龟 5 条,鱼 2 条

    现在要求定义一个类,叫水池,水池里要有乌龟和鱼。

    类、类对象和实例对象

    以下例子可见,对实例对象c的count属性赋值后,就相当于覆盖了类对象C的count属性。如果没有赋值覆盖,那么引用的是类对象的count属性

    >>> a = C()
    >>> b = C()
    >>> c = C()
    >>> print(a.count,b.count,c.count)
    0 0 0
    >>> c.count += 10
    >>> print(a.count,b.count,c.count)
    0 0 10
    >>> C.count += 100
    >>> print(a.count,b.count,c.count)
    100 100 10

    另外,如果属性的名字跟方法名相同,属性会覆盖方法:

    >>> class C:
        def x(self):
            print('X-man')

            
    >>> c = C()
    >>> c.x()
    X-man
    >>> c.x = 1              #新定义对象c的一个x属性,并赋值为1
    >>> c.x
    1
    >>> c.x()     #可见,方法x()已经被属性x给覆盖了
    Traceback (most recent call last):
      File "<pyshell#8>", line 1, in <module>
        c.x()
    TypeError: 'int' object is not callable

    结论:不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展;用不同的词性命名,如属性名用名词、方法名用动词,并使用骆驼命名法等。

    到底什么是绑定?

    实例1:(python严格要求需要有实例才能被调用,即绑定概念)

    >>> class BB:
        def printBB():        #缺少self,导致无法绑定具体对象
            print('no zuo no die')

            
    >>> BB.printBB()
    no zuo no die
    >>> bb = BB()
    >>> bb.printBB()        #出现错误原因是由于绑定机制,自动把bb对象作为第一个参数传入
    Traceback (most recent call last):
      File "<pyshell#15>", line 1, in <module>
        bb.printBB()
    TypeError: printBB() takes 0 positional arguments but 1 was given

     

    Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念。

    040 类和对象:一些相关的BIF

    一些相关的BIF

    issubclass(class, classinfo)  如果第一个参数(class)是第二个参数(classinfo)的一个子类,则返回True,否则返回False

    >>> class A:
        pass

    >>> class B(A):
        pass

    >>> issubclass(B,A)
    True
    >>> issubclass(B,B)   #一个类被认为是其自身的子类
    True
    >>> issubclass(B,object)      # object是所有类的基类
    True
    >>> class C:
        pass

    >>> issubclass(B,C)
    False

    isinstance(object, classinfo)  如果第一个参数(object)是第二个参数(classinfo)的实例对象,则返回True,否则返回False

    >>> issubclass(B,C)       注:第一个参数如果不是对象,则永远返回False
    False
    >>> b1 = B()
    >>> isinstance(b1,B)
    True
    >>> isinstance(b1,C)
    False
    >>> isinstance(b1,A)
    True
    >>> isinstance(b1,(A,B,C))
    True

    hasattr(object, name)  用来测试一个对象里是否有指定的属性,第一个参数(object)是对象,第二个参数(name)是属性名(属性的字符串名字)

    >>> class C:
        def __init__(self,x=0):
            self.x = x

            
    >>> c1 = C()
    >>> hasattr(c1,'x')    
    #注意,属性名要用引号括起来
    True

     

    getattr(object, name[, default])  返回对象指定的属性值,如果指定的属性不存在,则返回default(可选参数);若没有设置default参数,则抛出异常

    >>> getattr(c1,'x')
    0
    >>> getattr(c1,'y')

    Traceback (most recent call last):
      File "<pyshell#25>", line 1, in <module>
        getattr(c1,'y')
    AttributeError: 'C' object has no attribute 'y'

    setattr(object, name, value)  可以设置对象中指定属性的值,如果指定的属性不存在,则会新建属性并赋值
    >>> setattr(c1,'y','FishC')
    >>> getattr(c1,'y')
    'FishC'

    delattr(object, name)  用于删除对象中指定的属性,如果属性不存在,抛出异常。

    >>> delattr(c1,'y')
    >>> delattr(c1,'Z')

    Traceback (most recent call last):
      File "<pyshell#30>", line 1, in <module>
        delattr(c1,'Z')
    AttributeError: Z

    property(fget=None, fset=None, fdel=None, doc=None)  用来通过属性设置属性,第一个参数是获取属性的方法名,第二个参数是设置属性的方法名,第三个参数是删除属性的方法名

    >>> class C:
        def __init__(self,size =10):
            self.size = size
        def getSize(self):
            return self.size
        def setSize(self,value):
            self.size = value
        def delSize(self):
            del self.size
        x=property(getSize,setSize,delSize)

        

    >>> c = C()
    >>> c.x         #调用getSize()
    10
    >>> c.x = 12      #调用SetSize()
    >>> c.x
    12
    >>> c.size
    12
    >>> del c.x      #调用DelSize()
    >>> c.size
    Traceback (most recent call last):
      File "<pyshell#53>", line 1, in <module>
        c.size
    AttributeError: 'C' object has no attribute 'size'

    041 魔法方法:构造和析构

    __init__(self[, ...]) 方法是类在实例化成对象的时候首先会调用的一个方法

    >>> class Rectangle:
        def __init__(self,x,y):
            self.x = x
            self.y = y
        def getPeri(self):
            return (self.x + self.y) * 2
        def getArea(self):
            return self.x * self.y

    >>> rect = Rectangle(5,2)
    >>> rect.getPeri()
    14
    >>> rect.getArea()
    10

       注:__init__()方法的返回值一定是None 

    其实,__new__()才是在一个对象实例化时候所调用的第一个方法,它的第一个参数是这个类(cla),而其他的参数会直接传递给__init__()方法

    __new__(cls[, ...])

    >>> class CapStr(str):
        def __new__(cls,string):
            string = string.upper()
            return str.__new__(cls,string)

        
    >>> a = CapStr('hello world')
    >>> a
    'HELLO WORLD

    __del__(self)  当对象将要被销毁的时候,这个方法就会被调用。但要注意,并非del x就相当于调用x.__del__(),__del__()方法是当垃圾回收机制回收这个对象的时候才调用的。

    >>> class C:
        def __init__(self):
            print('我是__init__方法,我被调用了...')
        def __del__(self):
            print('我是__del__方法,我被调用l...')

            
    >>> c1 = C()     #创建对象c1
    我是__init__方法,我被调用了...
    >>> c2 = c1
    >>> c3 = c2
    >>> del c1
    >>> del c2
    >>> del c3   #删除c3时,对象c1才会彻底被删除(即没有标签指向对象c1时,其才会被回收)
    我是__del__方法,我被调用l...

    042 魔法方法:算术运算

    python2.2以后,对类和类型进行了统一,做法就是讲int()、float()、str()、list()、tuple()这些BIF转换为工厂函数(类对象):

    >>> type(len)
    <class 'builtin_function_or_method'>            #普通的BIF
    >>> type(int)
    <class 'type'>             #工厂函数(类对象),当调用它们的时候,其实就是创建了一个相应的实例对象
    >>> type(dir)
    <class 'builtin_function_or_method'>
    >>> type(list)
    <class 'type'>

    >>> a = int('123')        #创建一个相应的实例对象a
    >>> b = int('345')
    >>> a + b              #python在两个对象进行相加操作
    468

    举个例子,下面定义一个比较特立独行的类:

    >>> class New_int(int):
        def __add__(self,other):
            return int.__sub__(self,other)
        def __sub__(self,other):
            return int.__add__(self,other)

        
    >>> a = New_int(3)
    >>> b = New_int(5)
    >>> a + b    #两个对象相加,触发 __add__(self,other)方法
    -2
    >>> a - b
    8
    >>>

    实例2:

    >>> class New_int(int):
        def __add__(self,other):
            return (int(self) + int(other))       #将self与other强制转换为整型,所以不会出现两个对象相加触发__add__()方法
        def __sub__(self,other):
            return (int(self) - int(other))

        
    >>> a = New_int(3)
    >>> b = New_int(5)
    >>> a + b
    8

    043 魔法方法:算术运算2

    实例1:

    >>> class int(int):
        def __add__(self,other):
            return int.__sub__(self,other)

        
    >>> a = int(3)
    >>> b = int(2)
    >>> a + b
    1

    反运算:

    反运算与算术运算符的不同之处是,反运算多了一个'r',例如 __add__()的反运算对应为 __radd__()

    >>> a + b

    这里a是加数,b是被加数,如果a对象的__add__()方法没有实现或者不支持相应的操作,那么python就会自动调用b的__radd__()方法

    实例:

    >>> class Nint(int):
        def __radd__(self,other):
            return int.__sub__(self,other)

        
    >>> a = Nint(5)
    >>> b = Nint(3)
    >>> a + b      #由于a对象默认有__add__()方法,所以b的__radd__()没有执行
    8

    实例2:

    >>> class Nint(int):
        def __radd__(self,other):
            return int.__sub__(self,other)

        
    >>> b = Nint(5)
    >>> 3 + b         #由于3无__add__()方法,所以执行b的反运算__radd__(self,other)方法,其中self是b对象
    2

    注:在重写反运算魔法方法时,一定要注意顺序问题。

    增量赋值运算:

    比较操作符:

    其它操作符:

    044 魔法方法:简单定制

    简单定制

    基本要求:

    定制一个计时器的类

    startstop方法代表启动计时和停止计时

    假设计时器对象t1print(t1)和直接调用t1均显示结果

    当计时器未启动或已经停止计时,调用stop方法会给予温馨的提示

    两个计时器对象可以进行相加:t1 + t2

    只能使用提供的有限资源完成

    你需要这些资源

    使用time模块的localtime方法获取时间

    扩展阅读:time 模块详解(时间获取和转换)

    有关time模块的localtime方法获取时间(参考:

    https://fishc.com.cn/forum.php?mod=viewthread&tid=51326&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403

    time.localtime返回struct_time的时间格式

    表现你的类:__str__ __repr__

    实例:

    import time as t   #导入时间模块,调用对象t

    class Mytimer():
        def __init__(self):
            self.unit = ['年','月','天','小时','分钟','秒']
            self.prompt = "未开始计时"
            self.lasted = []
            self.begin = 0  #属性
            self.end = 0
        def __str__(self):
            return self.prompt

        __repr__ = __str__

        def __add__(self,other):   #重写加法操作符,运行时间相加
            prompt = "总共运行了"
            result = []
            for index in range(6):
                result.append(self.lasted[index] + other.lasted[index])
                if result[index]:
                    prompt += (str(result[index]) + self.unit[index])
            return prompt
                               
        #开始计时
        def start(self):    #方法,属性名和方法名不能相同
            if not self.stop:
                self.prompt = ("提示:请先调用stop()停止计时!")
            else:
                self.begin = t.localtime()
                print('计时开始...')

        #停止计时
        def stop(self):
            if not self.begin:
                print('提示:请先调用start()进行计时!')
            else:
                self.end = t.localtime()
                self._calc()
                print('计时结束!')

        #内部方法,计算运行时间
        def _calc(self):
            self.prompt = "总共运行了"
            for index in range(6):
                self.lasted.append(self.end[index] - self.begin[index])
                if self.lasted[index]:
                    self.prompt += (str(self.lasted[index]) + self.unit[index])
            #为下一轮计时初始化变量
            self.begin = 0
            self.end = 0

    >>> t1 = Mytimer()
    >>> t1.stop()
    提示:请先调用start()进行计时!
    >>> t1.start()
    计时开始...
    >>> t1.stop()
    计时结束!
    >>> t1
    总共运行了4秒
    >>> t2 = Mytimer()
    >>> t2.start()
    计时开始...
    >>> t2.stop()
    计时结束!
    >>> t2
    总共运行了4秒
    >>> t1 + t2
    '总共运行了8秒'        

    进阶定制

    如果开始计时的时间是202222216:30:30,停止时间是202512315:30:30,那按照我们用停止时间减开始时间的计算方式就会出现负数3-11-1小时)你应该对此做一些转换

    现在的计算机速度都非常快,而我们这个程序最小的计算单位却只是秒,精度是远远不够的

    045 魔法方法:属性访问

    属性访问

    __getattr__(self, name)

    定义当用户试图获取一个不存在的属性时的行为

    __getattribute__(self, name)

    定义当该类的属性被访问时的行为

    __setattr__(self, name, value)

    定义当一个属性被设置时的行为

    __delattr__(self, name)

    定义当一个属性被删除时的行为

    实例1:

    class C:
        def __getattribute__(self, name):
            print('getattribute')
            # 使用 super() 调用 object 基类的 __getattribute__ 方法
            return super().__getattribute__(name)

        def __setattr__(self, name, value):
            print('setattr')
            super().__setattr__(name, value)

        def __delattr__(self, name):
            print('delattr')
            super().__delattr__(name)

        def __getattr__(self, name):
            print('getattr')

    >>> c = C()
    >>> c.x
    getattribute
    getattr
    >>> c.x = 1
    setattr
    >>> c.x
    getattribute
    1
    >>> del c.x
    delattr
    >>> setattr(c,'y','Yellow')
    setattr

    练习要求

    写一个矩形类,默认宽和高两个属性

    如果为一个叫square的属性赋值,那么说明这是一个正方形,值就是正方形的边长,此时宽和高都应该等于边长。

    实例2:

    class Rectangle:
        def __init__(self, width=0, height=0):
            self.width = width
            self.height = height

        def __setattr__(self, name, value):#一发生赋值操作,则会触发__setattr__()魔法方法
            if name == 'square':#判断name属性是否为正方形
                self.width = value
                self.height = value
            else:
                self.__dict__[name] = value

        def getArea(self):
            return self.width * self.height

    >>> r1 = Rectangle(4,5)
    >>> r1.getArea()
    20
    >>> r1.square = 10
    >>> r1.getArea()
    100

    046 魔法方法:描述符(Property的原理)

    描述符

    描述符就是将某种特殊类型的类的实例指派给另一个类的属性。

    __get__(self, instance, owner)

    用于访问属性,它返回属性的值

    __set__(self, instance, value)

    将在属性分配操作中调用,不返回任何内容

    __delete__(self, instance)

    控制删除操作,不返回任何内容

    实例:

    >>> class MyDecriptor:
        def __get__(self,instance,owner):
            print("getting...",self,instance,owner)
        def __set__(self,instance,value):
            print("setting...",self,instance,value)
        def __delete__(self,instance):
            print("deleting...",self,instance)

     

    >>> class Test:
        x = MyDecriptor()   #取Mydecriptor类的实例指派给Test类的属性x

    >>> test = Test()
    >>> test.x
    getting... <__main__.MyDecriptor object at 0x00000000033467F0> <__main__.Test object at 0x000000000335EF98> <class '__main__.Test'>
    >>> test
    <__main__.Test object at 0x000000000335EF98>
    >>> test.x = "X-man"
    setting... <__main__.MyDecriptor object at 0x00000000033467F0> <__main__.Test object at 0x000000000335EF98> X-man
    >>> del test.x
    deleting... <__main__.MyDecriptor object at 0x00000000033467F0> <__main__.Test object at 0x000000000335EF98>

     

    实例2:

    >>> class MyProperty:
        def __init__(self,fget = None,fset = None,fdel = None):
            self.fget = fget
            self.fset = fset
            self.fdel = fdel
        def __get__(self,instance,owner):
            return self.fget(instance)
        def __set__(self,instance,value):
            self.fset(instance,value)
        def __delete__(self,instance):
            self.fdel(instance)

            
    >>> class C:
        def __init__(self):
            self._x = None
        def getX(self):
            return self._x
        def setX(self,value):
            self._x = value
        def delX(self):
            del self._x
        x = MyProperty(getX,setX,delX)

        
    >>> c = C()
    >>> c.x = "HELLOW"
    >>> c.x
    'HELLOW'
    >>> c._x
    'HELLOW'
    >>> del c.x
    >>> c._x
    Traceback (most recent call last):
      File "<pyshell#70>", line 1, in <module>
        c._x
    AttributeError: 'C' object has no attribute '_x'

    练习要求

    先定义一个温度类,然后定义两个描述符类用于描述摄氏度和华氏度两个属性

    要求个属性会自动进行转换,也就是说你可以给摄氏度这个属性赋值,然后打印的华氏度属性是自动转换后的结果。

    实例3:

    ss Celsius:  #摄氏度描述符类
        def __init__(self,value = 26.0):#self为描述符类自身(此为摄氏度描述符类)的实例(此为cel)
            self.value = float(value)
        def __get__(self,instance,owner):#instance是这个描述符的拥有者所在的类的实例(此为temp)
            return self.value
        def __set__(self,instance,value):#owner是这个描述符的拥有者所在的类本身(此为温度类)
            self.value = float(value)

    class Fahrenheit:   #华氏度描述符类
        def __get__(self,instance,owner):
            return instance.cel * 1.8 +32  #摄氏度转华氏度
        def __set__(self,instance,value):
            instance.cel = ((float)(value)- 32)/ 1.8   #华氏度转摄氏度
            
    class Temperature:   #温度类
        cel = Celsius()   #设置摄氏度属性(描述符类的实例指派给了温度类的属性)
        fah = Fahrenheit()#设置华氏度属性

    >>> temp = Temperature()
    >>> temp.cel
    26.0
    >>> temp.fah
    78.80000000000001
    >>> temp.fah = 78.8
    >>> temp.cel
    25.999999999999996

    047 魔法方法:定制序列

    协议是什么?

    协议(Protocols)与其他编程语言中的接口很相似,它规定你哪些方法必须要定义。然而,在Python中的协议就显得不那么正式。事实上,在Python中,协议更像是一种指南

    容器类型的协议

    如果说你希望定制的容器是不可变的话,你只需要定义__len__()__getitem__()方法。

    如果你希望定制的容器是可变的话,除了__len__()__getitem__()方法,你还需要定义__setitem__()__delitem__()两个方法。

    练习要求

    编写一个不可改变的自定义列表,要求记录列表中每个元素被访问的次数。

    class CountList:  #定义记录列表中每个元素访问次数类
        def __init__(self,*args): #参数是可变类型的
            self.values = [x for x in args]#将args的数据存入列表self.values中
            self.count = {}.fromkeys(range(len(self.values)),0)#创建字典,初试化为0

        def __len__(self):  #返回容器中元素的个数
            return len(self.values)#len方法用于返回参数的长度 
        def __getitem__(self,key):  #获取容器中指定元素的行为,key为访问对应的键
            self.count[key] += 1#每访问一次,字典键对应的键值加1
            return self.values[key]

    >>> c1 = CountList(1,3,5,7,9)
    >>> c2 = CountList(2,4,6,8,10)
    >>> c1[1]  #c1[1]第一次访问
    3
    >>> c2[2]
    6
    >>> c1[1] + c2[2] #c1[1]第二次访问
    9
    >>> c1.count
    {0: 0, 1: 2, 2: 0, 3: 0, 4: 0}
    >>> c2.count
    {0: 0, 1: 0, 2: 2, 3: 0, 4: 0}

    048 魔法方法:迭代器

    迭代的意思类似于循环,每一次重复的过程被称为一次迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。提供迭代方法的容器称为迭代器(如序列(列表、元组、字符串)、字典等)。

    对一个容器对象调用iter()就得到它的迭代器,调用next()迭代器就会返回下一个值。入托迭代器没有值可以返回了,就会抛出异常。

    •iter()

    –__iter__()

    •next()

    –__next__()

    实例1:

    >>> string = "FishC"
    >>> it = iter(string)
    >>> next(it)
    'F'
    >>> next(it)
    'i'
    >>> next(it)
    's'
    >>> next(it)
    'h'
    >>> next(it)
    'C'
    >>> next(it)
    Traceback (most recent call last):
      File "<pyshell#8>", line 1, in <module>
        next(it)
    StopIteration

    一个容器如果是迭代器,那就必须实现__iter__()魔法方法,这个方法实际上就是返回迭代器本身。重点要实现的是__next__()魔法方法,因为它决定了迭代的规则。

    实例2:

    >>> class Fibs:
        def __init__(self):
            self.a = 0
            self.b = 1
        def __iter__(self):
            return self
        def __next__(self):
            self.a,self.b = self.b,self.a + self.b
            return self.a

        
    >>> fibs = Fibs()
    >>> for each in fibs:
        if each < 20:
            print(each)
        else:
            break

        
    1
    1
    2
    3
    5
    8
    13

    实例3:

     

    >>> class Fibs:
        def __init__(self,n =20):
            self.a = 0
            self.b = 1
            self.n = n
        def __iter__(self):
            return self
        
        def __next__(self):
            self.a,self.b = self.b,self.a + self.b
            if self.a > self.n:
                raise StopIteration
            return self.a

        
    >>> fibs = Fibs()
    >>> for each in fibs:
        print(each)

        
    1
    1
    2
    3
    5
    8
    13

     

    >>> fibs = Fibs(10)
    >>> for each in fibs:
        print(each)

        
    1
    1
    2
    3
    5
    8

     

    049 乱入:生成器

    所谓协同程序,就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。

    生成器可以暂时挂起函数,并保留函数的局部变量等数据,然后在再次调用它的时候,从上次暂停的位置继续执行下去。

    一个函数中如果有yield语句,则被定义为生成器。

    实例1:

    >>> def myGen():
        print("生成器被执行了!")
        yield 1   #暂停一次,相当于return,返回1
        yield 2     #暂停一次,相当于return,返回2

        
    >>> myG = myGen()
    >>> next(myG)
    生成器被执行了!
    1
    >>> next(myG)
    2

    像前面介绍的斐波那契的例子,也可以用生成器来实现:

    >>> def fibs():
        a = 0
        b = 1
        while True:
            a,b = b,a + b
            yield a

            
    >>> for each in fibs():
        if each > 100:
            break
        print(each)

        
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    89

    列表推导式表达:

    100以内,能被2整除,但不能被3整除的所有整数

    >>> a = [i for i in range(100) if not (i % 2) and (i % 3 )]
    >>> a
    [2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98]

    字典推导式:

    10以内是否为偶数

    >>> a = {i:i % 2 == 0 for i in range(10)}
    >>> a
    {0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}

    集合推导式:

    >>> a = {i for i in [1,2,3,3,4,5,5,5,6,7,7,8]}
    >>> a
    {1, 2, 3, 4, 5, 6, 7, 8}

    元组生成器推导式:

    >>> e = (i for i in range(5))
    >>> next(e)
    0
    >>> next(e)
    1
    >>> next(e)
    2

    050 模块:模块就是程序

    什么是模块

    容器 -> 数据封装

    函数 -> 语句封装

    -> 方法和属性的封装

    模块 -> 模块就是程序

    命名空间

    爱的宣言:世界上只有一个名字,使我这样牵肠挂肚,像有一根看不见的线,一头牢牢系在我心尖上,一头攥在你手中,这个名字就叫做鱼C工作室计算机一班的小花……

    导入模块

    第一种:import 模块名

    实例1:import导入模块

    实例2:import导入模块

    第二种:from 模块名 import 函数名(不推荐使用)

    第三种:import 模块名 as 名字(推荐使用)

    TemperatureConversion文件:

    def c2f(cal):
        return cal * 1.8 + 32
    def f2c(fah):
        return (fah - 32)/1.8

    calc文件:

    import TemperatureConversion as tc  #tc为取得新名字

    print("32摄氏度 = %.2f 华氏度\n" % tc.c2f(32))
    print("99华氏度 = %.2f 摄氏度" % tc.f2c(99))

    051 模块:__name__='__main__'、搜索路径和包

    模块!模块!

    实例1:为TemperatureConversion添加测试程序(TemperatureConversion被作为程序运行)

    def c2f(cal):
        return cal * 1.8 + 32

    def f2c(fah):
        return (fah - 32)/1.8

    def test():
        print("0摄氏度 = %.2f 华氏度\n" % c2f(0))
        print("0华氏度 = %.2f 摄氏度" % f2c(0))

    test()

    运行calc文

    当希望TemperatureConversion被调用时作为模块导入时

    def c2f(cal):
        return cal * 1.8 + 32

    def f2c(fah):
        return (fah - 32)/1.8

    def test():
        print("0摄氏度 = %.2f 华氏度" % c2f(0))
        print("0华氏度 = %.2f 摄氏度" % f2c(0))

    if __name__ == "__main__":#当此文件当做程序运行时,执行test(),否则不执行
        test()

    运行calc文件

    if __name__ == ‘__main__’

    搜索路径(系统会首先搜索的路径)

    >>> import sys
    >>> sys.path
    ['D:\\python3.3.2\\小甲鱼python\\python程序\\第五十节课\\Temperature', 'D:\\python3.3.2\\Lib\\idlelib', 'C:\\windows\\system32\\python33.zip', 'D:\\python3.3.2\\DLLs', 'D:\\python3.3.2\\lib', 'D:\\python3.3.2', 'D:\\python3.3.2\\lib\\site-packages']

    添加搜索路径:

    >>> import TemperatureConversion
    Traceback (most recent call last):
      File "<pyshell#0>", line 1, in <module>
        import TemperatureConversion
    ImportError: No module named 'TemperatureConversion'

    >>> import sys
    >>> sys.path.append("D:\\python3.3.2\WODE\Temperature")
    >>> sys.path
    ['', 'D:\\python3.3.2\\Lib\\idlelib', 'C:\\windows\\system32\\python33.zip', 'D:\\python3.3.2\\DLLs', 'D:\\python3.3.2\\lib', 'D:\\python3.3.2', 'D:\\python3.3.2\\lib\\site-packages', 'D:\\python3.3.2\\WODE\\Temperature']
    >>> import TemperatureConversion
    >>> TemperatureConversion.f2c(59)
    15.0

    package

    1.创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字;

    2.文件夹中创建一个__init__.py的模块文件,内容可以为空;

    3.相关的模块放入文件夹中

    052 模块:像个极客一样去思考

    使用print调用__doc__属性,可以带格式查看这个模块的简介

    使用dir()可以查询到该模块定义了哪些变量、函数和类

    053 论一只爬虫的自我修养

    Python如何访问互联网?

     

    URL的一般格式为(带方括号[]的为可选项)

    protocol :// hostname[:port] / path / [;parameters][?query]#fragment

    URL由三部分组成:

    第一部分是协议httphttpsftpfileed2k…

    第二部分是存放资源的服务器的域名系统或IP地址(有时候要包含端口号,各种传输协议都有默认的端口号,如http的默认端口为80)。

    第三部分是资源的具体地址,如目录文件名

    054 论一只爬虫的自我修养2:实战

    import urllib.request

    response = urllib.request.urlopen('http://placekitten.com/g/500/600')#  返回文件对象response
    cat_imag = response.read()

    with open('cat_500_600.jpg','wb') as f:
        f.write(cat_imag)

    >>> response.geturl()
    'http://placekitten.com/g/500/600'
    >>> response.info()
    <http.client.HTTPMessage object at 0x00000000034EAA20>
    >>> print(response.info())
    Date: Sat, 27 Jul 2019 02:44:18 GMT
    Content-Type: image/jpeg
    Transfer-Encoding: chunked
    Connection: close
    Set-Cookie: __cfduid=d3cd08233581619b9ef8464ae93f7d5ff1564195458; expires=Sun, 26-Jul-20 02:44:18 GMT; path=/; domain=.placekitten.com; HttpOnly
    Access-Control-Allow-Origin: *
    Cache-Control: public, max-age=86400
    Expires: Sun, 28 Jul 2019 02:44:18 GMT
    CF-Cache-Status: HIT
    Age: 66459
    Vary: Accept-Encoding
    Server: cloudflare
    CF-RAY: 4fcb454ecc35ce6b-LHR


    >>> response.getcode()
    200

    055 论一只爬虫的自我修养3:隐藏

    修改 headers

    通过Requestheaders参数修改

    通过Request.add_header()方法修改

    代理

    步骤:

    1. 参数是一个字典 {‘类型’:‘代理ip:端口号’}

    proxy_support = urllib.request.ProxyHandler({})

     

    2. 定制、创建一个 opener

    opener = urllib.request.build_opener(proxy_support)

     

    3a. 安装 opener

    urllib.request.install_opener(opener)

    3b. 调用 opener

    opener.open(url)

     

    064 GUI的终极选择:Tkinter

     

    >>> import tkinter   #Tkinter是python默认的GUI库,导入Tkinter模块
    >>> 

    实例1:

    import tkinter as tk

    root = tk.Tk()#创建一个主窗口,用于容纳整个GUI程序
    root.title("FishC Demo")#设置主窗口对象的标题栏

    #添加一个Label组件,可以显示文本、图标或者图片(此处显示文本)
    theLabel = tk.Label(root,text = "我的第二个窗口程序")
    theLabel.pack()#调用Label组件的pack方法,用于自动调节组件自身尺寸

    root.mainloop()#执行此语句后,窗口才会显示,程序进入主事件循环

    实例2:

    import tkinter as tk

    class App:#创建类App
        def __init__(self,root):#self为指向App类的指针
            #创建一个框架,然后在里面添加一个Button按钮组件,框架用来将复杂布局中按钮分组
            frame = tk.Frame(root)
            frame.pack(side = tk.RIGHT,padx = 10,pady = 10)#调节框架自身尺寸,此处设置为右对齐(右上角为原点),偏移(10,10)
            
            #创建一个按钮组件,fg(foreground),设置前景色
            #创建一个Button按钮,属性为self.hi_there,属于frame框架,按钮按下时调用self.say_hi方法
            #设置前景色为黑色,背景色为白色
            self.hi_there = tk.Button(frame,text = "打招呼",bg = "black",fg = "white",command = self.say_hi)
            self.hi_there.pack()#自动调节自身尺寸
            
            #say_hi()方法定义实现   
        def say_hi(self):
            print("互联网广大朋友们好,我是亦我飞也!")
            
            
    root = tk.Tk()#创建一个主窗口(toplever的根窗口),并把它作为参数实例化app对象,用于容纳整个GUI程序,
    app = App(root)#创建类App的一个实例对象app,传入参数为root

    app.mainloop()#执行此语句后,窗口才会显示,程序进入主事件循环
     

    065 GUI的终极选择:Tkinter2

    实例1:Label组件显示文字与gif图片

    #导入tkinter模块的所有内容
    from tkinter import *

    #创建主窗口
    root = Tk()
    #创建一个文本Label对象,文字为左对齐,离左边边框距离为10
    textLabel = Label(root,
                      text = "您下载的影片含有未成年人限制内容,\n请满18周岁后再点击观看!",
                      justify = LEFT,padx = 10)
    #Label组件为左对齐
    textLabel.pack(side = LEFT)

    #创建一个图像Label对象
    #用PhotoImage实例化一个图片对象(支持gif格式的图片)
    photo = PhotoImage(file = "18.gif")
    imgLabel = Label(root,image = photo)
    imgLabel.pack(side = RIGHT)

    mainloop()
     

    实例2:

    例2:文字显示在图片上

    #导入tkinter模块的所有内容
    from tkinter import *

    #创建主窗口
    root = Tk()

    #创建一个图像Label对象
    photo = PhotoImage(file = "bg.gif")
    #创建一个文本Label对象
    textLabel = Label(root,
                      text = "学Python\n到FishC!",
                      font = ("宋体",20),
                      fg = "white",
                      justify = LEFT,  #文字左对齐
                      image = photo,
                      compound = CENTER, #设置文本和图像的混合模式
                      )
    #文本Label对象偏移,离左窗口与上窗口都为10
    textLabel.pack(side = LEFT,padx =10,pady =10)

    mainloop()
     

    实例2:Button组件

    #导入tkinter模块的所有内容
    from tkinter import *

    def callback():
        var.set("吹吧你,我才不信呢~")

    #创建主窗口
    root = Tk()
    #设置主窗口对象的标题栏
    root.title("TK")

    frame1 = Frame(root)#框架1
    frame2 = Frame(root)#框架2

    #创建一个文本Label对象,文字为左对齐
    var = StringVar()
    var.set("您下载的影片含有未成年人限制内容,\n请满18周岁后再点击观看!")
    textLabel = Label(frame1,
                      textvariable = var, #Button显示一个StringVar的变量
                      justify = LEFT)
    #Label组件为左对齐
    textLabel.pack(side = LEFT)

    #创建一个图像Label对象
    #用PhotoImage实例化一个图片对象(支持gif格式的图片)
    photo = PhotoImage(file = "18.gif")
    imgLabel = Label(root,image = photo)
    imgLabel.pack(side = RIGHT)

    #加一个按钮
    theButton = Button(frame2,text = "已满18周岁",command = callback)
    theButton.pack()
    frame1.pack(padx = 10,pady = 10)
    frame2.pack(padx = 10,pady = 10)

    mainloop()

    066 GUI的终极选择:Tkinter3

    实例1:Checkbutton 组件

    from tkinter import *

    root = Tk()
    #需要一个Tkinter变量,用于表示该按钮是否被选中
    v = IntVar()
    c = Checkbutton(root,text="测试一下",variable = v)

    c.pack()
    #如果被选中,那么变量v被赋值为1,否则为0
    #可以用个Label标签动态地给大家展示:
    lable = Label(root,textvariable = v)
    lable.pack()

    mainloop()

    实例2:

    from tkinter import *

    root = Tk()

    GIRLS = ["貂蝉","王昭君","西施","杨玉环"]
    v = []
    for girl in GIRLS:
        v.append(girl)
        c = Checkbutton(root,text = girl,variable = v[-1])#-1表示每次取v列表中最后一个元素,即刚加入的那个元素
        c.pack(anchor = W)#W(western)向左对齐

    mainloop()

    实例3:Radiobutton 组件

    from tkinter import *

    root = Tk()

    v = IntVar()#如果被选中,v被赋值为1,否则为0
    Radiobutton(root,text = "One",variable = v,value = 1).pack(anchor = W)
    #value表示第一个按钮被选中时,v的值赋值给variable

    Radiobutton(root,text = "Two",variable = v,value = 2).pack(anchor = W)

    Radiobutton(root,text = "Three",variable = v,value = 3).pack(anchor = W)

    Radiobutton(root,text = "Four",variable = v,value = 4).pack(anchor = W)

    mainloop()

    实例4:循环处理

    from tkinter import *

    root = Tk()

    LANGS = [
        ("Python",1),
        ("Perl",2),
        ("Ruby",3),
        ("Lua",4)]
         

    v = IntVar()#如果被选中,v被赋值为1,否则为0
    v.set(1)#将1设置为默认值
    for lang,num in LANGS:
        b= Radiobutton(root,text = lang,variable = v,value = num)
        b.pack(anchor = W)
    #value表示第一个按钮被选中时,v的值赋值给variable

    mainloop()

    实例5:改成按钮形式

    from tkinter import *

    root = Tk()

    LANGS = [
        ("Python",1),
        ("Perl",2),
        ("Ruby",3),
        ("Lua",4)]
         

    v = IntVar()#如果被选中,v被赋值为1,否则为0
    v.set(1)#将1设置为默认值
    for lang,num in LANGS:
        b= Radiobutton(root,text = lang,variable = v,value = num,indicatoron = False)
        b.pack(fill = X)#表示横向填充
    #value表示第一个按钮被选中时,v的值赋值给variable

    mainloop()

    实例6:LabelFrame 组件

    from tkinter import *

    root = Tk()

    group = LabelFrame(root,text = "最好的脚本语言是?",padx = 10,pady = 10)#按钮相对边框的偏移
    group.pack(padx = 10,pady = 10)#框架相对边框的偏移

    LANGS = [
        ("Python",1),
        ("Perl",2),
        ("Ruby",3),
        ("Lua",4)]
         

    v = IntVar()#如果被选中,v被赋值为1,否则为0
    v.set(1)#将1设置为默认值
    for lang,num in LANGS:
        b= Radiobutton(group,text = lang,variable = v,value = num,indicatoron = False)
        b.pack(fill = X)
    #value表示第一个按钮被选中时,v的值赋值给variable

    mainloop()

    067 GUI的终极选择:Tkinter4

    实例1:

    from tkinter import *

    root = Tk()#创建主窗口
    e = Entry(root)#在主窗口中插入输入框
    e.pack(padx = 20,pady = 20)

    e.delete(0,END)#清空输入框
    e.insert(0,"默认文本...")#设置输入框内容

    mainloop()

    实例2:

    from tkinter import *

    def button1_show():
        print("作品:《%s》" % e1.get())#将e1.get()中得到的输入框1的内容格式化为字符串
        print("作者:%s" % e2.get())

    root = Tk()#创建主窗口

    Label(root,text = "作品:",padx = 20,pady = 10).grid(row=0,column=0)#第1行第1列,偏移是相对于当前操作组件的相邻x轴或y轴的偏移距离
    Label(root,text = "小甲鱼:").grid(row=1,column=0)#第1行第0列


    e1 = Entry(root)#在主窗口中插入输入框,文本框的内容通过e1调用
    e2 = Entry(root)#在主窗口中插入输入框
    e1.grid(row=0,column=1,padx=10)#x方向偏移是相对于"作品"的x方向偏移的;y方向偏移表示此输入框与y方向相邻物体或边框之间偏移的距离(y方向偏移)
    e2.grid(row=1,column=1,padx=10,pady=20)#x方向偏移是相对于"小甲鱼"的x方向偏移的;y方向偏移表示此输入框与y方向相邻上下物体或边框偏移的距离(y方向偏移)


    #加两个按钮
    Button1 = Button(root,text = "获取信息",command = button1_show)\
              .grid(row = 2,column = 0,sticky = W,padx = 10,pady=10)#加入反斜杠可实现分行编辑,方位设置为最西边(即靠左)
    Button2 = Button(root,text = "退出",command = root.quit).grid(row = 2,column = 1,sticky = E,padx=10)#方位设置为最东边(即靠右)

    #注:双击打开文件时退出才有效
    e1.delete(0,END)#清空输入框
    e1.insert(0,"零基础入门学习Python")#设置输入框内容

    e2.delete(1,END)#清空输入框
    e2.insert(1,"小甲鱼")#设置输入框内容

    mainloop()

    按下获取信息

    更改输入框数据,然后按下获取信息

    实例2:账号密码设置

    from tkinter import *

    def show():
        print("作品:《%s》" % e1.get())#将e1.get()中得到的输入框1的内容格式化为字符串
        print("作者:%s" % e2.get())
        e1.delete(0,END)#清空输入框1
        e2.delete(0,END)#清空输入框2

    root = Tk()#创建主窗口
    #Tkinter总共提供了三种布局组件的方法:pack()、grid()和place()
    #grid()方法允许你用表格的形式来管理组件的位置
    #row选项代表行,coulumn选项代表列
    #row = 1,column = 2表示第二行第三列(0表示第一行)

    Label(root,text = "账号:").grid(row=0)#第1行
    Label(root,text = "密码:").grid(row=1)#第2行
    v1 = StringVar()
    v2 = StringVar()

    e1 = Entry(root,textvariable = v1)#在主窗口中插入输入框,文本框的内容通过e1调用
    e2 = Entry(root,textvariable = v2,show="*")#在主窗口中插入输入框
    e1.grid(row=0,column=1,padx=10,pady=5)#x方向偏移是相对于"作品"的x方向偏移的;y方向偏移表示此输入框与y方向相邻物体或边框之间偏移的距离(y方向偏移)
    e2.grid(row=1,column=1,padx=10,pady=5)#x方向偏移是相对于"小甲鱼"的x方向偏移的;y方向偏移表示此输入框与y方向相邻上下物体或边框偏移的距离(y方向偏移)


    #可以使用sticky选项来设置组件的位置
    #使用N、E、S、W以及他们的组合NE、SE、SW、NW来表示方位

    #加两个按钮
    Button(root,text = "芝麻开门",command = show)\
              .grid(row = 2,column = 0,sticky = W,padx = 10,pady=5)#加入反斜杠可实现分行编辑,方位设置为最西边(即靠左)
    Button(root,text = "退出",command = root.quit).grid(row = 2,column = 1,sticky = E,padx=10)#方位设置为最东边(即靠右)

    mainloop()

    实例3:验证函数validatecommand

    from tkinter import *

    master = Tk()

    def test():
        if e1.get() == "小甲鱼":
            print("正确!")
            return True
        else:
            print("错误!")
            e1.delete(0, END)
            return False

    v = StringVar()

    #focusout表示Entry组件失去焦点的时候验证,调用validatecommand的test函数

    e1 = Entry(master, textvariable=v, validate="focusout", validatecommand=test)
    e2 = Entry(master)
    e1.pack(padx=10, pady=10)
    e2.pack(padx=10, pady=10)

    mainloop()
     

    实例4:invalidcommand函数

    from tkinter import *

    master = Tk()

    def test():
        if e1.get() == "小甲鱼":
            print("正确!")
            return True
        else:
            print("错误!")
            e1.delete(0, END)
            return False

    def test2():
        print("我被调用了...")

    v = StringVar()

    #focusout表示Entry组件失去焦点的时候验证,调用validatecommand的test函数
    #invalidcommand选项指定的函数只有在validatecommand的返回值为False的时候才被调用
    e1 = Entry(master, textvariable=v, validate="focusout", validatecommand=test,\
               invalidcommand=test2)
    e2 = Entry(master)
    e1.pack(padx=10, pady=10)
    e2.pack(padx=10, pady=10)

    mainloop()
     

    实例5:验证函数提供一些额外的选项

    validatecommand(f,s1,s2,...)

    其中,f是验证函数名,s1,s2,s3是额外的选项,这些选项会作为参数一次传给f函数。在此之前,需要调用register()方法将验证函数包装起来。

    from tkinter import *

    master = Tk()

    v = StringVar()

    def test(content, reason, name):
        if content == "小甲鱼":
            print("正确!")
            print(content, reason, name)
            return True
        else:
            print("错误!")
            print(content, reason, name)
            return False

    testCMD = master.register(test)
    e1 = Entry(master, textvariable=v, validate="focusout", \
               validat
               ecommand=(testCMD, '%P', '%v', '%W'))
    e2 = Entry(master)
    e1.pack(padx=10, pady=10)
    e2.pack(padx=10, pady=10)

    mainloop()
     

    实例6:设计一个 计算器

    from tkinter import *
    #计算函数
    def calc():
        result = int(v1.get())+int(v2.get())#强制转换为整型
        v3.set(result)#将result中的内容放到v3中

    #创建窗口
    root = Tk()
    #创建窗口中的一个frame框架
    frame = Frame(root)
    #设置框架位置并显示
    frame.pack(padx = 10,pady = 10)

    v1 = StringVar()
    v2 = StringVar()
    v3 = StringVar()

    #注意,这里不能使用e1.get()或者v1.get()来获取输入的内容,因为validate选项
    #指定为“key"的时候,有任何输入操作都会被拦截到这个函数中
    #也就是说先拦截,只有这个函数返回True,那么输入的内容才会到变量里去
    #所以要用%P来获取最新的输入框内容
    def test(content):
        if content.isdigit():
            return True
        else:
            return False

    #创建三个Entry组件
    testCMD = frame.register(test)
    #创建2个输入组件,输入的数据赋值给v1、v2
    e1 = Entry(frame, textvariable=v1,width=10, validate="key",\
               validatecommand=(testCMD, '%P'))
    e2 = Entry(frame, textvariable=v2,width=10, validate="key",\
               validatecommand=(testCMD, '%P'))
    #一个输出组件,设置为只读模式(readonly),v3的数据赋值给textvariable进行输出显示
    e3 = Entry(frame, textvariable=v3,width=10, validate="key",\
               validatecommand=(testCMD, '%P'),state="readonly")
    #位置设置
    e1.grid(row=0,column=0,padx=10,pady=10)
    e2.grid(row=0,column=2,padx=10)
    e3.grid(row=0,column=4,padx=10)

    #创建两个Label组件
    Label(frame,text="+").grid(row=0,column=1)
    Label(frame,text="=").grid(row=0,column=3)

    #创建一个按钮,宽度为10
    button=Button(frame,text="计算结果",width=10,command=calc)
    button.grid(row=1,column=2,pady=10)

    mainloop()

    068 GUI的终极选择:Tkinter5

    Listbox组件

    如果需要提供选项给用户选择,单选可以用Radiobutton组件,多选可以用Checkbutton,如果提供的选项非常多,可以考虑使用Listbox组件。Listbox是以列表的形式显示出来,并支持滚动条操作。

    实例1:

    from tkinter import *

    root = Tk()#创建主窗口

    theLB = Listbox(root,setgrid = True,selectmode=EXTENDED)#创建一个空列表
    theLB.pack()

    #往列表里添加数据
    for item in ["鸡蛋","鸭蛋","鹅蛋","李狗蛋"]:
        theLB.insert(END,item)#每次在列表最后插入一个数据

    #创建一个按钮,ACTIVE表示当前选中的数据
    theButton = Button(root,text="删除",command = lambda x = theLB:x.delete(ACTIVE))
    theButton.pack()

    #theLB.delete(0,END)删除所有列表数据

    mainloop()

    注:listbox.delete(0,END)可以删除列表中所有项目

    实例2:添加height选项

    from tkinter import *

    root = Tk()#创建主窗口

    #height=11表示可以显示11个项目
    theLB = Listbox(root,setgrid = True,\
                    selectmode=BROWSE,height=11)#创建一个空列表,选择模式为单选
    theLB.pack()

    #往列表里添加数据
    for item in range(11):
        theLB.insert(END,item)#每次在列表最后插入一个数据

    #创建一个按钮,ACTIVE表示当前选中的数据
    theButton = Button(root,text="删除",command = lambda x = theLB:x.delete(ACTIVE))
    theButton.pack()

    #theLB.delete(0,END)删除所有列表数据

    mainloop()

    Scrollbar组件

    实例1:

    from tkinter import *

    root = Tk()#创建主窗口

    sb = Scrollbar(root)
    sb.pack(side=RIGHT,fill=Y)

    lb = Listbox(root,yscrollcommand=sb.set)#创建一个空列表
    for i in range(1000):
        lb.insert(END,i)
    lb.pack(side=LEFT,fill=BOTH)

    sb.config(command = lb.yview)

    mainloop()

    事实上,这是一个互联互通的过程。当用户操作滚动条时,滚动条响应滚动并同时通过Listbox组件的yview()方法滚动列表框里的内容;同样,当列表框中可视范围发生改变的时候,Listbox组件通过调用Scrollbar组件的set()方法设置滚动条的最新位置。

    Scale组件

    Scale组件主要是通过滑块来表示某个范围内的一个数字,可以通过修改选项设置范围以及分辨率(精度)

    实例1:

    from tkinter import *

    root = Tk()#创建主窗口
    Scale(root,from_=0,to=42).pack()#创建铅锤方向滚动条
    Scale(root,from_=0,to=200,orient=HORIZONTAL).pack()#创建水平方向滚动条

    mainloop()

    实例2:打印当前位置

    from tkinter import *

    def show():
        print(s1.get(),s2.get())#使用get()方法获取当前滑块的位置

    root = Tk()#创建主窗口
    s1 = Scale(root,from_=0,to=42)#创建铅锤方向滚动条
    s1.pack()
    s2 = Scale(root,from_=0,to=200,orient=HORIZONTAL)#创建水平方向滚动条
    s2.pack()

    #创建一个按钮
    Button(root,text="获取位置",command=show).pack()

    mainloop()

    实例3:通过resolution选项控制分辨率(步长),通过tickinterval选项设置刻度

    from tkinter import *

    def show():
        print(s1.get(),s2.get())#使用get()方法获取当前滑块的位置

    root = Tk()#创建主窗口
    #tickinterval表示设置刻度,即每隔多少显示一个刻度
    #length表示滚动条的长度所占的像素数
    #resolution用来控制分辨率(步长)
    s1 = Scale(root,from_=0,to=42,tickinterval=5,length=200,\
               resolution=5,orient=VERTICAL)#创建铅锤方向滚动条
    s1.pack()
    s2 = Scale(root,from_=0,to=200,tickinterval=10,\
               length=600,orient=HORIZONTAL)#创建水平方向滚动条
    s2.pack()

    #创建一个按钮
    Button(root,text="获取位置",command=show).pack()

    mainloop()

    069 GUI的终极选择:Tkinter6

    Text组件

    Text(文本)组件用于显示和处理多种任务。虽然该组件的主要目的是显示多行文本,但它常常也被用于作为简单的文本编辑器和网页浏览器使用。

    实例1:插入内容

    from tkinter import *

    root = Tk()
    text = Text(root,width=30,height=2)
    text.pack()
    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love\n")#光标当前的位置插入

    #END,对应Text组件的文本缓存区最后一个字符的下一个位置
    text.insert(END,"FishC.com!")

    mainloop()

    实例2:插入image对象windows组件

    from tkinter import *

    def show():
        print("哟,我被点了一下~")

    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入

    #创建一个按钮
    b1=Button(root,text="点我点我",command=show)
    text.window_create(INSERT,window=b1)

    mainloop()
     

    实例3:单击按钮显示一张图片

    from tkinter import *

    def show():
        text.image_create(INSERT,image=photo)

    root = Tk()
    text = Text(root,width=30,height=50)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入

    photo = PhotoImage(file='fishc.gif')

    #创建一个按钮
    b1=Button(root,text="点我点我",command=show)
    text.window_create(INSERT,window=b1)

    mainloop()

    Indexer用法

    实例1:“line.column”

    from tkinter import *

    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    print(text.get(1.2,1.6))#获取第一行第2列到第一行第六列的数据

    mainloop()

    实例2:“line.end”

    行号加上字符串".end"格式表示为该行最后一个字符的位置

    实例:

    from tkinter import *

    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    print(text.get("1.2","1.end"))#获取第一行第2列到第一行第六列的数据

    mainloop()

    Mask用法

    mask(标记)通常是嵌入到Text组件文本中的不可见对象。事实上,Marks是指定字符间的位置,并跟随相应的字符一起移动。

    实例:Mark事实上就是索引,用于表示位置

    from tkinter import *

    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    text.mark_set("here","1.2")#设置光标位置为1.2
    text.insert("here","插")

    mainloop()

    实例2:如果Mark前面的内容发生改变,Mark的位置也会跟着移动

    from tkinter import *

    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    text.mark_set("here","1.2")#设置当前光标位置为1.2
    text.insert("here","插")#执行后当前光标位置(Mark位置)变成了1.3
    text.insert("here","入")
    #text.insert("1.3","入")

    mainloop()

    实例3:如果Mark周围的文本被删除了,Mark仍然存在

    from tkinter import *

    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    text.mark_set("here","1.2")#设置当前光标位置为1.2
    text.insert("here","插")#执行后当前光标位置变成了1.3
    text.delete("1.0",END)
    text.insert("here","入")#here表示当前Mark的位置,如果Mark左边并没有数据则会插入到最左边

    mainloop()

    例4:只有mark_unset()方法可以解除Mark的封印

    from tkinter import *

    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    text.mark_set("here","1.2")#设置当前光标位置为1.2
    text.insert("here","插")#执行后当前光标位置变成了1.3
    text.mark_unset("here")

    text.delete("1.0",END)
    text.insert("here","入")#here表示当前Mark的位置

    mainloop()

    默认插入内容是插入到Mark左侧(就是说插入一个字符后,Mark向后移动了一个字符的位置)

    实例5:插入内容到Mark的右侧

    from tkinter import *

    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    text.mark_set("here","1.2")#设置当前Mark位置为1.2
    text.mark_gravity("here",LEFT)

    text.insert("here","插")#执行后当前Mark位置变成了1.3
    text.insert("here","入")#here表示当前Mark的位置

    mainloop()

    070 GUI的终极选择:Tkinter7

    实例1:添加Tags

    from tkinter import *

    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    text.tag_add("tag1","1.7","1.12","1.14")#1.7(第一行第八列)到1.12,,与1.14设置Tag样式
    text.tag_config("tag1",background ="yellow",foreground="red")

    mainloop()

    实例2:Tags覆盖

    from tkinter import *

    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    text.tag_add("tag1","1.7","1.12","1.14")#1.7(第一行第八列)到1.12,,与1.14设置Tag样式
    text.tag_add("tag2","1.7","1.12","1.14")#1.7(第一行第八列)到1.12,,与1.14设置Tag样式

    text.tag_config("tag1",background ="yellow",foreground="red")
    text.tag_config("tag2",background ="blue")

    mainloop()
     

    实例2:降低Tag优先级

    from tkinter import *

    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    text.tag_add("tag1","1.7","1.12","1.14")#1.7(第一行第八列)到1.12,,与1.14设置Tag样式
    text.tag_add("tag2","1.7","1.12","1.14")#1.7(第一行第八列)到1.12,,与1.14设置Tag样式

    text.tag_config("tag1",background ="yellow",foreground="red")
    text.tag_config("tag2",background ="blue")

    text.tag_lower("tag2")#降低tag2的优先级

    mainloop()

    实例3:Tags事件绑定

    from tkinter import *
    import webbrowser#导入网页模块

    def show_hand_cursor(event):
        text.config(cursor="arrow")

    def show_arrow_cursor(event):
        text.config(cursor="xterm")

    def click(event):
        webbrowser.open("http://www.fishc.com")
        
    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    text.tag_add("link","1.7","1.16")#1.7(第一行第八列)到1.16
    #设置蓝色前景色并底部划线
    text.tag_config("link",foreground="blue",underline=True)

    #当进入绑定文本段时,鼠标样式切换为“arrow"形态
    text.tag_bind("link","<Enter>",show_hand_cursor)
    #当离开绑定文本段时,鼠标样式切换为“xterm"形态
    text.tag_bind("link","<Leave>",show_arrow_cursor)
    #当触发鼠标“左键单击”时,使用默认浏览器打开鱼C网址
    text.tag_bind("link","<Button-1>",click)

    mainloop()

    实例4:判断内容是否发生改变

    from tkinter import *
    import hashlib

    def getSig(contents):
        m = hashlib.md5(contents.encode())
        return m.digest()

    def check():#检查
        contents = text.get(1.0,END)
        if sig!=getSig(contents):
            print("警报,内容发生变动")
        else:
            print("风平浪静")
        
    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入
    #注意,行号从1开始,列号则从0开始
    #获取文本内容
    contents=text.get(1.0,END)

    sig = getSig(contents)

    Button(root,text="检查",command=check).pack()

    mainloop()

    实例5:查找操作(使用search()方法可以搜索Text组件中的内容)

    from tkinter import *
    import hashlib

    #将任何格式的索引号统一为元组(行,列)的格式输出
    def getIndex(text,index):
        #split这里以"."拆分字符串,将1.3拆分为字符1和3,然后通过map将字符转换为整型
        return tuple(map(int,str.split(text.index(index),".")))
        
    root = Tk()
    text = Text(root,width=30,height=5)
    text.pack()

    #INSERT索引表示插入光标当前的位置
    text.insert(INSERT,"I love FishC.com!")#光标当前的位置插入

    #将任何格式的索引号统一为元组(行、列)的格式输出
    start = 1.0
    while True:
        pos = text.search("o",start,stopindex=END)#从开始到结束全文搜索
        if not pos:
            break
        print("找到了,位置是:",getIndex(text,pos))
        start = pos + "+1c"#将start指向找到的字符位置的下一个字符,以便进行下一次搜索

    mainloop()

    Text组件内部有一个栈专门用于记录内容的每次变动,所以每次“撤销”操作就是一次弹栈操作,“恢复”就是再次压栈。

    实例6:撤销

    from tkinter import *

    #将任何格式的索引号统一为元组(行,列)的格式输出
    def show():
        text.edit_undo()
        
    root = Tk()
    text = Text(root,width=30,height=5,undo=True)
    text.pack()
    text.insert(INSERT,"I love FishC")

    Button(root,text="撤销",command=show).pack()

    mainloop()


    实例7:每次撤销一个字符

    from tkinter import *

    def callback(event):
        text.edit_separator()

    def show():
        text.edit_undo()#执行撤回操作
        
    root = Tk()

    #autoseparators表示一次完整的操作结束后自动插入“分隔符”,此处设置为False
    text = Text(root,width=30,height=5,autoseparators=False,undo=True,maxundo=10)
    text.pack()

    text.insert(INSERT,"I love FishC!")
    text.bind('<Key>',callback)#每次有输入就插入一个“分隔符”

    Button(root,text="撤销",command=show).pack()

    mainloop()

    071 GUI的终极选择:Tkinter8

    Canvas(画布)组件

    一个可以让你随心所欲绘制界面的组件。通常用于显示和编辑图形,可以用它来绘制直线、图形、多边形,甚至是绘制其他组件。

    实例1:

    from tkinter import *
    root = Tk()
    #创建canvas对象框,设置其宽度、高度与背景色
    w = Canvas(root,width=200,height=100,background="black")
    w.pack()

    #画一条黄色的线
    w.create_line(0,50,200,50,fill="yellow")
    #画一条红色的竖线(虚线)
    w.create_line(100,0,100,100,fill="red")
    #中间画一个蓝色的矩形
    w.create_rectangle(50,25,150,75,fill="blue")

    mainloop()

    实例2:

    from tkinter import *
    root = Tk()
    #创建canvas对象框,设置其宽度、高度与背景色
    w = Canvas(root,width=200,height=100,background="black")
    w.pack()

    #画一条黄色的线(参数为其x、y轴坐标)
    line1 = w.create_line(0,50,200,50,fill="yellow")
    #画一条红色的竖线(虚线)
    line2 = w.create_line(100,0,100,100,fill="red")
    #中间画一个蓝色的矩形
    rect1 = w.create_rectangle(50,25,150,75,fill="blue")

    w.coords(line1,0,25,200,25)#将line1移动到新的坐标
    w.itemconfig(rect1,fill="red")#重新设置矩形的填充色为红色
    w.delete(line2)#删除线2

    #创建一个按钮,按下时删除所有图形
    Button(root,text="删除全部",command=(lambda x=ALL:w.delete(x))).pack()

    mainloop()

    实例3:在Canvas上显示文本

    from tkinter import *
    root = Tk()
    #创建canvas对象框,设置其宽度、高度与背景色
    w = Canvas(root,width=200,height=100,background="black")
    w.pack()

    #画一条绿色的斜线(参数为其x、y轴坐标),宽度为三个像素点
    line1 = w.create_line(0,0,200,100,fill="green",width=3)
    #画一条绿色的斜线
    line2 = w.create_line(200,0,0,100,fill="green",width=3)
    #中间画两个矩形
    rect1 = w.create_rectangle(40,20,160,80,fill="blue")
    rect2 = w.create_rectangle(60,30,140,70,fill="yellow")
    #在矩形正中(默认)显示文本,坐标为文本正中坐标
    w.create_text(100,50,text="Hadley")

    #创建一个按钮,按下时删除所有图形
    Button(root,text="删除全部",command=(lambda x=ALL:w.delete(x))).pack()

    mainloop()

    实例4:绘制椭圆

    from tkinter import *
    root = Tk()
    #创建canvas对象框,设置其宽度、高度与背景色
    w = Canvas(root,width=200,height=100,background="white")
    w.pack()

    #绘制一个虚线的矩形
    w.create_rectangle(40,20,160,80,dash=(4,4))
    #绘制椭圆,粉色填充
    w.create_oval(40,20,160,80,fill="pink")
    #在矩形正中(默认)显示文本,坐标为文本正中坐标
    w.create_text(100,50,text="Hadley")

    mainloop()
    实例5:绘制圆形

    from tkinter import *
    root = Tk()
    #创建canvas对象框,设置其宽度、高度与背景色
    w = Canvas(root,width=200,height=100,background="white")
    w.pack()

    #绘制一个虚线的矩形
    w.create_rectangle(40,20,160,80,dash=(4,4))
    #绘制圆形,粉色填充
    #w.create_oval(40,20,160,80,fill="pink")
    w.create_oval(70,20,130,80,fill="pink")
    #在矩形正中(默认)显示文本,坐标为文本正中坐标
    w.create_text(100,50,text="Hadley")

    mainloop()

    实例6:绘制多边形

    from tkinter import *
    import math as m

    root = Tk()
    w=Canvas(root,width=200,height=150,background="red")
    w.pack()
    center_x = 100
    center_y = 80
    r = 70
    points = [
        #左上角A
        center_x - int(r*m.sin(2*m.pi/5)),
        center_y - int(r*m.cos(2*m.pi/5)),
        #右上角C
        center_x + int(r*m.sin(2*m.pi/5)),
        center_y - int(r*m.cos(2*m.pi/5)),
        #左下角E
        center_x - int(r*m.sin(m.pi/5)),
        center_y + int(r*m.cos(m.pi/5)),
        #顶点D
        center_x,
        center_y - r,
        #右下角B
        center_x + int(r*m.sin(m.pi/5)),
        center_y + int(r*m.cos(m.pi/5)),
        ]
    #创建多边形方法,会自动按ACEDBA的形式连线,如果构成闭环,则会自动填充
    w.create_polygon(points,outline="green",fill="yellow")

    w.create_text(100,80,text="Hadley")

    mainloop()

    实例7:

    from tkinter import *

    root = Tk()
    w=Canvas(root,width=400,height=200,background="white")
    w.pack()

    def paint(event):#画小圆
        x1,y1 = (event.x - 1),(event.y -1)
        x2,y2 = (event.x + 1),(event.y +1)
        w.create_oval(x1,y1,x2,y2,fill="red")

    w.bind("<B1 - Motion>",paint)#画布与鼠标进行绑定
    Label(root,text="按住鼠标左键并移动,开始绘制你的理想蓝图吧。。。").pack(side=BOTTOM)

    mainloop()

    073 GUI的终极选择:Tkinter10

    Munu组件

    Tkinter提供了一个Menu组件,用于实现顶级菜单、下拉菜单和弹出菜单。

    实例1:创建一个顶级菜单(或称窗口主菜单

    from tkinter import *

    def callback():
        print("被调用了")
        
    root = Tk()


    menubar = Menu(root)#创建一个顶级菜单
    menubar.add_command(label="Hello",command=callback)#创建一个顶级菜单对象
    menubar.add_command(label="Quit",command=root.quit)

    #显示菜单
    root.config(menu=menubar)

    mainloop()

    实例2:创建添加到主菜单上的下拉菜单

    from tkinter import *

    def callback():
        print("被调用了")
        
    root = Tk()

    #创建一个顶级菜单
    menubar = Menu(root)

    #创建下拉菜单filemenu包含内容
    filemenu=Menu(menubar,tearoff=False)#创建一个从属于menubar的子菜单(下拉菜单)filemenu
    filemenu.add_command(label="打开",command=callback)#创建一个下拉菜单对象
    filemenu.add_command(label="保存",command=callback)
    filemenu.add_separator()#插入分隔线
    filemenu.add_command(label="退出",command=root.quit)
    #创建一个顶级菜单对象“文件”,filemenu从属于这个对象(或称将filemenu添加到顶级菜单“文件”中)
    menubar.add_cascade(label="文件",menu=filemenu)

    #创建另一个下拉菜单editmenu包含内容
    editmenu=Menu(menubar,tearoff=False)#创建一个从属于menubar的子菜单(下拉菜单)editmenu
    editmenu.add_command(label="剪切",command=callback)
    editmenu.add_command(label="拷贝",command=callback)
    editmenu.add_separator()#插入分隔线
    editmenu.add_command(label="粘贴",command=callback)
    #创建一个顶级菜单对象“编辑”,editmenu从属于这个对象(或称将editmenu添加到顶级菜单“编辑”中)
    menubar.add_cascade(label="编辑",menu=editmenu)

    #显示菜单
    root.config(menu=menubar)

    mainloop()

    实例3:创建一个弹出菜单方法

    from tkinter import *

    def callback():
        print("被调用了")
        
    root = Tk()

    def popup(event):
        menu.post(event.x_root,event.y_root)#在此时鼠标位置弹出显示窗口
        
    #创建一个顶级菜单menu
    menu = Menu(root,tearoff=False)

    #创建顶级菜单menu包含内容
    menu.add_command(label="撤销",command=callback)#创建一个顶级菜单对象
    menu.add_command(label="重做",command=callback)
    #创建一个框架
    frame = Frame(root,width=100,height=100)
    frame.pack()

    #将鼠标右键与popup方法绑定
    frame.bind("<Button-3>",popup)

    #显示菜单
    #root.config(menu=menu)

    mainloop()

    实例4:菜单弹出

    from tkinter import *

    def callback():
        print("被调用了")
        
    root = Tk()

    def popup(event):
        menu.post(event.x_root,event.y_root)#在此时鼠标位置弹出显示窗口
        
    #创建一个顶级菜单menu
    menu = Menu(root,tearoff=True)

    #创建顶级菜单menu包含内容
    menu.add_command(label="撤销",command=callback)#创建一个顶级菜单对象
    menu.add_command(label="重做",command=callback)
    #创建一个框架
    frame = Frame(root,width=500,height=500)
    frame.pack()

    #将鼠标右键与popup方法绑定
    frame.bind("<Button-3>",popup)

    #显示菜单
    #root.config(menu=menu)

    mainloop()

    实例5:添加单选组件radiobutton和多选按钮checkbutton

    from tkinter import *

    def callback():
        print("被调用了")
        
    root = Tk()

    #创建一个顶级菜单
    menubar = Menu(root)
    #创建checkbutton关联变量
    openVar = IntVar()
    saveVar = IntVar()
    exitVar = IntVar()
    #创建下拉菜单filemenu包含内容
    filemenu=Menu(menubar,tearoff=True)#创建一个从属于menubar的子菜单(下拉菜单)filemenu
    filemenu.add_checkbutton(label="打开",command=callback,variable=openVar)#创建一个下拉菜单对象
    filemenu.add_checkbutton(label="保存",command=callback,variable=saveVar)
    filemenu.add_separator()#插入分隔线
    filemenu.add_checkbutton(label="退出",command=root.quit,variable=exitVar)
    #创建一个顶级菜单对象“文件”,filemenu从属于这个对象(或称将filemenu添加到顶级菜单“文件”中)
    menubar.add_cascade(label="文件",menu=filemenu)

    #创建radiobutton关联变量
    editVar = IntVar()
    editVar.set(1)

    #创建另一个下拉菜单editmenu包含内容
    editmenu=Menu(menubar,tearoff=True)#创建一个从属于menubar的子菜单(下拉菜单)editmenu
    editmenu.add_radiobutton(label="剪切",command=callback,variable=editVar,value=1)
    editmenu.add_radiobutton(label="拷贝",command=callback,variable=editVar,value=2)
    editmenu.add_separator()#插入分隔线
    editmenu.add_radiobutton(label="粘贴",command=callback,variable=editVar,value=3)
    #创建一个顶级菜单对象“编辑”,editmenu从属于这个对象(或称将editmenu添加到顶级菜单“编辑”中)
    menubar.add_cascade(label="编辑",menu=editmenu)

    #显示菜单
    root.config(menu=menubar)

    mainloop()

    Menubutton组件(希望菜单按钮出现在其它位置时)

    Menubutton组件是一个与Menu组件相关联的按钮,它可以放在窗口中的任意位置,并且在被按下时弹出下拉菜单

    实例1:

    from tkinter import *

    def callback():
        print("被调用了")
        
    root = Tk()

    #创建一个顶级菜单Menubutton按钮,设置为浮起显示(RAISED)
    mb = Menubutton(root,text="点我",relief=RAISED)

    mb.pack(side=RIGHT)#设置为右中显示

    #创建下拉菜单filemenu包含内容
    filemenu = Menu(mb,tearoff=False)#创建一个从属于mb的下拉菜单filemenu
    filemenu.add_checkbutton(label="打开",command=callback,selectcolor="yellow")
    filemenu.add_command(label="保存",command=callback)#创建一个下拉菜单对象"保存“
    filemenu.add_separator()
    filemenu.add_command(label="退出",command=root.quit)
    #显示菜单
    mb.config(menu=filemenu)

    mainloop()

    OptionMenu(选项菜单)组件

    选项菜单的发明弥补了Listbox组件无法实现下拉列表框的遗憾

    实例1:

    from tkinter import *

    def callback():
        print("被调用了")
        
    root = Tk()

    variable = StringVar()#创建字符串变量variable
    variable.set("one")#初始值设置为"one"
    w = OptionMenu(root,variable,"one","two","three")
    w.pack()

    mainloop()

    实例2:多个选项添加到选项菜单中

    from tkinter import *

    def callback():
        print("被调用了")
        
    root = Tk()

    OPTIONS = [
        "Hadley",
        "小土豆",
        "yiwofeiye",
        "RAN"
        ]

    variable = StringVar()#创建字符串变量variable
    variable.set(OPTIONS[0])#初始值设置为"one"
    w = OptionMenu(root,variable,*OPTIONS)
    w.pack()

    def callback():
        print(variable.get())

    Button(root,text="点我",command=callback).pack()

    mainloop()
     

    074  GUI的终极选择:Tkinter11

    事件绑定

    对于每个组件来说,可以通过bind()方法将函数或方法绑定到具体的事件上。当被触发的事件满足该组件绑定的事件时,Tkinter就会带着事件描述去调用handler()方法

    实例1:捕获单击鼠标位置

    from tkinter import*

    root = Tk()

    def callback(event):
        print("点击位置:",event.x,event.y)

    frame = Frame(root,width=200,height=200)
    #Button表示鼠标点击事件
    #1代表左键 2代表中间滚轮点击 3代表右键
    frame.bind("<Button-1>",callback)#按键按下时,调用callback方法
    frame.pack()

    mainloop()

    实例2:捕获键盘事件

    #捕获单击鼠标的位置
    from tkinter import*

    root = Tk()

    def callback(event):
        print("敲击位置:",repr(event.char))#打印当前按下按键的字符
        print(event.char)

    frame = Frame(root,width=200,height=200)
    #Key为键盘事件
    frame.bind("<Key>",callback)#按键按下时,调用callback方法
    frame.focus_set()#获得焦点
    frame.pack()

    mainloop()

    实例3:捕获鼠标在组件上的运动轨迹

    #当鼠标在组件内移动的整个过程均触发该事件

    from tkinter import*

    root = Tk()

    def callback(event):
        print("当前位置:",event.x,event.y)#打印当前按下按键的字符

    frame = Frame(root,width=200,height=200)
    frame.bind("<Motion>",callback)#按键按下时,调用callback方法
    frame.pack()

    mainloop()

    事件序列

    Tkinter使用一种称为事件序列的机制来允许用户定义事件,用户需要使用bind()方法将具体的事件序列与自定义的方法绑定

    Event对象(按键名keysym和按键码keycode)

    实例1:打印当前按下按键的按键名

    from tkinter import*

    root = Tk()

    def callback(event):
        print(event.keysym)#打印当前按下按键的按键名
        print(event.char)

    frame = Frame(root,width=200,height=200)
    #Key为键盘事件
    frame.bind("<Key>",callback)#按键按下时,调用callback方法
    frame.focus_set()#获得焦点
    frame.pack()

    mainloop()

    075 GUI的终极选择:Tkinter12

    Message组件

    Message(消息)组件是Label组件的变体,用于显示多行文本信息。Message组件能够自动换行,并调整文本的尺寸使其适应给定得尺寸。

    实例1:

    from tkinter import *

    root = Tk()
    w1 = Message(root,text="这是一则消息",width=100)
    w1.pack()
    w2 = Message(root,text="这是一条骇人听闻的长消息!",width=100)
    w2.pack()

    mainloop()

    Spinbox组件

    Entry组件的变体,用于从一些固定的值中选取一个。使用Spinbox组件,可以通过返回或者元组指定允许用户输入的内容。

    实例1:

    from tkinter import *

    root = Tk()

    #w = Spinbox(root,from_=0,to=10)#指定输入值为0-10
    w = Spinbox(root,value=("Hadley","小土豆","雅馨"))#指定输入
    w.pack()

    mainloop()

    PanedWindow组件

    与Frame类似,都是为组件提供一个框架,但其还允许让用户调整应用程序的空间划分

    实例1:两窗格

    from tkinter import *

    root = Tk()

    m = PanedWindow(orient = VERTICAL)#设置为上下分布
    m.pack(fill=BOTH,expand=1)#设置为框架覆盖全局

    top = Label(m,text="top pane")#顶窗格
    m.add(top)

    bottom = Label(m,text="bottom pane")#底窗格
    m.add(bottom)

    mainloop()

    实例2:三窗格

    from tkinter import *

    root = Tk()

    m1 = PanedWindow()#默认为左右分布
    m1.pack(fill=BOTH,expand=1)
    left = Label(m1,text="left pane")#左窗格
    m1.add(left)

    m2 = PanedWindow(orient=VERTICAL)
    m1.add(m2)
    top=Label(m2,text="top pane")#顶窗格
    m2.add(top)
    bottom = Label(m2,text="bottom pane")#底窗格
    m2.add(bottom)

    mainloop()

    实例3:显示“分割线”

    from tkinter import *

    root = Tk()

    #showhandle=True表示显示“手柄”
    #sashrelief=SUNKEN表示分隔线的样式设置为向下凹
    m1 = PanedWindow(showhandle=True,sashrelief=SUNKEN)
    m1.pack(fill=BOTH,expand=1)
    left = Label(m1,text="left pane")
    m1.add(left)

    m2 = PanedWindow(orient=VERTICAL,showhandle=True,sashrelief=SUNKEN)
    m1.add(m2)
    top=Label(m2,text="top pane")
    m2.add(top)
    bottom = Label(m2,text="bottom pane")
    m2.add(bottom)

    mainloop()

    Toplevel组件

    Topleve(顶级窗口)l组件类似于Frame组件,但其是一个独立的顶级窗口,通常拥有标题栏、边框等部件。通常用在显示额外的窗口、对话框和其他弹出窗口中。

    实例1:按钮按下创建一个顶级窗口

    from tkinter import *

    def create():
        top = Toplevel()#创建一个独立的顶级窗口
        top.title("FishC Demo")
        msg = Message(top,text="I love FishC.com")
        msg.pack()
        
    root = Tk()
    Button(root,text="创建顶级窗口",command=create).pack()

    mainloop()

    实例2:Toplevel的窗口设置为50%透明

    from tkinter import *

    def create():
        top = Toplevel()
        top.title("FishC Demo")
        top.attributes("-alpha",0.5)#设置为50%透明度
        msg = Message(top,text="I love FishC.com")
        msg.pack()
        
    root = Tk()
    Button(root,text="创建顶级窗口",command=create).pack()

    mainloop()

    076 GUI的终极选择:Tkinter13

    布局管理器

    布局管理器就是管理你的那些组件如何排列的家伙。Tkinter有三个布局管理器,分别是pack、grid和place

    pack:按添加顺序排列组件

    grid:按行/列形式排列组件

    place:允许程序员指定组件的大小和位置

    pack

    实例1:生成一个Listbox组件并将它填充到root窗口

    from tkinter import *

    root = Tk()
    listbox = Listbox(root)
    #fill选项是告诉窗口管理器该组件将怎样填充整个分配给它的空间
    #BOTH表示同时横向和纵向扩展;X表示横向;Y表示纵向
    #expand选项是告诉窗口管理器是否将父组件的额外空间也填满(任意拉伸窗口依旧会填满)

    #默认情况下pack是将添加的组件依次纵向排列
    listbox.pack(fill=BOTH,expand=True)
    for i in range(10):
        listbox.insert(END,str(i))

    mainloop()

    实例2:纵向排列,横向填充

    from tkinter import *

    root = Tk()
    #fill选项是告诉窗口管理器该组件将怎样填充整个分配给它的空间
    #BOTH表示同时横向和纵向扩展;X表示横向;Y表示纵向
    #expand选项是告诉窗口管理器是否将父组件的额外空间也填满

    #默认情况下pack的side属性是将添加的组件依次纵向排列
    Label(root, text="red", bg="red", fg="white").pack(fill=X)
    Label(root, text="green", bg="green", fg="black").pack(fill=X)
    Label(root, text="blue", bg="blue", fg="white").pack(fill=X)

    mainloop()

    实例3:横向排列,纵向填充

    from tkinter import *

    root = Tk()
    #fill选项是告诉窗口管理器该组件将怎样填充整个分配给它的空间
    #BOTH表示同时横向和纵向扩展;X表示横向;Y表示纵向
    #expand选项是告诉窗口管理器是否将父组件的额外空间也填满

    #将pack设置为横向排列
    Label(root, text="red", bg="red", fg="white").pack(side=LEFT)
    Label(root, text="green", bg="green", fg="black").pack(side=LEFT)
    Label(root, text="blue", bg="blue", fg="white").pack(side=LEFT)

    mainloop()

    grid

    使用一个grid就可以简单地实现你用很多个框架和pack搭建起来的效果。使用grid排列组件,只需告诉它你想要将组件放置的位置(行row/列column)。

    实例1:

    from tkinter import *

    root = Tk()

    #column默认值是0
    #默认情况下组件会居中显示在对应的网格里
    #Label(root,text="用户名").grid(row=0)
    #Label(root,text="密码").grid(row=1)
    #设置sticky=W使Label左对齐
    Label(root,text="用户名").grid(row=0,sticky=W)#左对齐
    Label(root,text="密码").grid(row=1,sticky=W)

    Entry(root).grid(row=0,column=1)
    Entry(root,show="*").grid(row=1,column=1)

    mainloop()

    实例2:设置rowspan与columnspan实现跨行和跨列功能

    from tkinter import *

    root = Tk()

    #column默认值是0
    #默认情况下组件会居中显示在对应的网格里
    #Label(root,text="用户名").grid(row=0)
    #Label(root,text="密码").grid(row=1)
    #设置sticky=W使Label左对齐
    #创建Label文本
    Label(root,text="用户名").grid(row=0,sticky=W)
    Label(root,text="密码").grid(row=1,sticky=W)
    #创建输入
    Entry(root).grid(row=0,column=1)
    Entry(root,show="*").grid(row=1,column=1)
    #插入Label图像
    photo = PhotoImage(file="logo.gif")
    #rowspan=2跨两行,边距5
    Label(root,image=photo).grid(row=0,column=2,rowspan=2,padx=5,pady=5)
    #columnspan=3跨三列(默认为居中显示),边距5
    Button(text="提交",width=10).grid(row=2,columnspan=3,pady=5)

    mainloop()

    place

    通常情况下不建议使用place布局管理器

    实例1:将子组件显示在父组件的正中间

    from tkinter import *

    def callback():
        print("正中靶心")
    root = Tk()
    #relx和rely指定的是子组件相对于父组件的位置,范围是(00`1.0),0.5则表示一半,正中间
    #anchor=CENTER表示正中显示
    Button(root,text="点我",command=callback).place(relx=0.5,rely=0.5,anchor=CENTER)

    mainloop()

    实例2:Button组件覆盖Label组件

    from tkinter import *

    def callback():
        print("正中靶心")
    root = Tk()

    photo = PhotoImage(file="logo_big.gif")
    Label(root,image=photo).pack()
    #relx和rely指定的是子组件相对于父组件的位置,范围是(00`1.0),0.5则表示一半,正中间
    Button(root,text="点我",command=callback).place(relx=0.5,rely=0.5,anchor=CENTER)

    mainloop()

    实例3:

    from tkinter import *

    root = Tk()

    #relx和rely指定的是子组件相对于父组件的位置,范围是(00`1.0),0.5则表示一半,正中间
    #relwidth和relheight选项指定相对父组件的尺寸
    Label(root,bg="red").place(relx=0.5,rely=0.5,relheight=0.75,relwidth=0.75,anchor=CENTER)
    Label(root,bg="yellow").place(relx=0.5,rely=0.5,relheight=0.5,relwidth=0.5,anchor=CENTER)
    Label(root,bg="green").place(relx=0.5,rely=0.5,relheight=0.25,relwidth=0.25,anchor=CENTER)

    mainloop()

    077 GUI的终极选择:Tkinter14

    Tkinter提供了三种标准对话框模块,分别是:messagebox、filedialog、colorchooser

    messagebox(消息对话框)

    实例1:askokcancel函数

    from tkinter import *

    print(messagebox.askokcancel("FishC Demo","发射核弹?"))

    mainloop()

    实例2:askquestion函数

    实例3:asiretrycancel函数

    实例4:askyesno函数

    实例5:showerror函数

    from tkinter import *

    #print(messagebox.askokcancel("FishC Demo","发射核弹?"))
    #print(messagebox.askquestion("FishC Demo","买个U盘?"))
    #print(messagebox.askretrycancel("FishC Demo","启动失败,重启?"))
    #print(messagebox.askyesno("FishC Demo","你确定要格式化硬盘吗?"))
    print(messagebox.showerror("FishC Demo","Error!!!"))

    mainloop()

    实例6:showinfo函数

    from tkinter import *

    #options参数可设置为default、icon与parent
    #print(messagebox.askokcancel("FishC Demo","发射核弹?"))
    #print(messagebox.askquestion("FishC Demo","买个U盘?"))
    #print(messagebox.askretrycancel("FishC Demo","启动失败,重启?"))
    #print(messagebox.askyesno("FishC Demo","你确定要格式化硬盘吗?"))
    #print(messagebox.showerror("FishC Demo","Error!!!"))
    messagebox.showinfo("Hadley","Great!!!",icon="info")

    mainloop()

    实例7:showwarning函数

    from tkinter import *

    #options参数可设置为default、icon与parent
    #print(messagebox.askokcancel("FishC Demo","发射核弹?"))
    #print(messagebox.askquestion("FishC Demo","买个U盘?"))
    #print(messagebox.askretrycancel("FishC Demo","启动失败,重启?"))
    #print(messagebox.askyesno("FishC Demo","你确定要格式化硬盘吗?"))
    #print(messagebox.showerror("FishC Demo","Error!!!"))
    #messagebox.showinfo("Hadley","Great!!!",icon="info")
    messagebox.showwarning("Hadley","Warning!!!",icon="warning")

    mainloop()

    filedialog(文本对话框)

    当应用程序需要使用打开文件或保存文件的功能时

    实例1:

    from tkinter import *

    root = Tk()

    def callback():
        #askopenfilename函数用来打开文件
        #asksaveasfilename函数用来保存文件
        fileName = filedialog.askopenfilename()
        print(fileName)

    Button(root,text="打开文件夹",command=callback).pack()

    mainloop()

    实例2:限制打开文件类型

    from tkinter import *

    root = Tk()

    def callback():
        #askopenfilename函数用来打开文件
        #asksaveasfilename函数用来保存文件
        #fileName = filedialog.askopenfilename()
        #限制打开文件类型
        fileName = filedialog.askopenfilename(filetypes=[("PNG",".png"),("GIF",".gif")])
        print(fileName)

    Button(root,text="打开文件夹",command=callback).pack()

    mainloop()

    colorchooser(颜色选择对话框)

    颜色对话框提供一个让用户选择颜色的界面

    实例1:

    from tkinter import *

    root = Tk()

    def callback():
        #colorchooser函数用于打开颜色选择对话框
        fileName = colorchooser.askcolor()
        print(fileName)

    Button(root,text="打开文件夹",command=callback).pack()

    mainloop()

    对应的RGB值及其对应的16进制值

    078 Pygame:初次见面,请大家多多关照

     

    展开全文
  • 一般训练陷入停滞主要是两方面的原因: 陷入误差曲面凹陷点。 神经网络的激活函数是S函数,这个函数的两端是平坦的,算法在这里面走的很慢。 事实上只要是随机搜索的算法,都会出现这种情况,只是...

    就是误差曲面局部凹陷点。学过函数曲线的极小值和最小值的概念吧,局部最佳和全局最佳是类似的关系。

    一般训练陷入停滞主要是两方面的原因:

    1. 陷入误差曲面凹陷点。

    2. 神经网络的激活函数是S函数,这个函数的两端是平坦的,算法在这里面走的很慢。

    事实上只要是随机搜索的算法,都会出现这种情况,只是可能性的大小不同罢了。可以使用全局寻优能力强的先行搜索,再用局部搜索能力强的算法继续搜索。

    展开全文
  • 前端面试题

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

    前端面试题汇总

    一、HTML和CSS 21

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

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

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

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

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

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

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

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

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

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

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

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

    123

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

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

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

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

      解决:加入_display:inline
    

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

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


      鲜为人知的是:

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

        元素的每个

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

        元素的每个

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

        元素的每个

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

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

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

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

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

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

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

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

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

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

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

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

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

    var domList = document.getElementsByTagName(‘input’)
    

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

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

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


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

    var a;
    

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

    var a = null;
    

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

    var undefined;
    

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

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

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

    var a = new Object();
    

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

    function combo(msg){
    

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

    var d = new Date();
    

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

    function escapeHtml(str) {
    

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

    var foo = 1;
    

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

    var foo = 1;
    

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

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

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

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

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

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

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

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

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

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

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

    if (!String.prototype.trim) { 
    

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

    var result=[];
    

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

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

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

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


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

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

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

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

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

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

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

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

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

    var a = 6; 
    

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

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


           hello
        

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    }  
    

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

    }  
    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    答案:Infinity24

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

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

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

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

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

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

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

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

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

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

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

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

    元素的每个

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

    元素的每个

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

    元素的每个

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

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

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

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

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

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

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

      元素的每个

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

      元素的每个

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

      元素的每个

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

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

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

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

    元素中。
    顺序表包含在

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

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

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

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

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

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

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

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

    4. 发送HTTP请求

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        {1}{2}

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

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

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

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

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

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

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

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

      万次阅读 多人点赞 2019-06-27 08:54:39
      什么是“引用”?申明和使用“引用”要注意哪些问题? 答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当...

      C++面试题汇总 (一)

      一,基础题

      1. new、delete、malloc、free关系
        delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

      2. delete与 delete []区别
        delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。在More Effective C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”delete与new配套,delete []与new []配套

      MemTest *mTest1=new MemTest[10];

      MemTest *mTest2=new MemTest;

      Int *pInt1=new int [10];

      Int *pInt2=new int;

      delete[]pInt1; //-1-

      delete[]pInt2; //-2-

      delete[]mTest1;//-3-

      delete[]mTest2;//-4-

      在-4-处报错。

      这就说明:对于内建简单数据类型,delete和delete[]功能是相同的。对于自定义的复杂数据类型,delete和delete[]不能互用。delete[]删除一个数组,delete删除一个指针。简单来说,用new分配的内存用delete删除;用new[]分配的内存用delete[]删除。delete[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。

      1. C++有哪些性质(面向对象特点)
        封装,继承和多态。

      2. 子类析构时要调用父类的析构函数吗?
        析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了。定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。

      3. 多态,虚函数,纯虚函数
        多态:是对于不同对象接收相同消息时产生不同的动作。C++的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;

      在程序编译时多态性体现在函数和运算符的重载上;

      虚函数:在基类中冠以关键字 virtual 的成员函数。 它提供了一种接口界面。允许在派生类中对基类的虚函数重新定义。

      纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用。

      从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。

      抽象类中不仅包括纯虚函数,也可包括虚函数。抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。

      1. 求下面函数的返回值(微软)
        int func(x)

      {

      int countx = 0;

      while(x)

      {

      countx ++;

      x = x&(x-1);

      }

      return countx;

      }

      假定x = 9999。 答案:8

      思路:将x转化为2进制,看含有的1的个数。

      1. 什么是“引用”?申明和使用“引用”要注意哪些问题?
        答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。

      2. 将“引用”作为函数参数有哪些特点?
        (1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。

      (2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

      (3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

      1. 在什么时候需要使用“常引用”? 
        如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;

      例1

      int a ;

      const int &ra=a;

      ra=1; //错误

      a=1; //正确

      例2

      string foo( );

      void bar(string & s);

      那么下面的表达式将是非法的:

      bar(foo( ));

      bar(“hello world”);

      原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。引用型参数应该在能被定义为const的情况下,尽量定义为const 。

      1. 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?

      格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }

      好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!

      注意事项:

      (1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。

      (2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。

      (3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。

      (4)流操作符重载返回值申明为“引用”的作用:

      流操作符<<和>>,这两个操作符常常希望被连续使用,例如:cout << “hello” << endl; 因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。因此,返回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。

      赋值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。

      #include<iostream.h>

      int &put(int n);

      int vals[10];

      int error=-1;

      void main()

      {

      put(0)=10; //以put(0)函数值作为左值,等价于vals[0]=10;

      put(9)=20; //以put(9)函数值作为左值,等价于vals[9]=20;

      cout<<vals[0];

      cout<<vals[9];

      }

      int &put(int n)

      {

      if (n>=0 && n<=9 ) return vals[n];

      else { cout<<“subscript error”; return error; }

      }

      (5)在另外的一些操作符中,却千万不能返回引用:±*/ 四则运算符。它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则,2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。

      1. 结构与联合有和区别?

      (1). 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。

      (2). 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。

      1. 试写出程序结果:
        int a=4;

      int &f(int x)

      { a=a+x;

        return  a;
      

      }

      int main(void)

      { int t=5;

       cout<<f(t)<<endl;  a = 9
      
      f(t)=20;             a = 20
      
      cout<<f(t)<<endl;     t = 5,a = 20  a = 25
      
       t=f(t);                a = 30 t = 30
      
      cout<<f(t)<<endl;  }    t = 60
      

      }

      1. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?
        常考的题目。从定义上来说:

      重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

      重写:是指子类重新定义父类虚函数的方法。

      从实现原理上来说:

      重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!

      重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。

      1. 有哪几种情况只能用intialization list 而不能用assignment?
        答案:当类中含有const、reference 成员变量;基类的构造函数都需要初始化表。

      2. C++是不是类型安全的?
        答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。

      3. main 函数执行以前,还会执行什么代码?
        答案:全局对象的构造函数会在main 函数之前执行。

      4. 描述内存分配方式以及它们的区别?
        1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。

      2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。

      3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

      1. 分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。
        答案:

      BOOL : if ( !a ) or if(a)

      int : if ( a == 0)

      float : const EXPRESSION EXP = 0.000001

      if ( a < EXP && a >-EXP)

      pointer : if ( a != NULL) or if(a == NULL)

      1. 请说出const与#define 相比,有何优点?
        答案:

      const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

      1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

      2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

      1. 简述数组与指针的区别?
        数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。

      (1)修改内容上的差别

      char a[] = “hello”;

      a[0] = ‘X’;

      char *p = “world”; // 注意p 指向常量字符串

      p[0] = ‘X’; // 编译器不能发现该错误,运行时错误

      (2) 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof§,p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

      char a[] = “hello world”;

      char *p = a;

      cout<< sizeof(a) << endl; // 12 字节

      cout<< sizeof§ << endl; // 4 字节

      计算数组和指针的内存容量

      void Func(char a[100])

      {

      cout<< sizeof(a) << endl; // 4 字节而不是100 字节

      }

      1. 题: int (*s[10])(int) 表示的是什么?
        int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。

      2. 题:栈内存与文字常量区

           char str1[] = "abc";
        

      char str2[] = “abc”;

      const char str3[] = “abc”;
        const char str4[] = “abc”;

      const char *str5 = “abc”;
        const char *str6 = “abc”;

      char *str7 = “abc”;
        char *str8 = “abc”;

      cout << ( str1 == str2 ) << endl;//0 分别指向各自的栈内存
        cout << ( str3 == str4 ) << endl;//0 分别指向各自的栈内存
        cout << ( str5 == str6 ) << endl;//1指向文字常量区地址相同

      cout << ( str7 == str8 ) << endl;//1指向文字常量区地址相同

      结果是:0 0 1 1

      解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。

      1. 题:将程序跳转到指定内存地址
        要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234;那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?

      ((void ()( ))0x100000 ) ( );
        首先要将0x100000强制转换成函数指针,即:
        (void ()())0x100000
        然后再调用它:
        ((void ()())0x100000)();
        用typedef可以看得更直观些:
        typedef void(
      )() voidFuncPtr;
        *((voidFuncPtr)0x100000)();

      1. 题:int id[sizeof(unsigned long)];这个对吗?为什么?

      答案:正确 这个 sizeof是编译时运算符,编译时就确定了 ,可以看成和机器有关的常量。

      1. 题:引用与指针有什么区别?

      【参考答案】

      1. 引用必须被初始化,指针不必。

      2. 引用初始化以后不能被改变,指针可以改变所指的对象。

      3. 不存在指向空值的引用,但是存在指向空值的指针。

      1. 题:const 与 #define 的比较 ,const有什么优点?

      【参考答案】

      (1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。

      (2) 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。

      1. 题:复杂声明

      void * ( * (*fp1)(int))[10];

      float (( fp2)(int,int,int))(int);

      int (* ( * fp3)())10;

      分别表示什么意思?
      【标准答案】

      1.void * ( * (fp1)(int))[10]; fp1是一个指针,指向一个函数,这个函数的参数为int型,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个void型指针。

      2.float (( fp2)(int,int,int))(int); fp2是一个指针,指向一个函数,这个函数的参数为3个int型,函数的返回值是一个指针,这个指针指向一个函数,这个函数的参数为int型,函数的返回值是float型。

      3.int (* ( * fp3)())10; fp3是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是int型。

      1. 题:内存的分配方式有几种?
        【参考答案】

      一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。

      二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

      三、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

      1. 题:基类的析构函数不是虚函数,会带来什么问题?
        【参考答案】派生类的析构函数用不上,会造成资源的泄漏。

      2. 题:全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
        【参考答案】

      生命周期不同:

      全局变量随主程序创建和创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;

      使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用;分配在栈区。

      操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面 。

      二,算法题

      1. 实现strcpy.
       char* MyStrCpy( char *pDest, const char *pSrc )    
      {    
          if( nullptr == pDest || nullptr == pSrc )    
          {    
             return nullptr;    
          }    
          if( pDest == pSrc )    
           {    
              return pDest;    
           }    
           char *pIter = pDest;    
          while( ( *pIter++=*pSrc++ ) !='\0' );    
           return pDest;    
       }    
      
      1. 实现strcat
       char* MyStrCat( char *pDest, const char *pSrc )    
      {    
           if( nullptr == pDest || nullptr == pSrc )    
           {    
               return nullptr;    
           }    
        
          char *pIter = pDest + strlen( pDest );    
           while( ( *pIter++=*pSrc++ ) != '\0' );    
          return pDest;    
       }    
      
      1. 实现CString字符串类缺省四个方法
      class MyCString    
       {    
       public:    
         
           MyCString( char *pData = nullptr )    
          {    
              if( nullptr == pData )    
              {    
                   mpData = new char[ 1 ];    
                   assert( nullptr != mpData );    
                   *mpData = '\0';    
               }    
              else    
              {    
                  mpData = new char[ strlen( pData ) + 1 ];    
                   assert( nullptr != mpData );    
                   strcpy( mpData, pData );    
              }    
           }    
         
           MyCString( const MyCString &Other )    
           {    
               mpData = new char[ strlen( Other.mpData ) + 1 ];    
               assert( nullptr != mpData );    
               strcpy( mpData, Other.mpData );    
           }    
        
           ~MyCString()    
          {    
               if( nullptr != mpData )    
               {    
                  delete [] mpData;    
                   mpData = nullptr;    
               }    
           }    
         
           const MyCString& operator =( const MyCString &Other )    
           {    
               if( this == &Other )    
               {    
                  return *this;    
               }    
               delete [] mpData;    
               mpData = new char[ strlen( Other.mpData ) + 1 ];    
              assert( nullptr != mpData );    
              strcpy( mpData, Other.mpData );    
               return *this;    
           }    
         
       private:    
         
          char *mpData;    
       };    
      
      1. 不使用第三个变量交换两个数的值
      void SwapA( int &A, int &B )    
      {    
           if( A == B )    
           {    
              return;    
           }    
           A = A + B;    
           B = A - B;    
           A = A - B;    
       }    
       void SwapB( unsigned int &A, unsigned int &B )    
      {    
          if( A == B )    
           {    
               return;    
           }  
           A = A ^ B;    
          B = A ^ B;    
           A = A ^ B;    
       }    
      
      1. C语言中字符串转数字的方法是什么( atoi ),请实现它
       int Myatoi( const char *pString )    
      {    
          assert( nullptr != pString );    
          const int Len = strlen( pString );    
           int Value = 0;    
          int Times = 1;    
          for( int i = Len -1; i >= 0; --i, Times *= 10 )    
           {    
               Value += ( pString[ i ] - '0' ) * Times;    
           }    
           return Value;    
      }    
      
      1. 实现一个将字符串逆序的方法
      char* MyInverted( char *pDest )    
      {    
           assert( nullptr != pDest );    
           const int Len = strlen( pDest );    
           char T = 0;    
           for( int i = 0; i < Len / 2; ++i )    
           {    
               T = pDest[ i ];    
              pDest[ i ] = pDest[ Len - i - 1 ];    
               pDest[ Len - i -1 ] = T;    
           }    
           return pDest;    
       }    
      
      1. 实现一个将字符串中所有字母转换为大写的方法
      char* MyUpper( char *pDest )    
      {    
           assert( nullptr != pDest );    
           for( char *i = pDest; *i != '\0'; ++i )    
           {    
               if( *i < 'a' || *i > 'z' )    
               {    
                   continue;    
              }    
               *i -= 'a' - 'A';    
           }    
           return pDest;    
       }    
      
      1. 已知一个数组已经降序排序请用二分查字法找到其中的某个元素找到返回索引否则返回-1
      int BinarySearch( int *pArray, int Count, int Value )    
        {    
           assert( nullptr != pArray );    
           int Left = 0;    
           int Right = Count -1;    
            int Mid = 0;    
            while( Left <= Right )    
            {    
              Mid = ( Left + Right ) / 2;    
               if( Value < pArray[ Mid ] )    
              {    
                  Right = Mid - 1;    
              }          
                 else if( Value > pArray[ Mid ] )    
              {    
                  Left = Mid + 1;    
               }    
               else    
               {    
                   return Mid;    
               }    
          }    
           return -1;    
       }    
         
       struct Node    
       {    
           Node *mpNext;    
           int mData;    
       };  
      
      1. 删除链表中值为Value的所有元素( [Head]->[node1]->[node2]->…[noden] )
      void DeleteFromList( Node *pHead, int Value )  
      {  
          Node *pPrev = pHead;  
           Node *pNext = pHead->mpNext;  
          while( nullptr != pNext )  
          {  
              if( pNext->mData != Value )  
              {  
                  pPrev = pNext;  
                 pNext = pNext->mpNext;  
               }  
              else  
              {  
                 pPrev->mpNext = pNext->mpNext;  
                   delete pNext;  
                  pNext = pPrev->mpNext;  
               }  
          }  
       }    
      
      1. 在链表Index位置插入新的值为Value的元素
       void InsertFromList( Node *pHead, int Index, int Value )    
      {  
           Node *pIter = pHead;  
           for( int i = 0; i < Index && nullptr != pIter; ++i, pIter = pIter->mpNext );  
          assert( nullptr != pIter );  
          Node *pNew = new Node;  
          pNew->mData = Value;  
          pNew->mpNext = pIter->mpNext;  
           pIter->mpNext = pNew;  
       }    
      
      1. 将链表逆序
       Node* InvertedFromList( Node *pHead )    
       {    
           //A->B->C  
           Node *pPrev = pHead;            //A  
           Node *pNext = pHead->mpNext;        //B  
           Node *pNextNext = nullptr;        //C  
          while( nullptr != pNext )    
           {  
               pNextNext = pNext->mpNext;    //C = B->C  
              pNext->mpNext = pPrev;        //B->A  
         
              pPrev = pNext;                //A = B  
               pNext = pNextNext;            //B = C  
           }  
           pHead->mpNext = nullptr;//C->B->A->null  
           return pPrev;            //return C( new head )  
       }    
      
      1. 判断X年X月X日是这年的第几天
      int GetDay( int Year, int Month, int Day )  
       {    
          int MonthDays[ 13 ] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };    
        
          if( ( Year % 4 == 0 && Year % 100 != 0 ) || ( Year % 400 == 0 ) )    
           {    
               ++MonthDays[ 2 ];    
           }    
        
          int Days = 0;    
          for( int i = 1; i < Month; ++i )    
           {    
              Days += MonthDays[ i ];    
           }    
           Days += Day;    
        
          return Days;    
      }  
      
      1. 求斐波拉契数列第N项
      int GetFibonacci1( int N )  
       {  
           if( 1 == N || 2 == N )  
           {  
               return 1;  
           }  
           if( 3 == N )  
           {  
               return 2;  
           }  
           int A = 2;  
          int B = 3;  
           int C = 5;  
           for( int i = 0; i < N - 4; ++i )  
           {  
              C = A + B;  
              A = B;  
               B = C;  
           }  
           return C;  
       }  
      
      1. 递归求斐波拉契数列数列第N项
      int GetFibonacci2( int N )  
       {  
          if( 1 == N || 2 == N )  
           {  
               return 1;  
           }  
           return GetFibonacci2( N - 1 ) + GetFibonacci2( N - 2 );  
       }  
      
      1. 实现一个产生[N-M]区间数字的随机方法
      int GetRandomRange( int N, int M )  
      {  
           if( N == M )  
           {  
               return N;  
           }  
           if( N > M )  
           {  
               N = N + M;  
               M = N - M;  
               N = N - M;  
           }  
           return N + ( rand() % ( M - N + 1 ) );  
       }  
      
      1. 实现一个产生[0~1]之间的随机浮点数
      double GetRandomRange()  
      {  
           return rand() / static_cast< double >( RAND_MAX );  
       }  
      
      1. 实现一个打印出1-1000之间的所有素数的方法
      void PrintfPrime()  
       {  
          //1不是素数  
           //2是最小非奇数素数  
          //直接从3开始  
          printf( "2\n" );  
          bool b = false;  
         for( int i = 3; i <= 1000; ++i )  
           {  
               b = true;  
              for( int j = 2; j <= i / 2; ++j )  
              {  
                  if( i % j == 0 )  
                  {  
                       b = false;  
                      break;  
                  }  
              }  
              if( b )  
               {  
                   printf( "%d\n", i );  
               }  
           }  
       }  
      
      1. 已知Z = X + Y 其中 Z, X, Y 均为无符号int型 定义一个宏判断Z是否已经越界 2 3 #define IS_OVER_FLOW( Z, X, Y ) ( Z < ( ( X ) < ( Y ) ? ( Y ) : ( X ) ) )
      3 #define IS_OVER_FLOW( Z, X, Y ) ( Z < ( ( X ) < ( Y ) ? ( Y ) : ( X ) ) )  
      
      1. 请用栈实现队列
      int QueuePop( std::stack< int > &StackA )  
      {  
           std::stack< int > StackB;  
           while( false == StackA.empty() )  
           {  
              StackB.push( StackA.top() );  
               StackA.pop();  
          }  
        
           const int top = StackB.top();  
          StackB.pop();  
        
           while( false == StackB.empty() )  
          {  
              StackA.push( StackB.top() );  
               StackB.pop();  
           }  
          return top;  
       }  
      
      1. 已知X班X成绩0-100分编写一个方法实现0-59打印不合格,60-69打印合格,70-79打印良好,80-100打印优秀
        2 //不能使用if,:?,switch
      void PrintScore( int Score )  
      {  
           assert( Score >= 0 && Score <= 100 );  
           const char *pString[] =  
           {   
               "不合格",  
               "不合格",  
               "不合格",  
               "不合格",  
              "不合格",  
              "不合格",  
               "合格",  
              "良好",  
               "优秀",  
               "优秀",  
               "优秀",  
          };  
          printf( "%s\n", pString[ Score / 10 ] );  
      }  
      
      1. 实现strncpy
      char *Mystrncpy( char *pDest, const char *pSrc, int Count )  
      {  
           assert( NULL != pDest && NULL != pSrc );  
           if( pDest == pSrc )  
          {  
              return pDest;  
          }  
          if( Count <= 0 )  
           {  
               return pDest;  
           }  
          char *pStart = pDest;  
           while( ( Count-- ) > 0 && ( *pStart++=*pSrc++ ) );  
           *pStart = '\0';  
           return pDest;  
       }   
      
      1. C语言中数字转字符串的方法是什么?(itoa)请实现他
      char* Myitoa( char *pDest, int val, int radix )  
       {  
           assert( NULL != pDest );  
           assert( radix > 1 );  
           const bool IsMinu = val < 0;  
           char buffer[ 16 ] = {};  
          int count = 0;  
        
          do  
          {  
               buffer[ count++ ] = abs(val) % radix;  
              val /= radix;  
           }  
           while( val );  
         
         
          if( IsMinu )  
          {  
              pDest[ 0 ] = '-';  
              for( int i = 0; i < count; ++i )  
               {  
                   pDest[ i + 1 ] = '0' + buffer[ count - i - 1 ];  
               }  
              pDest[ count + 1 ] = '\0';  
           }  
           else  
           {  
              for( int i = 0; i < count; ++i )  
               {  
                  pDest[ i ] = '0' + buffer[ count - i - 1 ];  
              }  
              pDest[ count ] = '\0';  
           }  
           return pDest;  
       }  
      
      1. 如何判断链表是否有环
      bool IsLoop( Node *pHead )  
      {  
          //[H->A->B->C->A]  
           assert( NULL != pHead );  
           Node *pNext = pHead->mpNext;  
           Node *pNextNext = pHead->mpNext;  
           while( NULL != pNext && NULL != pNextNext->mpNext )  
            {  
               pNext = pNext->mpNext;//[ B、C、A ]  
               pNextNext = pNextNext->mpNext->mpNext;//[C、B、A]  
               if( pNext == pNextNext )  
               {  
                   return true;  
               }  
           }  
           return false;  
      }  
      
      1. 统计出一个字符串每种字母出现的次数要求时间复杂度为O(n)
      void CountLetter( const char *pSrc )  
       {  
           int count[ 256 ] = {};  
          for( ; *pSrc !='\0'; ++pSrc )  
          {  
              const char &c = *pSrc;  
              if( ( c < 'A' || c > 'z') && ( c < 'a' || c > 'z' ) )  
             {  
                   continue;  
               }  
              ++count[ c ];  
          }  
       }   
      
      1. 选择排序的思想是什么?( 每次找到最大或最小的值放在数组的低位上 )请实现它
      void SelectSort( int *pArray, int count )  
      {  
          for( int i = 0; i < count; ++i )  
          {  
              //默认低位元素最小  
              int MinValue = pArray[ i ];  
            //默认保存低位元素的索引  
               int MinIndex = i;  
               //除开第一个元素找是否还有比它还小的元素( 升序 )  
              for( int j = i + 1; j < count; ++j )  
              {  
                   //发现找到比它还小的元素重新赋值和保存索引  
                  if( pArray[ j ] < MinValue )  
                 {  
                      MinValue = pArray[ j ];  
                      MinIndex = j;  
                  }  
               }  
              //将找到最小元素放在数组低位上面  
              const int Temp = pArray[ i ];  
              pArray[ i ] = MinValue;  
              pArray[ MinIndex ] = Temp;  
          }  
       }  
      
      1. 冒泡排序的思想是什么?(升序排序中越小的数往低位走,越大的数往高位走,每次与相邻元素比较导致的特点)请实现它
      void BubbleSort( int *pArray, int count )  
       {  
           //eg.[6][8][8][0][9][1]  
          //i = 0,j < 5    [6][8][0][8][1][9]  
           //i = 1,j < 4    [6][0][8][1][8][9]  
           //i = 2,j < 3    [0][6][1][8][8][9]  
           //i = 3,j < 2    [0][1][6][8][8][9]  
         
           //到此为止已经排序OK了  
          //i = 4,j < 1    [0][1][6][8][8][9]  
           //i = 5,j < 0    [0][1][6][8][8][9]  
           for( int i = 0; i < count; ++i )  
           {  
               for( int j = 0; j < count - i - 1; ++j )  
               {  
                   if( pArray[ j ] > pArray[ j + 1 ] )  
                   {  
                       const int Temp = pArray[ j ];  
                       pArray[ j ] = pArray[ j + 1 ];  
                       pArray[ j + 1 ] = Temp;  
                   }  
               }  
           }  
       }  
      
      1. 已知两个数组有序实现一个方法将他们合并后任然有序
      void MergeSort( int *pMerge, int *p1, int p1len, int *p2, int p2len )  
       {  
          assert( nullptr != pMerge && nullptr != p1 && nullptr != p2 );               
      
           int i = 0;  
           int j = 0;  
           int k = 0;  
           while( i < p1len && j < p2len )  
           {  
               if( p1[ i ] < p2[ j ] )  
               {  
                   pMerge[ k ] = p1[ i ];  
                  ++k;  
                  ++i;  
               }  
               else  
               {  
                  pMerge[ k ] = p2[ j ];  
                  ++k;  
                  ++j;  
              }  
           }  
           while( i < p1len )  
          {  
               pMerge[ k ] = p1[ i ];  
              ++k;  
               ++i;  
           }  
           while( j < p2len )  
           {  
              pMerge[ k ] = p2[ j ];  
              ++k;  
              ++j;  
           }  
       }  
      
      1. 实现一个算法找到数组中第二大的数
      int FindSec( int *p, int len )  
        {  
          assert( nullptr != p );  
           int maxv = p[ 0 ];  
           int secv = p[ 0 ];  
          for( int i = 1; i < len; ++i )  
           {  
              if( maxv < p[ i ] )  
              {  
                   secv = maxv;  
                   maxv = p[ i ];  
               }  
           }  
           return secv;  
       }  
      
      
      
      
      
      
      
      
      
      展开全文
    22. 测试开发需要学习的知识结构

      万次阅读 多人点赞 2018-04-12 10:40:58
      努力成为一个优秀的测试开发从业者,加油!... - 假装在测试的回答 - 知乎白盒与黑盒测试什么区分1、黑盒测试 黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检...
    23. 13.ajax的步骤 什么是ajax? ajax(异步javascript xml) 能够刷新局部网页数据而不是重新加载整个网页。 如何使用ajax? 第一步,创建xmlhttprequest对象,var xmlhttp =new XMLHttpRequest();XMLHttpRequest对象用来...
    24. 什么是梯度消失呢?有基础的人应该知道,卷积神经网络在进行BP时,都是通过梯度来计算权重修改量的。而梯度的计算遵循的是链式法则,即一个参数的梯度是多个梯度相乘之后的结果。假如每个梯度都小于1的话,那么,x1 ...
    25. 粒子群算法及其改进算法

      万次阅读 多人点赞 2019-07-01 19:27:08
      标准粒子群算法及其改进算法 ...大概的意思就是一片森林里有一群鸟在找一块食物,它们不知道食物具体在哪,但是可以通过感官(例如嗅觉)去察觉到自己当前位置距离食物的远近。鸟可以记住自己走过的位置...
    26. 时间局部性和空间局部

      千次阅读 2020-08-10 15:03:21
      在CPU访问寄存器时,无论是存取数据抑或存取指令,都趋于...产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。 ----被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。 2. 空间局部性: 一旦
    27. 局部搜索

      千次阅读 2019-06-08 00:10:10
      局部搜索 局部搜索是一种用于解决计算上难以优化的问题(NP Problem)的启发式方法. 局部搜索从当前结点出发,通常只移动到他的邻近状态,不保留路径,根据目标函数寻找最优的状态。局部搜索的优点有: 只用很少...
    28. C#基础教程-c#实例教程,适合初学者

      万次阅读 多人点赞 2016-08-22 11:13:24
      C#基础教程-c#实例教程,适合初学者。 第一章 C#语言基础 本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。...
    29. 如:int* 是一个指针变量类型指针变量和普通变量没有什么区别,指针32位四字节,里面保存的是一个内存空间的地址,就像一个整形变量int a, a就可以代表一个整数,一个指针变量int* p,p就可以代表一个地址数据,而*...
    30. 实在知乎上看的答案,感觉很好,就转载一下,原文地址: 为什么全局变量无须初始化,局部变量必须初始化? https://www.zhihu.com/question/30516949Intopass回答一:首先 Java 语言就是这么规定的。然后为什么 ...
    31. 局部图像处理

      千次阅读 2017-11-23 20:29:54
      局部特征(1)——入门篇  局部特征 (local features),是近来研究的一大热点。大家都了解全局特征(global features),就是方差、颜色直方图等等。如果用户对整个图像的整体感兴趣,而不是前景本身感兴趣的话,...
    32. 分析一个细节:C语言中,定义局部变量时如果未初始化,则值是随机的,为什么? 定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是...
    33. 汇编

      千次阅读 2016-12-24 15:42:33
      如图中所示,EAX、EBX、ECX和EDX的前两个高位字节和后两个低位字节可以独立使用,其中两位低字节又被独立分为H和L部分,这样做的原因主要是考虑兼容16位的程序,具体兼容匹配细节请查阅相关文献。 内存布局 ...
    34. 粒子群算法(三)局部版本

      千次阅读 2015-11-24 16:44:12
      在全局的标准粒子群算法中,每个粒子速度的更新是根据两个因素变化的。这两个因素是: ...其余保持跟全局的标准粒子群算法一样,这个算法就变为局部的粒子群算法。 一般一个粒子i的邻域随着迭代次数的增加而逐渐
    35. 局部特征

      万次阅读 2012-12-24 16:18:14
      局部特征(1)——入门篇  局部特征 (local features),是近来研究的一大热点。大家都了解全局特征(global features),就是方差、颜色直方图等等。如果用户对整个图像的整体感兴趣,而不是前景本身感兴趣的话...
    36. var与let区别-详解块级作用域与局部作用域

      千次阅读 多人点赞 2020-06-10 19:27:49
      1.1-js三种作用域介绍 ...局部作用域(Local Scope) : 函数里面声明的变量,称之为局部变量。 只能在函数里面被访问 局部变量生命周期 : 从函数开始执行 -> 到函数执行结束 1.2 ES6 在ES
    37. 全局变量与局部变量两者的本质区别就是在于作用域 用通俗的话来理解的话, 全局变量是在整个py文件中声明,全局范围内都可以访问 局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方...
    38. 学习总结:局部搜索

      万次阅读 2016-04-20 11:51:50
      学习总结:局部搜索 通常考察一个算法的性能通常用局部搜索能力和全局收敛能力这两个指标。局部搜索是指能够无穷接近最优解的能力,而全局收敛能力是指找到全局最优解所在大致位置的能力。局部搜索能力...
    39. 局部性原理的一点点理解

      千次阅读 2017-02-14 21:40:24
      书本概念: 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储...程序循环、堆栈等是产生时间局部性的原因。 空间局部性(Spatial Locality):在最近的将来将用到的信息很可能与现在正在使
    40. verilog 综合注意事项

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

      千次阅读 2017-06-22 11:39:47
      fork是什么意思_fork在线翻译 。 2. 在计算机中,Fork一词的使用 2.1 Git/GitHub仓库克隆 Git/GitHub 用户下面的图 来表达 Fork:分叉、克隆 出一个(仓库的)新拷贝。 &lt;img src="...
    42. C/C++ typedef用法详解(真的很详细)

      万次阅读 多人点赞 2018-06-04 13:51:52
      很少有程序员理解它是什么意思,更不用说这种费解的代码所带来的出错风险了。显然,这里使用 typedef 不是一种特权,而是一种必需。持怀疑态度的人可能会问:“OK,有人还会写这样的代码吗?”,快速浏览一下揭示  ...
    43. 什么定义在方法中的内部类可以访问方法中的局部变量? 1 当被访问的局部变量是编译时可确定的字面常量时 我们首先看这样一段代码, 本文的以下部分会以这样的代码进行讲解。  [java]  view plain   copy public...
    44. 详解局部加权回归

      万次阅读 多人点赞 2013-11-17 19:28:29
      这个权值也就是改方法为什么叫做“加权“,同时从后面的解释,你会发现它也是能够说明为了该方法又包含”局部“的原因。 这个权值怎么定义?又有什么用呢? 显然,在线性回归中,给定某个值,预测其对应的输出...
    45. C#使用了未赋值的局部变量

      千次阅读 2019-10-12 14:16:24
      错误 1 使用了未赋值的局部变量
    46. 【JAVA面试】java面试题整理(3)

      千次阅读 2018-10-28 12:50:13
      Java不适用原因:无法解决对象互相循环引用的问题   可达性分析法 以GC Roots为起点,从这些起点开始向下搜索,经过的路径称为引用链。若一个对象到GC Roots之间没有任何引用链,则该对象是不可达的...

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 74,974
    精华内容 29,989
    关键字:

    局部的意思是什么原因