总结Ⅰ-基础篇之HTML

259 阅读9分钟

HTML

1. 如何理解HTML语义化

  • 要点1:举例阐述

我平时写代码用的就是HTML语义化的标签,比如标题用h1-h6,段落用p,文章用artical,画板用canvas,章节用section,时间用time等等。我认为HTML语义化就是使用语义恰当的标签写HTML,它可以让整个页面具有良好的结构,可以让开发人员快读理解网页的内容。

  • 要点2:深入分析为什么要HTML语义化

HTML语义化是存在历史周期的,一开始的荒野阶段没有专业的前端开发,都是由后台写HTML的,大部分用table标签,一个table套另一个table,让代码不好维护。后来美工阶段开始用div,span和css写页面,在其上加class区分。这样虽然没什么问题,但是不够语义化。(这个div代表什么,这个div和那个div之间是什么联系,都不清楚)。现在我们进入前端阶段,我们更专业的做法就是使用语义化的标签,用正确的标签写正确的内容做正确的事

2. meta viewport 是做什么用的,怎么写?

  • 要点1:概括

meta viewport 是用于适配移动设备的,为了使不管是什么宽度的页面都能在移动设备端得到完美适配.让页面在移动端不要缩小显示。

  • 要点2:举例

比如这段代码: <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 就是让当前viewport的宽度等于设备的宽度,同时不允许用户手动缩放

name为viewport表示供移动设备使用. content定义了viewport的属性. width表示移动端显示的宽度为设备宽度(device-width) height表示移动端显示的宽度为设备宽度. user-scalable表示用户缩放能力, no表示不允许. initial-scale表示设备与视口的缩放比率 maximum和minimum分别表示缩放的最大最小值, 要注意的是, maximum必须必minimum大. 上面的meta标签就是告诉浏览器, 不要在移动端显示的时候缩放.

移动设备上的 viewport 是设备屏幕上用来显示网页的那部分区域,再具体一点就是浏览器上用来显示网页的那部分区域,但 viewport 又不局限于浏览器可视区域的大小,它可能比浏览器的可视区域大,也可能比浏览器的可视区域小。

如果不知道设备的理想宽度就用特殊值 device-width,同时 initial-scale=1 来达到一个理想的 viewport (ideal viewport)。

3. 你用过哪些 HTML 5 标签?

  • 要点:列举使用过的标签

内容标签:header,footer,main,acticle

功能标签:(看MDN)

  1. canvas:

    canvas是如何进行绘制的?(看MDN的示例)

首先获取到canvas元素,获得它的二维上下文,设置笔刷的颜色,画布的范围,就可以开始绘制了。

  1. video:

会用到哪写属性?width,height设置视频展示区域的宽度高度。src视频的地址。autoplay自动播放。poster海报帧的地址(封面)。还可以通过track加字幕。

  1. audio:

在文档中嵌入音频内容。常用属性:src和controls如果声明了该属性,浏览器将提供一个包含声音,播放进度,播放暂停的控制面板,让用户可以控制音频的播放。

4. 遇到的浏览器兼容问题

不同浏览器的内核不同,就导致了对网页的解析有所出入,也就是浏览器兼容性问题。浏览器的兼容性可以分为三个方面:html,css兼容,交互兼容(js),浏览器hack

  1. html,css兼容

    浏览器的初始化样式不同:可以通过reset ,重置css样式。*{margin:0;padding:0} 等。还有ol,ul列表元素的{list-style:none}

  2. 交互兼容

    注册事件的API不同。标准浏览器支持addEventListener,IE8以下浏览器支持attachEvent

    //例如给一个button注册click事件
      var el = document.getElementById('button');  //button是一个<button>元素
      var handler = function(e){alert("button clicked.");};
      if(el.addEventLister){
          el.addEventListener("click", handler,false);
      }
      if(el.attachEvent){
          el.attachEvent("onclick", handler);
      }
    

它们的阻止默认事件和阻止冒泡的API也是不同的

5. H5 是什么?

HTML5是第五代HTML的标准。

H5并不是HTML5!

H5是指移动端页面。就像一个很大的容器,里面可以放文本、图片、音视频等基本的流媒体格式的文件。常见的应用比如微信H5,我们在微信朋友圈看到一些酷炫的小视频,节日贺卡,微信小游戏等。包含了HTML5新增的一些功能标签,canvas,audio,拖拽特性,本地存储,同时包括盒模型,绝对定位等所有前端的知识。

6. html5用于性能测试的api

window.performance

Performance Timing API 是一个支持 Internet Explorer 9 以上版本及 WebKit 内核浏览器中用于记录页面加载和解析过程中关键时间点的机制,它可以详细记录每个页面资源从开始加载到解析完成这一过程中具体操作发生的时间点,这样根据开始和结束时间戳就可以计算出这个过程所花的时间了。

7.Var,Let 和 Const 有什么区别

6.1 介绍

var

在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量

注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象

var a = 10;
console.log(window.a) // 10

使用var声明的变量存在变量提升的情况

console.log(a) // undefined
var a = 20

