1.js如何判断小数点后有几位
n.toString().split(".")[1].length;
2.浮点数相加先乘以倍速转换成整数
function sum() {
var nResult = 0;
for (var i = 0, l = arguments.length; i < l; i++) {
nResult += (!isNaN(arguments[i]) && window.parseFloat(arguments[i]))||0;
}
return nResult.toFixed(3) * 1000 / 1000;
}
3.一个表格以及对应的CSS,使表格奇数行为白色背景,偶数行为灰色背景,鼠标移上去时为黄色背景。
<table class="table">
<tr><td>第一行</td></tr>
<tr><td>第二行</td></tr>
<tr><td>第三行</td></tr>
<tr><td>第四行</td></tr>
</table>
<style>
.table tr:nth-child(2n-1){
background-color:white;
}
.table tr:nth-child(2n){
background-color:grey;
}
.table tr:hover{
background-color:yellow;
}
</style>
PS:明明最简单的CSS能实现 却想着加那么多的clas以及js逻辑实现 差距啊!!!
4.this指向
var myObject = {
foo: "bar",
func: function() {
var self = this;
console.log(this.foo);
console.log(self.foo);
(function() {
console.log(this.foo);
console.log(self.foo);
}());
}
};
myObject.func();
4.函数和变量的声明都会提前,函数的声明比变量的声明更提前
5.var a=b=3 相当于 var a = 3;b = 3;b是全局的
6.javascript只有函数域,没有块作用域的概念;for循环不是函数,因此for内部定义的msg与for外部定义的msg为在同一块作用域
7.js-一种去掉数组中重复元素的方法
思路来源于某个同学的博客
复制代码
function norepeat(arr){
return arr.filter(function(val,index,array) {
return array.indexOf(val)===index;
});
}
var newarr=norepeat(["a","abc","4","xy","xyz","a","abcd","abc"]);
alert(newarr);
复制代码
利用filter和indexOf,如果这个数不重复,那个它的首个出现的index一定是传入的index
方法二:利用ES6的Set数据结构。
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
function norepeat(arr){
return [...new Set(arr)];
}
norepeat(["a","abc","4","xy","xyz","a","abcd","abc"])
// ["a", "abc", "4", "xy", "xyz", "abcd"]
8.h5 web储存
cookie 不适合大量数据的存储,因为它们由每个对服务器的请求来传递,这使得 cookie 速度很慢而且效率也不高。
HTML5 提供了两种在客户端存储数据的新方法:
localStorage - 没有时间限制的数据存储
sessionStorage - 针对一个 session 的数据存储
localStorage 方法
localStorage 方法存储的数据没有时间限制。第二天、第二周或下一年之后,数据依然可用。
sessionStorage 方法
sessionStorage 方法针对一个 session 进行数据存储。当用户关闭浏览器窗口后,数据会被删除。
9.字符串里相同的字符
方法一:数组方法
var str = 'absbdhjabababsabaddaababdfw';
str.split('ab').length - 1;
方法二:正则方法
var str = 'absbdhjabababsabaddaababdfw';
var reg = /ab/g;
str.match(reg).length;
10.行内元素和块元素
<div style="width:400px; height:200px;">
<span style="float:left; width:auto; height:100%;">
<i style="position:absolute;float:left; width:100px; height:50px;">hello</i>
</span>
</div>
问题:span 标签的width 和 height 分别为多少?
width = 0px,height = 200px
PS:任何元素,一旦float之后,都会变成块级元素,宽度高度如果没有自定义,则自动缩为元素实际宽高。
11.前端防御与Web安全XSS攻防
XSS 漏洞修复
原则: 不相信客户输入的数据
注意: 攻击代码不一定在<script></script>中
将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
只允许用户输入我们期望的数据。 例如: 年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。
对数据进行Html Encode 处理
过滤或移除特殊的Html标签, 例如: <script>, <iframe> , < for <, > for >, " for
过滤JavaScript 事件的标签。例如 "οnclick=", "onfocus" 等等。
12.doctype模式
<!DOCTYPE html>声明文档的解析类型(document.compatMode),避免浏览器的怪异模式。
文档的解析类型:
BackCompat:怪异模式,浏览器使用自己的怪异模式解析渲染页面。
CSS1Compat:标准模式,浏览器使用W3C的标准解析渲染页面。
这个属性会被浏览器识别并使用,但是如果你的页面没有DOCTYPE的声明,那么compatMode默认就是BackCompat
13.undefined 相关
只能用 === 运算来测试某个值是否是未定义的,因为 == 运算符认为 undefined 值等价于 null。
注释:null 表示无值,而 undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。
var val;
console.log('Value is ' + (val != '0') ? 'define' : 'undefine');
//define
14.call apply
15.浅拷贝和深度拷贝
浅拷贝可以用 Object.assign
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
eg:var obj2 = Object.assign({}, obj1);
这样obj2就实现了对obj1的浅拷贝;
只能克隆原始对象自身的值,不能克隆它继承的值。
function clone(origin) {
return Object.assign({}, origin);
}
上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。
function clone(origin) {
let originProto = Object.getPrototypeOf(origin);
return Object.assign(Object.create(originProto), origin);
}
16.数组方法
arr是个对象数组,reverse和sort只是改了arr的内容,返回的依然是arr对象本身,而concat返回的是新的对象,这里考的点是浅拷贝和深度拷贝,concat和slice常用来做深度拷贝
push返回数组的新的长度
reverse、sort返回数组本身
concat返回被连接数组的一个副本。
17.js中的原型链,prototype与__proto__的关系
18.原型链和继承
19.null和undefined
提示:只能用 === 运算来测试某个值是否是未定义的,因为 运算符认为 undefined 值等价于 null。
注释:null 表示无值,而 undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。
null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN
null表示"没有对象",即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
null undefined; //true
null === undefined; //false
typeof undefined; //undefined
typeof null; //object
null instanceof Object; //false
20.函数定义与声明
var f = function g() {
return 23;
};
f(); //23
g; //Uncaught ReferenceError: g is not defined
g(); //Uncaught ReferenceError: g is not defined
在 JS 里,声明函数只有 2 种方法:
第 1 种: function foo(){...} (函数声明)
第 2 种: var foo = function(){...} (等号后面必须是匿名函数,这句实质是函数表达式)
除此之外,类似于 var foo = function bar(){...} 这样的东西统一按 2 方法处理,即在函数外部无法通过 bar 访问到函数,因为这已经变成了一个表达式。
但为什么不是 "undefined"?
这里如果求 typeof g ,会返回 undefined,但求的是 g(),所以会去先去调用函数 g,这里就会直接抛出异常,所以是 Error。
21.css布局
22.无缝瀑布流布局
23.event loop
console.log('1');
setTimeout(function(){
console.log('2');
},0);
console.log('3');
//1 3 2
回调时,被回调的函数会被放在event loop里,等待线程里的任务执行完后才执行event loop里的代码。 因此,上述代码会先把线程里的执行完后,再执行event loop里的setTimeout函数.。
24.JavaScript 运行机制
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
"任务队列"中的事件,除了IO设备的事件以外,还包括一些用户产生的事件(比如鼠标点击、页面滚动等等)。只要指定过回调函数,这些事件发生时就会进入"任务队列",等待主线程读取。
除了放置异步任务的事件,"任务队列"还可以放置定时事件,即指定某些代码在多少时间之后执行。
setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行。它在"任务队列"的尾部添加一个事件,因此要等到同步任务和"任务队列"现有的事件都处理完,才会得到执行。
console.log(1);
setTimeout(function(){console.log(2);},1000);
console.log(3);
// 1 3 2
for(var i=0;i<3;i++){
setTimeout(function(){
alert(i);
},1000*i);
}
// 3 3 3
25.闭包
26.JSONP(只支持GET请求而不支持POST等其它类型的HTTP请求)
JSONP的优点是:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都 可以运行,不需要XMLHttpRequest或ActiveX的支持;
并且在请求完毕后可以通过调用callback的方式回传结果。
JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。
JSONP原理
JSONP的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了。
Jsonp的执行过程如下:
首先在客户端注册一个callback (如:'jsoncallback'), 然后把callback的名字(如:jsonp1236827957501)传给服务器。
注意:服务端得到callback的数值后,要用jsonp1236827957501(......)把将要输出的json内容包括起来,此时,服务器生成 json 数据才能被客户端正确接收。
然后以 javascript 语法的方式,生成一个function, function 名字就是传递上来的参数 'jsoncallback'的值 jsonp1236827957501 .
最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
27.Html中的非置换元素与置换元素
有类特殊的元素:如img|input|select|textarea|button|label等,他们被称为可置换元素(Replaced element)。他们区别一般inline元素(相对而言,称non-replaced element)是:
这些元素拥有内在尺寸(intrinsic dimensions),他们可以设置width/height属性。他们的性质同设置了display:inline-block的元素一致
28.伪类和伪元素
CSS 伪类用于向某些选择器添加特殊的效果。
CSS 伪元素用于将特殊的效果添加到某些选择器。
29.css权重
特殊性分为4个等级,每个等级代表一类选择器,每个等级的值为其所代表的选择器的个数乘以这一等级的权值,最后把所有等级的值相加得出选择器的特殊值。
4个等级的定义如下:
第一等:代表内联样式,如: style=””,权值为1000。
第二等:代表ID选择器,如:#content,权值为100。
第三等:代表类,伪类和属性选择器,如.content,权值为10。
第四等:代表元素和伪元素选择器,如div p,权值为1。
30.数组迭代方法
every(): 对数组中的每一项运行给定的函数,如果该函数对每一项都返回true,则结果返回true。
filter(): 对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组。
forEach(): 对数组中的每一项运行给定函数,这个方法没有返回值。
map(): 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
some(): 对数组中的每一项运行给定函数,如果该函数任意一项返回true,则返回true。
31.Object.keys()
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致
(两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)。
var data = {a: 1, b: 2, c: 3, d: 4};
Object.keys(data)
//Array(4) ['a','b','c','d']
32.当margin-top、padding-top的值是百分比时,分别是如何计算的?
相对最近父级块级元素的width,相对最近父级块级元素的width
......
33.把鼠标移到按钮并点击时,会产生一串什么样的事件?
hover active foucus
34.无缝瀑布流布局的实现
35.pre标签
pre标签定义预格式文本,保持文本原有的格式
36.原型链要记得返回this对象
填写内容让下面代码支持a.name = “name1”; b.name = “name2”;
function obj(name){
1
}
obj. 2 = "name2";
var a = obj("name1");
var b = new obj;
//1 if(name){ this.name = name;}return this;
//2 prototype.name
37. Marquee标签
<marquee>标签的作用是在一个区域插入滚动的文本。
<marquee>目前在很多浏览器中都支持的滚动文字效果,但是这个标签在w3school中找不到,并且在WebStorm中对这个标签没有提示,但是DW对这个标签的提示支持的相当好。
38.数值比较
console.log(([])?true:false);
console.log(([]==false?true:false));
console.log(({}==false)?true:false)
//true true false
第一题
Boolean([]) //true
布尔类型里只有这几参数个返回false,其它都为true
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false
第二题,和第三题
布尔类型与其它任何类型进行比较,布尔类型将会转换为number类型。
Number([])返回0所以第二题为true
Number转换类型的参数如果为对象返回的就是NaN,
那么Number({})返回的就是NaN。
通过Object.prototype.toString.call({})来判断类型,0与NaN相比为false
39.数组
需要删除arr数组中的第i个元素,最好的做法是?
arr.splice(i-1,1)
40.作用域链
var F=function(){};
Object.prototype.a=function(){};
Function.prototype .b=function(){};
var f=new F();
41.setTimeout调用
function checkState(){
console.log("xiamen");
}
window.setTimeout(checkState(), 10000); //立即被调用
window.setTimeout(checkState, 10000); // 10s后被调用
window.setTimeout("checkState()", 10000); //10s后被调用 注意和第一个的区别 有引号
42.+运算符
+new Array(017) //NaN
017八进制即15, new Array(017) 等价于 new Array(15),+操作符作为一元运算符时,会将参数转化为数字返回 。
43.判断一个js对象是否是Array,arr为要判断的对象
Object.prototype.toString.call(arr) === '[object Array]';
44.flexbox布局
45.Array.prototype.slice.call()方法
arguments不是数组,只是类数组
扩展运算符(...)也可以将某些数据结构转为数组。
var args = [...arguments];
Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js对象与com对象不能进行转换)
如:
var a={length:2,0:'first',1:'second'};//类数组,有length属性,长度为2,第0个是first,第1个是second
console.log(Array.prototype.slice.call(a,0));// ["first", "second"],调用数组的slice(0);
var a={length:2,0:'first',1:'second'};
console.log(Array.prototype.slice.call(a,1));//["second"],调用数组的slice(1);
var a={0:'first',1:'second'};//去掉length属性,返回一个空数组
console.log(Array.prototype.slice.call(a,0));//[]
function test(){
console.log(Array.prototype.slice.call(arguments,0));//["a", "b", "c"],slice(0)
console.log(Array.prototype.slice.call(arguments,1));//["b", "c"],slice(1)
}
test("a","b","c");
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
// ES5的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']
var arr11 = [].slice.call(arrayLike,1); // ['b', 'c']
// ES6的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']
46.逻辑运算符 || &&
只要“||”前面为false,无论“||”后面是true还是false,结果都返回“||”后面的值。
只要“||”前面为true,无论“||”后面是true还是false,结果都返回“||”前面的值。
只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;
只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值;
47.尾递归
递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stack overflow)。但对于尾递归来说,由于只存在一个调用
帧,所以永远不会发生“栈溢出”错误。
function factorial(n) {
if (n === 1) return 1;
return n * factorial(n - 1);
}
factorial(5) // 120
上面代码是一个阶乘函数,计算n的阶乘,最多需要保存n个调用记录,复杂度 O(n) 。
如果改写成尾递归,只保留一个调用记录,复杂度 O(1) 。
function factorial(n, total = 1) {
if (n === 1) return total;
return factorial(n - 1, n * total);
}
factorial(5) // 120
48.去除数组的重复成员
[...new Set(array)]
49.使用Set可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}
// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
50.返回对象方法
var it = makeIterator(['a', 'b']);
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ? {value: array[nextIndex++], done: false} : {value: undefined, done: true};
}
};
}
it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }
51.for...in for...of
for...in循环有几个缺点。
数组的键名是数字,但是for...in循环是以字符串作为键名“0”、“1”、“2”等等。
for...in循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。
某些情况下,for...in循环会以任意顺序遍历键名。
总之,for...in循环主要是为遍历对象而设计的,不适用于遍历数组。
for...of循环相比上面几种做法,有一些显著的优点。
for (let value of myArray) {
console.log(value);
}
有着同for...in一样的简洁语法,但是没有for...in那些缺点。
不同用于forEach方法,它可以与break、continue和return配合使用。
提供了遍历所有数据结构的统一操作接口。
52.setTimeout/setInterval的第三个参数?
setTimeout(func, delay, param1, param2, ...)
第三个参数及以后的参数都可以作为func函数的参数
举个例子:
function a(x, y) {
console.log(x, y) // 2 3
}
setTimeout(a, 1000, 2, 3)
53.Object.assign()
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
var obj1 = {a: {b: 1}};
var obj2 = Object.assign({}, obj1);
//则obj2 浅拷贝了 obj1
Object.assign可以用来处理数组,但是会把数组视为对象。
Object.assign([1, 2, 3], [4, 5])
// [4, 5, 3]
上面代码中,Object.assign把数组视为属性名为0、1、2的对象,因此目标数组的0号属性4覆盖了原数组的0号属性1。
54.__proto__
例子一:
class Point {}
var p = new Point();
p.__proto__ == Point.prototype;
// true
...to be continue...
55.结构不成功的情况
56.解构赋值
function* fibs() {
var a = 0;
var b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
var [first, second, third, fourth, fifth, sixth] = fibs();
sixth // 5
57.ES6内部使用严格相等运算符(===),判断一个位置是否有值。所以,如果一个数组成员不严格等于undefined,默认值是不会生效的。
[x, y = 'b'] = ['a']; // x='a', y='b'
[x, y = 'b'] = ['a', undefined]; // x='a', y='b'
[x, y = 'b'] = ['a', '']; // x='a', y=''
58.由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。
var arr = [1, 2, 3];
var {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3
59.模板字符串( ` ` )
模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中
嵌入变量。
模板字符串中嵌入变量,需要将变量名写在${}之中。
// 字符串中嵌入变量
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`
60.数组in操作符和数组空位
index in arry;
数组in操作符返回index位置是否有值
空位不是undefined,一个位置的值等于undefined,依然是有值的。空位是没有任何值,in运算符可以说明这一点。
0 in [undefined, undefined, undefined] // true
0 in [, , ,] // false
上面代码说明,第一个数组的0号位置是有值的,第二个数组的0号位置没有值。
61.函数的length属性
如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了。
(function (a = 0, b, c) {}).length // 0
(function (a, b = 1, c) {}).length // 1
62.rest参数和扩展运算符(spread)
rest参数(形式为“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组,该变量将
多余的参数放入数组中。
rest参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。
// 报错
function f(a, ...b, c) {
// ...
}
扩展运算符(spread)是三个点(...)。它好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。
将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。
// 报错
const [...butLast, last] = [1, 2, 3, 4, 5];
// 报错
const [first, ...middle, last] = [1, 2, 3, 4, 5];
63.箭头函数this
64.Symbol
65.Object.defineProperty
66.属性的遍历。
ES6一共有5种方法可以遍历对象的属性。
for...in
Object.keys(obj)
Object.getOwnPropertyNames(obj)
Object.getOwnPropertySymbols(obj)
Reflect.ownKeys(obj)
以上的5种方法遍历对象的属性,都遵守同样的属性遍历的次序规则。
首先遍历所有属性名为数值的属性,按照数字排序。
其次遍历所有属性名为字符串的属性,按照生成时间排序。
最后遍历所有属性名为Symbol值的属性,按照生成时间排序。
Reflect.ownKeys({ [Symbol()]:0, b:0, 10:0, 2:0, a:0 })
// ['2', '10', 'b', 'a', Symbol()]
67.next()带参数的情况
function* foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y / 3);
return (x + y + z);
}
var a = foo(5);
a.next() // Object{value:6, done:false}
a.next() // Object{value:NaN, done:false}
a.next() // Object{value:NaN, done:true}
var b = foo(5);
b.next() // { value:6, done:false }
b.next(12) // { value:8, done:false }
b.next(13) // { value:42, done:true }
上面代码中,第二次运行next方法的时候不带参数,导致y的值等于2 * undefined(即NaN),除以3以后还是NaN,因此返回对象的value属性也等
于NaN。第三次运行Next方法的时候不带参数,所以z等于undefined,返回对象的value属性等于5 + NaN + undefined,即NaN。
如果向next方法提供参数,返回结果就完全不一样了。上面代码第一次调用b的next方法时,返回x+1的值6;第二次调用next方法,将上一次yield语
句的值设为12,因此y等于24,返回y / 3的值8;第三次调用next方法,将上一次yield语句的值设为13,因此z等于13,这时x等于5,y等于24,所
以return语句的值等于42。
68.计算属性computed和methods的区别
主要区别是computed有缓存
69.CSS选择器
header + p 选择器+选择header元素后紧跟的p元素:
article ~ article 选择器~,选择所有跟在article后的同层article元素,不管它们之间隔了多少其他元素:
70.数组的栈方法和队列方法
push()在数组末尾增加一项,返回数组长度
pop() 在数组末尾移除一项,返回移除的项
unshift() 在数组开头增加一项,返回数组长度
shift() 在数组开头移除一项,返回移除的项
71.函数声明和函数表达式
区别:主要是变量提升
72.hasOwnproperty() hasPrototypeProperty()
73.事件委托
74.画图 canvas 和 svg
75.保存页面数据 localstorage
76.盒子模型和浮动盒子模型
77.Object.is()
Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与
严格比较运算符(===)的行为基本一致。
不同之处只有两个:一是+0不等于-0,二是NaN等于自身。
Object.is('foo', 'foo')
// true
Object.is({}, {})
// false
78.BFC "overflow:hidden"能清除浮动的影响
http://blog.csdn.net/qyt0147/article/details/78600007
79.h5的头
<!DOCTYPE html>
是html5的写法。
在 HTML 4.01 中,<!DOCTYPE> 声明引用 DTD,因为 HTML 4.01 基于 SGML。
DTD 规定了标记语言的规则,这样浏览器才能正确地呈现内容。
HTML5 不基于 SGML,所以不需要引用 DTD,因此没有声明DTD。