git基本操作

接触git也有一段时间了,现在总结下git的使用知识点。如想详细学习git,请百度———— [廖雪峰 git] 第一个就是。

git知识点:

1. 如何上传一个项目

(再此之前我默认你已经配置好ssh密匙等)

  1. 首先在git中新建一个仓库(名字不可以为中文);
  2. 在本地建立与之对应的一个仓库用于存储这个仓库的代码;
  3. cd到本仓库的目录下;
  4. git init (此步操作完成后,会生成一个隐藏的.git后缀文件)
  5. git add . (.是指添加整个工程,如需添加单个文件则只需要 git add test.js)
  6. git commit -m”注释内容”
  7. git remote add origin git@github.com:zjzno1/Demo.git (zjzno1是你的git名字,Demo是你新建的仓库的名字)
  8. git push -u origin master (将项目推向git)

2. 删除git一个项目(仓库)慎用!!!!!

  1. 在主页点击进入想要删除的仓库
  2. 在仓库的上方点击settings
  3. 将页面拖到最下面,点击Delete this repository
  4. 在弹出框输入本仓库的名字,确认删除。

3. git上clone一个项目到本地

  1. git clone [ssh]

4. 更新远程代码到本地

  1. git remote -v 查看远程仓库
    git fetch origin master 从远程的origin仓库的master分支下载代码到本地的origin master
    git log -p master.. origin/master 比较本地的仓库和远程参考的区别

5. 拉取远程分支并创建本地分支

  1. git branch -r 查看所有远程分支
  2. git checkout -b 本地分支名x origin/远程分支名x 使用该方式会在本地新建分支x,并自动切换到该本地分支x (采用此种方法建立的本地分支会和远程分支建立映射关系。)
  3. git fetch origin 远程分支名x:本地分支名x 使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checkout。(采用此种方法建立的本地分支不会和远程分支建立映射关系)
  4. 在已有git项目上,如果远程创建了新分支,git branch -a查看不到这个远程分支,要先git fatch

css实现水平垂直居中

废话不多说,直接上代码
父级元素position属性设置为 relative
body {
    height:100%;
    width:100%;
}
div-one {
    position:relative;
    height:100px;
    width:100px;
}
子元素css
div-one-content {
    position: absolute;
    height:100px;
    width:100px;
    background-color: #cbcb04;
    top: 50%;
    left: 50%;
    margin-left: -50px;
    margin-top: -50px;
}
这样子元素就在父元素中居中

js事件绑定与事件委托

早就准备总结这篇文章,但一直没动笔,今天抽个空总结一下。

事件绑定,顾名思义,就是把js绑定到一个html的元素上,比如:

html文件:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <ul id="list">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
  </ul>
</body>
</html>