在编译阶段,编译器会将其变成以下执行

var a
console.log(a)
a = 20

使用var,我们能够对一个变量进行多次声明,后面声明的变量会覆盖前面的变量声明

var a = 20 
var a = 30
console.log(a) // 30

在函数中使用使用var声明变量时候,该变量是局部的

var a = 20
function change(){
    var a = 30
}
change()
console.log(a) // 20 

而如果在函数内不使用var,该变量是全局的

var a = 20
function change(){
   a = 30
}
change()
console.log(a) // 30 

let

let是ES6新增的命令,用来声明变量

用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效

{
    let a = 20
}
console.log(a) // ReferenceError: a is not defined.

不存在变量提升

console.log(a) // 报错ReferenceError
let a = 2

这表示在声明它之前,变量a是不存在的,这时如果用到它,就会抛出一个错误

只要块级作用域内存在let命令,这个区域就不再受外部影响

var a = 123
if (true) {
    a = 'abc' // ReferenceError
    let a;
}

使用let声明变量前,该变量都不可用,也就是大家常说的“暂时性死区

最后,let不允许在相同作用域中重复声明

let a = 20
let a = 30
// Uncaught SyntaxError: Identifier 'a' has already been declared

注意的是相同作用域,下面这种情况是不会报错的

let a = 20
{
    let a = 30
}

因此,我们不能在函数内部重新声明参数

function func(arg) {
  let arg;
}
func()
// Uncaught SyntaxError: Identifier 'arg' has already been declared

const

const声明一个只读的常量,一旦声明,常量的值就不能改变

const a = 1
a = 3
// TypeError: Assignment to constant variable.

这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值

const a;
// SyntaxError: Missing initializer in const declaration

如果之前用var或let声明过变量,再用const声明同样会报错

var a = 20
let b = 20
const a = 30
const b = 30
// 都会报错

const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动

对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量

对于复杂类型的数据,变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的,并不能确保改变量的结构不变

const foo = {};

// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123

// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only

其它情况,const与let一致

6.1 区别

var、let、const三者区别可以围绕下面五点展开:

  • 变量提升
  • 暂时性死区
  • 块级作用域
  • 重复声明
  • 修改声明的变量
  • 使用

变量提升 var声明的变量存在变量提升,即变量可以在声明之前调用,值为undefined

let和const不存在变量提升,即它们所声明的变量一定要在声明后使用,否则报错

// var
console.log(a)  // undefined
var a = 10

// let 
console.log(b)  // Cannot access 'b' before initialization
let b = 10

// const
console.log(c)  // Cannot access 'c' before initialization
const c = 10

暂时性死区

var不存在暂时性死区

let和const存在暂时性死区,只有等到声明变量的那一行代码出现,才可以获取和使用该变量

// var
console.log(a)  // undefined
var a = 10

// let
console.log(b)  // Cannot access 'b' before initialization
let b = 10

// const
console.log(c)  // Cannot access 'c' before initialization
const c = 10

块级作用域

var不存在块级作用域

let和const存在块级作用域

// var
{
    var a = 20
}
console.log(a)  // 20

// let
{
    let b = 20
}
console.log(b)  // Uncaught ReferenceError: b is not defined

// const
{
    const c = 20
}
console.log(c)  // Uncaught ReferenceError: c is not defined

重复声明

var允许重复声明变量

let和const在同一作用域不允许重复声明变量

// var
var a = 10
var a = 20 // 20

// let
let b = 10
let b = 20 // Identifier 'b' has already been declared

// const
const c = 10
const c = 20 // Identifier 'c' has already been declared

修改声明的变量

var和let可以

const声明一个只读的常量。一旦声明,常量的值就不能改变

// var
var a = 10
a = 20
console.log(a)  // 20

//let
let b = 10
b = 20
console.log(b)  // 20

// const
const c = 10
c = 20
console.log(c) // Uncaught TypeError: Assignment to constant variable

使用

能用const的情况尽量使用const,其他情况下大多数使用let,避免使用var

8. 用es5的方式实现es6中的const

const的特点:声明一个常量,只能读,不能修改。

思路:利用Object.defineProperty

 function myConst(key, val) {
            window.key = val
            Object.defineProperty(window, key, {
                enumerable: false,//不能遍历
                configurable: false,//不可以配置,重新定义或删除
                writable: false,//不可以重新赋值
                value : val
                //也可以用属性访问器的方式
                // get() {
                //     return val
                // },
                // set(value) {
                //     if (value !== val) {
                //         throw new TypeError('不能重复定义')
                //     } else {
                //         return val
                //     }
                // }
            })
}

9. HTTP的keep-alive

http 1.0 是普通模式,每次客户端和服务器进行请求和响应的时候,都会建立一个新的连接,响应完毕后就断开连接。所以就很低效,需要频繁的建立和断开连接。

所以http1.1 出现了keep-alive模式,就是长连接,客户端和服务器的连接是长久有效的,某一次通信完成后,连接也不会断开。当对服务器有后继请求时,keep-alive模式就避免了重新建立连接。