js文件:
$(‘#list li’).on(‘click’, function() {
alert(($(this).html()));
});
这就是事件绑定,其实现原理是分别给list下的`

  • 绑定click事件,这样做的弊端在于加大了内存的压力,因为$(‘#list li’)要存放n个li对象,同时会降低代码的性能,因为$(‘#list li’)会搜索#list下的所有li元素。
  • =======================================分割线==========================================

    那么针对这种情况,有没有什么比较好的解决方案?

    当然有,那就是js的时间委托。

    $('#data-list').on('click', 'li', function() {
        alert(($(this).html()));
    });
    

    这么做的原理是js具有事件冒泡机制,内层元素的事件被触发,时间会一层一层的冒到更外层的元素,并且当外层事件被触发时,会判断事件的来源即event.target是否是目标元素li,如果是就执行回调。

    以上代码等同于:
    
    function showText(text) {
        alert((text));
    }
    
    $('#data-list').on('click', function(event) {
        var $target = $(event.target);
        if ($target.is('li')) {
            showText($target.html());
        }
    });
    

    这样做的好处不仅仅提高了内存的利用率,还在页面动态变化之后,不需要重新检查元素与添加绑定事件,也方便ajax操作dom。

    前端面试题js相关总结

    js相关问题

    1. 介绍js的基本数据类型。

    Undefined、Null、Boolean、Number、String

    2. 介绍js有哪些内置对象?

    Object 是 JavaScript 中所有对象的父对象

    数据封装类对象:Object、Array、Boolean、Number 和 String
    其他对象:Function、Arguments、Math、Date、RegExp、Error

    3. 说几条写JavaScript的基本规范?

    1.不要在同一行声明多个变量。
    2.请使用 ===/!==来比较true/false或者数值
    3.使用对象字面量替代new Array这种形式
    4.不要使用全局函数。
    5.Switch语句必须带有default分支
    6.函数不应该有时候有返回值,有时候没有返回值。
    7.For循环必须使用大括号
    8.If语句必须使用大括号
    9.for-in循环中的变量 应该使用var关键字明确限定作用域,从而避免作用域污染。

    4. JavaScript原型,原型链 ? 有什么特点?(有疑问,函数对象有prototype,而普通对象没有。。写完查一下再来补充)

    每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时,
    如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,
    于是就这样一直找下去,也就是我们平时所说的原型链的概念。
    关系:instance.constructor.prototype = instance._proto_

    特点:
    JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。

    当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的话,
    就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象。

    function Func(){}
    Func.prototype.name = "Sean";
    Func.prototype.getInfo = function() {
      return this.name;
    }
    var person = new Func();//现在可以参考var person = Object.create(oldObject);
    console.log(person.getInfo());//它拥有了Func的属性和方法
    //"Sean"
    console.log(Func.prototype);
    // Func { name="Sean", getInfo=function()}
    

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

    栈:原始数据类型(Undefined,Null,Boolean,Number、String)
    堆:引用数据类型(对象、数组和函数)

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

    6. Javascript如何实现继承?

    1、构造继承
    2、原型继承
    3、实例继承
    4、拷贝继承

    原型prototype机制或apply和call方法去实现较简单,建议使用构造函数与原型混合方式。

    function Parent(){
           this.name = 'wang';
       }
    
       function Child(){
           this.age = 28;
       }
       Child.prototype = new Parent();//继承了Parent,通过原型
    
       var demo = new Child();
       alert(demo.age);
       alert(demo.name);//得到被继承的属性
     }
    

    7. javascript创建对象的几种方式?

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

    1、对象字面量的方式

    person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
    

    2、用function来模拟无参的构造函数

    function Person(){}
    var person=new Person();//定义一个function,如果使用new"实例化",该function可以看作是一个Class
    person.name="Mark";
    person.age="25";
    person.work=function(){
    alert(person.name+" hello...");
    }
    person.work();
    

    3、用function来模拟参构造函数来实现(用this关键字定义构造的上下文属性)

    function Pet(name,age,hobby){
       this.name=name;//this作用域:当前对象
       this.age=age;
       this.hobby=hobby;
       this.eat=function(){
          alert("我叫"+this.name+",我喜欢"+this.hobby+",是个程序员");
       }
    }
    var maidou =new Pet("麦兜",25,"coding");//实例化、创建对象
    maidou.eat();//调用eat方法
    

    4、用工厂方式来创建(内置对象)

    var wcDog =new Object();
    wcDog.name="旺财";
    wcDog.age=3;
    wcDog.work=function(){
      alert("我是"+wcDog.name+",汪汪汪......");
    }
    wcDog.work();
    

    5、用原型方式来创建

    function Dog(){
    
     }
     Dog.prototype.name="旺财";
     Dog.prototype.eat=function(){
     alert(this.name+"是个吃货");
     }
     var wangcai =new Dog();
     wangcai.eat();
    

    5、用混合方式来创建

    function Car(name,price){
      this.name=name;
      this.price=price; 
    }
     Car.prototype.sell=function(){
       alert("我是"+this.name+",我现在卖"+this.price+"万元");
      }
    var camry =new Car("凯美瑞",27);
    camry.sell(); 
    

    8. Javascript作用链域?

    全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节。
    当需要从局部函数查找某一属性或方法时,如果当前作用域没有找到,就会上溯到上层作用域查找,
    直至全局函数,这种组织形式就是作用域链。

    9. 谈谈This对象的理解。

    那就是this指的是,调用函数的那个对象。

    10. eval是做什么的?

    它的功能是把对应的字符串解析成JS代码并运行;
    应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。

    11. 什么是window对象? 什么是document对象?

    Window – 代表浏览器中一个打开的窗口
    document对象 – 代表整个HTML 文档,可用来访问页面中的所有元素

    12. null,undefined 的区别?

    null 表示一个对象被定义了,值为“空值”;
    undefined 表示不存在这个值。

    typeof undefined
    //“undefined”
    undefined :是一个表示”无”的原始值或者说表示”缺少值”,就是此处应该有一个值,但是还没有定义。当尝试读取时会返回 undefined;
    例如变量被声明了,但没有赋值时,就等于undefined

    typeof null
    //“object”
    null : 是一个对象(空对象, 没有任何属性和方法);
    例如作为函数的参数,表示该函数的参数不是对象;

    注意:
    在验证null时,一定要使用 === ,因为 == 无法分别 null 和 undefined

    再来一个例子:

    null
    Q:有张三这个人么?
    A:有!
    Q:张三有房子么?
    A:没有!
    
    undefined
    Q:有张三这个人么?
    A:没有!
    

    13. 写一个通用的事件侦听器函数。

    // event(事件)工具集,来源: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.removeEventListener) {
                element.removeEventListener(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 (c) {
                    ev = c.arguments[0];
                    if (ev && Event == ev.constructor) {
                        break;
                    }
                    c = c.caller;
                }
            }
            return ev;
        }
    };
    

    14. [“1”, “2”, “3”].map(parseInt) 答案是多少?

    [1, NaN, NaN] 因为 parseInt 需要两个参数 (val, radix),
    其中 radix 表示解析时用的基数。
    map 传了 3 个 (element, index, array),对应的 radix 不合法导致解析失败。

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

    1. 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为。
    2. 事件处理机制:IE是事件冒泡、Firefox同时支持两种事件模型,也就是:捕获型事件和冒泡型事件;
    3. ev.stopPropagation();(旧ie的方法 ev.cancelBubble = true;)

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

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

    闭包的特性:

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

    //li节点的onclick事件都能正确的弹出当前被点击的li索引

     <ul id="testUL">
        <li> index = 0</li>
        <li> index = 1</li>
        <li> index = 2</li>
        <li> index = 3</li>
    </ul>
    <script type="text/javascript">
        var nodes = document.getElementsByTagName("li");
        for(i = 0;i<nodes.length;i+= 1){
            nodes[i].onclick = function(){
                console.log(i+1);//不用闭包的话,值每次都是4
            }(i);
        }
    </script>
    

    执行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
    

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

    use strict是一种ECMAscript 5 添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,

    使JS编码更加规范化的模式,消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为。
    默认支持的糟糕特性都会被禁用,比如不能用with,也不能在意外的情况下给全局变量赋值;
    全局变量的显示声明,函数必须声明在顶层,不允许在非函数代码块内声明函数,arguments.callee也不允许使用;
    消除代码运行的一些不安全之处,保证代码运行的安全,限制函数中的arguments修改,严格模式下的eval函数的行为和非严格模式的也不相同;

    提高编译器效率,增加运行速度;
    为未来新版本的Javascript标准化做铺垫。

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

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

    17. new操作符具体干了什么呢?

    1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
    2、属性和方法被加入到 this 引用的对象中。
    3、新创建的对象由 this 所引用,并且最后隐式的返回 this

    var obj = {};
    obj.proto = Base.prototype;
    Base.call(obj);

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

    开放性问答,略。

    19. Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?

    hasOwnProperty

    javaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。此方法无法检查该对象的原型链中是否具有该属性;该属性必须是对象本身的一个成员。
    使用方法:
    object.hasOwnProperty(proName)
    其中参数object是必选项。一个对象的实例。
    proName是必选项。一个属性名称的字符串值。

    如果 object 具有指定名称的属性,那么JavaScript中hasOwnProperty函数方法返回 true,反之则返回 false。

    20. JSON 的了解?

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
    它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小
    如:{“age”:”12”, “name”:”back”}

    21. [].forEach.call($$(““),function(a){a.style.outline=”1px solid #”+(~~(Math.random()(1<<24))).toString(16)}) 能解释一下这段代码的意思吗?

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

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

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

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

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

    24. 同步和异步的区别?

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

    25. 如何解决跨域问题?

    jsonp、 iframe、window.name、window.postMessage、服务器上设置代理页面(详见本博客跨域及解决办法)

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

    27. 模块化开发怎么做?

    sea.js cmd amd 规范

    28. AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别?

    AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD
    CMD 规范在这里:https://github.com/seajs/seajs/issues/242

    Asynchronous Module Definition,异步模块定义,所有的模块将被异步加载,模块加载不影响后面语句运行。所有依赖某些模块的语句均放置在回调函数中。
    
     区别:
    
        1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.
        2. CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:
    
    // CMD
    define(function(require, exports, module) {
        var a = require('./a')
        a.doSomething()
        // 此处略去 100 行
        var b = require('./b') // 依赖可以就近书写
        b.doSomething()
        // ...
    })
    
    // AMD 默认推荐
    define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
        a.doSomething()
        // 此处略去 100 行
        b.doSomething()
        // ...
    })
    

    29. requireJS的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何缓存的?)

    30. 谈一谈你对ECMAScript6的了解?

    31. ECMAScript6 怎么写class么,为什么会出现class这种东西?

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

    (1) defer,只支持IE
    (2) async:
    (3) 创建script,插入到DOM中,加载完毕后callBack

    33. documen.write和 innerHTML的区别

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

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

    (1)创建新节点
    createDocumentFragment() //创建一个DOM片段
    createElement() //创建一个具体的元素
    createTextNode() //创建一个文本节点
    (2)添加、移除、替换、插入
    appendChild()
    removeChild()
    replaceChild()
    insertBefore() //在已有的子节点前插入一个新的子节点
    (3)查找
    getElementsByTagName() //通过标签名称
    getElementsByName() //通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)
    getElementById() //通过元素Id,唯一性

    35. .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);
    

    36. 数组和对象有哪些原生方法,列举一下?

    pop push sort join concat reverse shift isNaN split toLowerCase toUpperCase getDate getMonth等等。

    37. 数组和对象有哪些原生方法,列举一下?

    重复,同上。

    38. JS 怎么实现一个类。怎么实例化这个类

    39. JavaScript中的作用域与变量声明提升?

    40. 如何编写高性能的Javascript?

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

    42. JQuery的源码看过吗?能不能简单概况一下它的实现原理?

    43. jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this?

    44. jquery中如何将数组转化为json字符串,然后再转化回来?

    45. jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?

    46. jquery.extend 与 jquery.fn.extend的区别?

    47. jQuery 的队列是如何实现的?队列可以用在哪些地方?

    48. 谈一下Jquery中的bind(),live(),delegate(),on()的区别?

    49. JQuery一个对象可以同时绑定多个事件,这是如何实现的?

    50. 是否知道自定义事件。jQuery里的fire函数是什么意思,什么时候用?

    51. jQuery 是通过哪个方法和 Sizzle 选择器结合的?(jQuery.fn.find()进入Sizzle)

    52. 针对 jQuery性能的优化方法?

    53. Jquery与jQuery UI 有啥区别?

    *jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。

    *jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。
    提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等

    54. JQuery的源码看过吗?能不能简单说一下它的实现原理?

    55. jquery 中如何将数组转化为json字符串,然后再转化回来?

    jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展:

    $.fn.stringifyArray = function(array) {
        return JSON.stringify(array)
    }
    
    $.fn.parseArray = function(array) {
        return JSON.parse(array)
    }
    
    然后调用:
    $("").stringifyArray(array)
    

    56. jQuery和Zepto的区别?各自的使用场景?

    57. 针对 jQuery 的优化方法?

    *基于Class的选择性的性能相对于Id选择器开销很大,因为需遍历所有DOM元素。

    *频繁操作的DOM,先缓存起来再操作。用Jquery的链式调用更好。
    比如:var str=$(“a”).attr(“href”);

    *for (var i = size; i < arr.length; i++) {}
    for 循环每一次循环都查找了数组 (arr) 的.length 属性,在开始循环的时候设置一个变量来存储这个数字,可以让循环跑得更快:
    for (var i = size, length = arr.length; i < length; i++) {}

    58. Zepto的点透问题如何解决?

    59. jQueryUI如何自定义组件?

    60. 需求:实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案?

    61. 如何判断当前脚本运行在浏览器还是node环境中?(阿里)

    62. 通过判断Global对象是否为window,如果不为window,当前脚本没有运行在浏览器中

    63. 移动端最小触控区域是多大?

    64. jQuery 的 slideUp动画 ,如果目标元素是被外部事件驱动, 当鼠标快速地连续触发外部元素事件, 动画会滞后的反复执行,该如何处理呢?

    65. 把 Script 标签 放在页面的最底部的body封闭之前 和封闭之后有什么区别?浏览器会如何解析它们?

    66. 移动端的点击事件的有延迟,时间是多久,为什么会有? 怎么解决这个延时?

    click 有 300ms 延迟,为了实现safari的双击事件的设计,浏览器要知道你是不是要双击操作。

    67. 知道各种JS框架(Angular, Backbone, Ember, React, Meteor, Knockout…)么? 能讲出他们各自的优点和缺点么?

    68. Underscore 对哪些 JS 原生对象进行了扩展以及提供了哪些好用的函数方法?

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

    详解本博客js变量声明提前

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

    内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
    垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。

    setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
    闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

    71. JQuery一个对象可以同时绑定多个事件,这是如何实现的?

    72. Node.js的适用场景?

    73. (如果会用node)知道route, middleware, cluster, nodemon, pm2, server-side rendering么?

    74. 解释一下 Backbone 的 MVC 实现方式?

    75. 什么是“前端路由”?什么时候适合使用“前端路由”? “前端路由”有哪些优点和缺点?

    76. 知道什么是webkit么? 知道怎么用浏览器的各种工具来调试和debug代码么?

    77. 如何测试前端代码么? 知道BDD, TDD, Unit Test么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?

    78. 前端templating(Mustache, underscore, handlebars)是干嘛的, 怎么用?

    79. 简述一下 Handlebars 的基本用法?

    80. 简述一下 Handlerbars 的对模板的基本处理流程, 如何编译的?如何缓存的?

    81. 用js实现千位分隔符?(来源:前端农民工,提示:正则+replace)

    function commafy(num) {
         num = num + '';
         var reg = /(-?d+)(d{3})/;
    
        if(reg.test(num)){
         num = num.replace(reg, '$1,$2');
        }
        return num;
    }
    

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

    功能检测、userAgent特征检测

    比如:navigator.userAgent
    //“Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36”

    前端面试题css相关总结

    css相关问题

    1. 介绍一下CSS的盒子模型?

    (1)有两种, IE 盒子模型、标准 W3C 盒子模型;IE的content部分包含了 border 和 pading;
    (2)盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border).

    2. CSS选择符有哪些?哪些属性可以继承?

    1.id选择器( # myid)
    2.类选择器(.myclassname)
    3.标签选择器(div, h1, p)
    4.相邻选择器(h1 + p)
    5.子选择器(ul > li)
    6.后代选择器(li a)
    7.通配符选择器( * )
    8.属性选择器(a[rel = “external”])
    9.伪类选择器(a: hover, li: nth - child)

    可继承的样式: font-size font-family color, UL LI DL DD DT;
    不可继承的样式:border padding margin width height ;

    3. CSS优先级算法如何计算?

    优先级就近原则,同权重情况下样式定义最近者为准;

    载入样式以最后载入的定位为准;
    优先级为:
    !important > id > class > tag
    important 比 内联优先级高

    4. CSS3新增伪类有那些?

    CSS3新增伪类举例:
    p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。
    p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素。
    p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素。
    p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素。
    p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素。
    :enabled :disabled 控制表单控件的禁用状态。
    :checked 单选框或复选框被选中。

    5. 如何居中div?如何居中一个浮动元素?如何让绝对定位的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%;
         }
      
    • 让绝对定位的div居中

      position: absolute;
      width: 1200px;
      background: none;
      margin: 0 auto;
      top: 0;
      left: 0;
      bottom: 0;
      right: 0;
      

    6. display有哪些值?说明他们的作用。

    block 象块类型元素一样显示。
    none 缺省值。象行内元素类型一样显示。
    inline-block 象行内元素一样显示,但其内容象块类型元素一样显示。
    list-item 象块类型元素一样显示,并添加样式列表标记。
    none 显示为空

    7. position的值relative和absolute定位原点是?

    absolute
    生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。

    fixed (老IE不支持)
    生成绝对定位的元素,相对于浏览器窗口进行定位。

    relative
    生成相对定位的元素,相对于其正常位置进行定位。

    static
    默认值。没有定位,元素出现在正常的流中
    (忽略 top, bottom, left, right z-index 声明)。

    inherit
    规定从父元素继承 position 属性的值。

    8. CSS3有哪些新特性?

    CSS3实现圆角(border-radius:8px),
    阴影(box-shadow:10px),
    文字特效(text-shadow、),
    线性渐变(gradient),
    旋转(transform)
    transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜
    增加了更多的CSS选择器
    多背景 rgba

    9. 请解释一下CSS3的Flexbox(弹性盒布局模型),以及适用场景?

    10. 用纯CSS创建一个三角形的原理是什么?

    把上、左、右三条边隐藏掉(颜色设为 transparent)

    #demo {
      width: 0;
      height: 0;
      border-width: 20px;
      border-style: solid;
      border-color: transparent transparent red transparent;
    }
    

    11. 一个满屏 品 字布局 如何设计?

    简单的方式:
    上面的div宽100%,
    下面的两个div分别宽50%,
    然后用float或者inline使其不换行即可

    12. 常见兼容性问题?

    • 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 {}

    12. li与li之间有看不见的空白间隔是什么原因引起的?有什么解决办法?

    13. 为什么要初始化CSS样式。

    • 因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。

    • 当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。

    最简单的初始化方法: * {padding: 0; margin: 0;} (强烈不建议)

    淘宝的样式初始化代码:

    body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin:0; padding:0; }
    body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; }
    h1, h2, h3, h4, h5, h6{ font-size:100%; }
    address, cite, dfn, em, var { font-style:normal; }
    code, kbd, pre, samp { font-family:couriernew, courier, monospace; }
    small{ font-size:12px; }
    ul, ol { list-style:none; }
    a { text-decoration:none; }
    a:hover { text-decoration:underline; }
    sup { vertical-align:text-top; }
    sub{ vertical-align:text-bottom; }
    legend { color:#000; }
    fieldset, img { border:0; }
    button, input, select, textarea { font-size:100%; }
    table { border-collapse:collapse; border-spacing:0; }
    

    14. absolute的containing block(容器块)计算方式跟正常流有什么不同?

    无论属于哪种,都要先找到其祖先元素中最近的 position 值不为 static 的元素,然后再判断:
    1、若此元素为 inline 元素,则 containing block 为能够包含这个元素生成的第一个和最后一个 inline box 的 padding box (除 margin, border 外的区域) 的最小矩形;
    2、否则,则由这个祖先元素的 padding box 构成。
    如果都找不到,则为 initial containing block。

    补充:

    1. static(默认的)/relative:简单说就是它的父元素的内容框(即去掉padding的部分)
    2. absolute: 向上找最近的定位为absolute/relative的元素
    3. fixed: 它的containing block一律为根元素(html/body),根元素也是initial containing block

    15. CSS里的visibility属性有个collapse属性值是干嘛用的?在不同浏览器下以后什么区别?

    16. position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?

    17. 对BFC规范(块级格式化上下文:block formatting context)的理解?

    W3C CSS 2.1 规范中的一个概念,它是一个独立容器,决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。)
    一个页面是由很多个 Box 组成的,元素的类型和 display 属性,决定了这个 Box 的类型。
    不同类型的 Box,会参与不同的 Formatting Context(决定如何渲染文档的容器),因此Box内的元素会以不同的方式渲染,也就是说BFC内部的元素和外部的元素不会互相影响。

    18. css定义的权重

    以下是权重的规则:标签的权重为1,class的权重为10,id的权重为100,以下例子是演示各种定义的权重值:

    /*权重为1*/
    div{
    }
    /*权重为10*/
    .class1{
    }
    /*权重为100*/
    #id1{
    }
    /*权重为100+1=101*/
    #id1 div{
    }
    /*权重为10+1=11*/
    .class1 div{
    }
    /*权重为10+10+1=21*/
    .class1 .class2 div{
    }
    

    如果权重相同,则最后定义的样式会起作用,但是应该避免这种情况出现

    19. 请解释一下为什么会出现浮动和什么时候需要清除浮动?清除浮动的方式

    20. 移动端的布局用过媒体查询吗?

    21. 使用 CSS 预处理器吗?喜欢那个?

    SASS (SASS、LESS没有本质区别,只因为团队前端都是用的SASS)

    22. CSS优化、提高性能的方法有哪些?

    23. 浏览器是怎样解析CSS选择器的?

    24. 在网页中的应该使用奇数还是偶数的字体?为什么呢?

    25. margin和padding分别适合什么场景使用?

    26. 抽离样式模块怎么写,说出思路,有无实践经验?[阿里航旅的面试题]

    27. 元素竖向的百分比设定是相对于容器的高度吗?

    28. 全屏滚动的原理是什么?用到了CSS的那些属性?

    29. 什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的IE?

    30. 视差滚动效果,如何给每页做不同的动画?(回到顶部,向下滑动要再次出现,和只出现一次分别怎么做?)

    31. ::before 和 :after中双冒号和单冒号 有什么区别?解释一下这2个伪元素的作用。

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

    33. 你对line-height是如何理解的?

    34. 设置元素浮动后,该元素的display值是多少?(自动变成display:block)

    35. 怎么让Chrome支持小于12px 的文字?

    36. 让页面里的字体变清晰,变细用CSS怎么做?

    (-webkit-font-smoothing: antialiased;)

    37. font-style属性可以让它赋值为“oblique” oblique是什么意思?

    38. position:fixed;在android下无效怎么处理?

    39. 如果需要手动写动画,你认为最小时间间隔是多久,为什么?(阿里)

    多数显示器默认频率是60Hz,即1秒刷新60次,所以理论上最小间隔为1/60*1000ms = 16.7ms

    40. display:inline-block 什么时候会显示间隙?(携程)

    移除空格、使用margin负值、使用font-size:0、letter-spacing、word-spacing

    41. overflow: scroll时不能平滑滚动的问题怎么处理?

    在ios上
    -webkit-overflow-scrolling: touch;

    42. 有一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度。

    43. png、jpg、gif 这些图片格式解释一下,分别什么时候用。有没有了解过webp?

    1. gif图形交换格式,索引颜色格式,颜色少的情况下,产生的文件极小,支持背景透明,动画,图形渐进,无损压缩(适合线条,图标等),缺点只有256种颜色
    2. jpg支持上百万种颜色,有损压缩,压缩比可达180:1,而且质量受损不明显,不支持图形渐进与背景透明,不支持动画
    3. png为替代gif产生的,位图文件,支持透明,半透明,不透明。不支持动画,无损图像格式。Png8简单说是静态gif,也只有256色,png24不透明,但不止256色。
    4. webp谷歌开发的旨在加快图片加载速度的图片格式,图片压缩体积是jpeg的2/3,有损压缩。高版本的W3C浏览器才支持,google39+,safari7+

    CSS 中类 (classes) 和 ID 的区别。
    请问 “resetting” 和 “normalizing” CSS 之间的区别?你会如何选择,为什么?
    请解释浮动 (Floats) 及其工作原理。
    描述z-index和叠加上下文是如何形成的。
    请描述 BFC(Block Formatting Context) 及其如何工作。
    列举不同的清除浮动的技巧,并指出它们各自适用的使用场景。
    请解释 CSS sprites,以及你要如何在页面或网站中实现它。
    你最喜欢的图片替换方法是什么,你如何选择使用。
    你会如何解决特定浏览器的样式问题?
    如何为有功能限制的浏览器提供网页?
    你会使用哪些技术和处理方法?
    有哪些的隐藏内容的方法 (如果同时还要保证屏幕阅读器可用呢)?
    你用过栅格系统 (grid system) 吗?如果使用过,你最喜欢哪种?
    你用过媒体查询,或针对移动端的布局/CSS 吗?
    你熟悉 SVG 样式的书写吗?
    如何优化网页的打印样式?
    在书写高效 CSS 时会有哪些问题需要考虑?
    使用 CSS 预处理器的优缺点有哪些?
    请描述你曾经使用过的 CSS 预处理器的优缺点。
    如果设计中使用了非标准的字体,你该如何去实现?
    请解释浏览器是如何判断元素是否匹配某个 CSS 选择器?
    请描述伪元素 (pseudo-elements) 及其用途。
    请解释你对盒模型的理解,以及如何在 CSS 中告诉浏览器使用不同的盒模型来渲染你的布局。
    请解释 * { box-sizing: border-box; } 的作用, 并且说明使用它有什么好处?
    请罗列出你所知道的 display 属性的全部值
    请解释 inline 和 inline-block 的区别?
    请解释 relative、fixed、absolute 和 static 元素的区别
    CSS 中字母 ‘C’ 的意思是叠层 (Cascading)。请问在确定样式的过程中优先级是如何决定的 (请举例)?如何有效使用此系统?
    你在开发或生产环境中使用过哪些 CSS 框架?你觉得应该如何改善他们?
    请问你有尝试过 CSS Flexbox 或者 Grid 标准规格吗?
    为什么响应式设计 (responsive design) 和自适应设计 (adaptive design) 不同?
    你有兼容 retina 屏幕的经历吗?如果有,在什么地方使用了何种技术?
    请问为何要使用 translate() 而非 absolute positioning,或反之的理由?为什么?

    实现一个footer固定在底部,当内容不够一屏时固定在页面底部,当超出一屏时在页面最下方。

    怎么引入一个新的字体

    @font-face {
    
        /* font-properties */
    
        font-family: 用户自定义的字体名称;
    
        src:url('加载外部字体文件的文件地址'),  
    
        url('加载外部字体文件的文件地址'),
    
        url('加载外部字体文件的文件地址'); /* IE9 */
    
    }
    

    iconfront使用过吗,怎么引入

    flex实现垂直居中布局,实现左固定,右充填的布局或者上固定,下充填的布局

    grid栅格布局

    z-index在什么情况下生效,又在什么情况下失效

    请解释一下bfc

    浮动的产生和怎么清楚浮动

    js变量声明提前

    在一些代码如c中都有块级作用域的概念,即在一个花括号内定义的变量只是局部变量,每个变量都有他自己的作用域(一般来说是变量定义之后花括号结束之前),而js不一样,js的执行区间(即作用域)十分有意思,因为在执行区间之内js定义的局部变量声明会提前,所以如果不太了解这个机制的话有可能写代码的时候会出现一些你意想不到的结果。下面我们就来聊聊这个机制。
    var a = "hello"
    function f(){
        console.log(a);
        var a = "world"
        console.log(a);
    }
    f();
    输出结果为 undefind world 
    
    为什么会出现这样的结果呢?为什么不实 hello world 或者 world world ?这就涉及到了js的变量声明提前。
    以上代码等同于
    var a = "hello"
    function f(){
        var a;  //变量声明提前
        console.log(a);
        a = "world"
        console.log(a);
    }
    f();
    
    也就是相当于在函数开始的时候定义了变量,但是没有赋值,所以第一个console.log(a)输出为 undefind。
    那么下面这种情况呢?
    var a = "hello"
    function f(){
        console.log(a);
        a = "world"
        console.log(a);
    }
    f();
    
    输出是什么?
    没错,就是 hello world。那为什么呢?
    那是因为在js中,如果变量声明没有加 var 关键字时,即定义的是全局变量。所以第一个console.log(a)输出hello,然后把world赋值给全局变量a,第二个console.log(a)输出为world。
    so,这就是js的变量声明提前,简单吧Y(^_^)Y

    以上。

    前端面试题html相关总结

    HTML 相关问题:

    1. doctype(文档类型) 的作用是什么?

    (1)<!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前。此标签可告知浏览器文档使用哪种 HTML 或 XHTML 规范。告知浏览器的解析器用什么文档标准解析这个文档。DOCTYPE不存在或格式不正确会导致文档以兼容模式(怪异模式)呈现。
    (2)标准模式的排版和JS运作模式都是以该浏览器支持的最高标准运行。在兼容模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作。

    2. HTML5 为什么只需要写<!DOCTYPE html>?

    HTML5 不基于 SGML,因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为(让浏览器按照它们应该的方式来运行);
    而HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型。

    3. 浏览器标准模式 (standards mode) 和怪异模式 (quirks mode) 之间的区别是什么?

    所谓的标准模式是指,浏览器按W3C标准解析执行代码;怪异模式则是使用浏览器自己的方式解析执行代码,因为不同浏览器解析执行的方式不一样,所以我们称之为怪异模式。浏览器解析时到底使用标准模式还是怪异模式,与你网页中的DTD声明直接相关,DTD声明定义了标准文档的类型(标准模式解析)文档类型,会使浏览器使用相应的方式加载网页并显示,忽略DTD声明,将使网页进入怪异模式(quirks mode)。

    3. HTML 和 XHTML 有什么区别?

    相较HTML,XHTML有着更严格的语法,
    XHTML 元素必须被正确地嵌套。
    XHTML 元素必须被关闭。
    标签名必须用小写字母。
    XHTML 文档必须拥有根元素。
    因为xml的解析语法过于苛刻,只要网页中出现一处错误,则浏览器停止解析。违背了网页设计的一个基本原理,即“发送时要保守,接收时要开放。”,于是xhtml2.0项目最终流产,被html5所取代。

    4. 如果页面使用 ‘application/xhtml+xml’ 会有什么问题吗?

    要求比较严格,必须有head、body标签且每个元素必须是关闭的。
    一些老的浏览器不支持,实际上,任何最新的浏览器都将支持application/xhtml+xml媒体类型。大多数浏览器也接受以application/xml发送的XHTML文档。

    5. 如果网页内容需要支持多语言,你会怎么做?

    采用统一编码UTF-8方式编码
    navigator.language 可以返回用户设置的用户首选语言,然后根据用户首选语言执行js操作
    Google提供的网站翻译器

    一个可以用域名跳转,不同的语言版本跳转到不同的域名
    另一个可以通过浏览器发送带 accept-language 头部信息的请求请求不同版本的页面文档

    6. 在设计和开发多语言网站时,有哪些问题你必须要考虑?

    (1) 应用字符集的选择
    对提供了多语言版本的网站来说,Unicode字符集应该是最理想的选择。
    (2) 语言书写习惯&导航结构
    (3) 数据库驱动型网站
    (4) 搜索引擎&市场推广

    7. data-属性的作用是什么?

    data- 属性使 HTML 有了存储数据的能力,它让 HTML 更加灵活,JavaScript 可以通过 dataset 方法访问到 data- 的自定义属性,CSS 中也可以通过 attr 方法来引用 data- 属性的值。

    <div data-author="david" data-time="2011-06-20" data-comment-num="10">...</div>
    var post = document.getElementsByTagName('div')[0];
    post.dataset; // DOMStringMap
    post.dataset.commentNum; // 10
    

    8. 如果把 HTML5 看作做一个开放平台,那它的构建模块有哪些?

    <nav>, <header>,<section>, <footer>

    9. 请描述 cookies、sessionStorage 和 localStorage 的区别。

    cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。
    cookie数据始终在同源的http请求中携带(即使不需要),记会在浏览器和服务器间来回传递。
    sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。

    存储大小:
    cookie数据大小不能超过4k。
    sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。

    有期时间:
    localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;
    sessionStorage 数据在当前浏览器窗口关闭后自动删除。
    cookie 设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭

    10. 请解释<script>、<script async><script defer> 的区别。

    普通脚本加载方式在加载和执行时会阻塞页面的渲染,async 和 defer 方式是用异步的方式加载脚本,不会阻塞页面渲染,它们之间的不同在于何时执行,async 方式是加载后马上执行,defer 方式是加载后等所有 DOM 都渲染好触发 DOMContentLoaded 事件之前执行,所以 async 方式里面的脚本都是乱序执行,defer 方式加载的代码都是按序执行的,按序执行对有依赖的代码非常重要。
    若两个属性同在,会忽略defer而遵从async

    11. 为什么通常推荐将 CSS <link> 放置在 <head></head> 之间,而将 JS <script> 放置在 </body> 之前?你知道相关解释吗?

    浏览器从上到下依次解析html文档。将 css 文件放到头部, css 文件可以先加载。避免先加载 body 内容,导致页面一开始样式错乱,然后闪烁。将 javascript 文件放到底部是因为:若将 javascript 文件放到 head 里面,就意味着必须等到所有的 javascript 代码都被 下载、解析和执行完成 之后才开始呈现页面内容。这样就会造成呈现页面时出现明显的延迟,窗口一片空白。为避免这样的问题一般将全部 javascript 文件放到 body 元素中页面内容的后面。

    12. 什么是渐进式渲染 (progressive rendering)?

    渐进式渲染是指浏览器不用等待所有页面资源都渲染好之后再呈现给用户看,而是边下载边渲染,所以用户打开一个网页的时候往往不能第一时间看到所有的内容,但是能够看到一个大概的样子,后续的内容浏览器会慢慢补上形成一个完整的页面。这个有点像 bigpipe。

    13. 你用过哪些不同的 HTML 模板引擎?

    这个有很多,各大前端框架组件基本都可以叫模版引擎,自己用过什么说说什么。
    比喻jQuery,Backbone,Anguar, React,bootstarp等等。

    14. 行内元素有哪些?块级元素有哪些? 空(void)元素有那些?

    首先:CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,如div的display默认值为“block”,则为“块级”元素;span默认display属性值为“inline”,是“行内”元素。
    (1)行内元素有:a b span img input select strong(强调的语气)
    (2)块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
    (3)常见的空元素:
    <br> <hr> <img> <input> <link> <meta>
    鲜为人知的是:
    <area> <base> <col> <command> <embed> <keygen> <param> <source> <track> <wbr>

    15. 页面导入样式时,使用link和@import有什么区别?

    (1)link属于XHTML标签,除了加载CSS外,还能用于定义RSS, 定义rel连接属性等作用;而@import是CSS提供的,只能用于加载CSS;
    (2)页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
    (3)import是CSS2.1 提出的,只在IE5以上才能被识别,而link是XHTML标签,无兼容问题;

    16. 介绍一下你对浏览器内核的理解?

    主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎。
    渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核。
    JS引擎则:解析和执行javascript来实现网页的动态效果。
    最开始渲染引擎和JS引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎。

    17. 常见的浏览器内核有哪些?

    Trident内核:IE,MaxThon,TT,The World,360,搜狗浏览器等。[又称MSHTML]
    Gecko内核:Netscape6及以上版本,FF,MozillaSuite/SeaMonkey等
    Presto内核:Opera7及以上。 [Opera内核原为:Presto,现为:Blink;]
    Webkit内核:Safari,Chrome等。 [ Chrome的:Blink(WebKit的分支)]

    18. 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;

      <!--[if lt IE 9]>
         <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
      <![endif]-->
      
    • 如何区分HTML5: DOCTYPE声明\新增的结构元素\功能元素

    19. 简述一下你对HTML语义化的理解?

    用正确的标签做正确的事情。
    html语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析;
    及时在没有样式CCS情况下也以一种文档格式显示,并且是容易阅读的;
    搜索引擎的爬虫也依赖于HTML标记来确定上下文和各个关键字的权重,利于SEO;
    使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。

    20. HTML5的离线储存怎么使用,工作原理能不能解释一下?

    在用户没有与因特网连接时,可以正常访问站点或应用,在用户与因特网连接时,更新用户机器上的缓存文件。
    原理:HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源,这些资源就会像cookie一样被存储了下来。之后当网络在处于离线状态下时,浏览器会通过被离线存储的数据进行页面展示。

    如何使用:
    1、页面头部像下面一样加入一个manifest的属性;
    2、在cache.manifest文件的编写离线存储的资源;

    CACHE MANIFEST
    #v0.11
    CACHE:
    js/app.js
    css/style.css
    NETWORK:
    resourse/logo.png
    FALLBACK:
    / /offline.html
    

    3、在离线状态时,操作window.applicationCache进行需求实现。

    21. 浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢?

    在线的情况下,浏览器发现html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过app并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。
    离线的情况下,浏览器就直接使用离线存储的资源。

    22. iframe有那些缺点?

    iframe会阻塞主页面的Onload事件; 搜索引擎的检索程序无法解读这种页面,不利于SEO;
    *iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载。
    使用iframe之前需要考虑这两个缺点。如果需要使用iframe,最好是通过javascript
    动态给iframe添加src属性值,这样可以绕开以上两个问题。

    23. Label的作用是什么?是怎么用的?

    label标签来定义表单控制间的关系,当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单控件上。

    <label for="Name">Number:</label>
    <input type=“text“name="Name" id="Name"/>
    
    <label>Date:<input type="text" name="B"/></label>
    

    24. HTML5的form如何关闭自动完成功能?

    给不想要提示的 form 或下某个input 设置为 autocomplete=off。

    25. 如何实现浏览器内多个标签页之间的通信? (阿里)

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

    26. webSocket如何兼容低浏览器?(阿里)

    Adobe Flash Socket 、
    ActiveX HTMLFile (IE) 、
    基于 multipart 编码发送 XHR 、
    基于长轮询的 XHR

    27. 页面可见性(Page Visibility)API 可以有哪些用途?

    在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放;

    28. 如何在页面上实现一个圆形的可点击区域?

    1、map+area或者svg
    2、border-radius
    3、纯js实现 需要求一个点在不在圆上简单算法、获取鼠标坐标等等

    29. 实现不使用 border 画出1px高的线,在不同浏览器的标准模式与怪异模式下都能保持一致的效果。

    <div style="height:1px;overflow:hidden;background:#ccc"></div>
    

    30. 网页验证码是干嘛的,是为了解决什么安全问题。

    区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水;
    有效防止黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试;

    31. mate标签都有哪些属性,作用是什么

    32. 模板引擎的实现原理是什么

    https://www.jianshu.com/p/9091e8a343e4
    https://blog.csdn.net/qq_41047322/article/details/82935877

    跨域及解决办法

    因为浏览器出于安全考虑,有同源策略。也就是说,如果协议、域名或者端口有一个不同就是跨域,Ajax 请求会失败。

    我们可以通过以下几种常用方法解决跨域的问题

    JSONP

    JSONP 的原理很简单,就是利用 <script> 标签没有跨域限制的漏洞。通过 <script> 标签指向一个需要访问的地址并提供一个回调函数来接收数据当需要通讯时。

    <script src="http://domain/api?param1=a&param2=b&callback=jsonp"></script>
    <script>
        function jsonp(data) {
            console.log(data)
        }
    </script>    
    

    JSONP 使用简单且兼容性不错,但是只限于 get 请求。

    在开发中可能会遇到多个 JSONP 请求的回调函数名是相同的,这时候就需要自己封装一个 JSONP,以下是简单实现

    function jsonp(url, jsonpCallback, success) {
    let script = document.createElement("script");
    script.src = url;
    script.async = true;
    script.type = "text/javascript";
    window[jsonpCallback] = function(data) {
        success && success(data);
    };
    document.body.appendChild(script);
    }
    jsonp(
    "http://xxx",
    "callback",
    function(value) {
        console.log(value);
    }
    );
    
    CORS

    CORS需要浏览器和后端同时支持。IE 8 和 9 需要通过 XDomainRequest 来实现。
    浏览器会自动进行 CORS 通信,实现CORS通信的关键是后端。只要后端实现了 CORS,就实现了跨域。
    服务端设置 Access-Control-Allow-Origin 就可以开启 CORS。 该属性表示哪些域名可以访问资源,如果设置通配符则表示所有网站都可以访问资源。

    document.domain

    该方式只能用于二级域名相同的情况下,比如 a.test.comb.test.com 适用于该方式。

    只需要给页面添加 document.domain = 'test.com' 表示二级域名都相同就可以实现跨域

    postMessage

    这种方式通常用于获取嵌入页面中的第三方页面数据。一个页面发送消息,另一个页面判断来源并接收消息

    // 发送消息端
    window.parent.postMessage('message', 'http://test.com');
    // 接收消息端
    var mc = new MessageChannel();
    mc.addEventListener('message', (event) => {
        var origin = event.origin || event.originalEvent.origin; 
        if (origin === 'http://test.com') {
            console.log('验证通过')
        }
    });
    

    css盒模型

    所谓盒模型,就是css当中最常用的一种思维模型。
    它有4个属性值,分别为

    1. 内容(content)
    2. 填充(padding)
    3. 边框(border)
    4. 边界(margin)

    每个padding,border,margin都有上下左右4个部分可以设置,盒模型也是文档流的基础

    以下是盒模型的图片