转至https://blog.csdn.net/aerchi/article/details/79784396
-
'11' *
2 //22
-
'a8' * 3
//
NaN
-
"88'"*2 //NaN
-
var a =
2, b =
3;
-
var c = a+++b;
// c = 5
-
var c = a+++(++b);
//
7, a=3, b=3
-
-
var num = 10;
-
var obj = {
-
num:
8,
-
inner: {
-
num:
6,
-
print:
function () {
-
console.log(
"num: "+num+
" , this.num: "+
this.num);
-
}
-
}
-
}
-
num =
888;
-
obj.inner.print();
//
num: 888 , this.num: 6
-
var fn = obj.inner.print;
-
fn();
//num: 888 , this.num: 888, this: Window
-
(obj.inner.print)();
//num: 888 , this.num: 6
-
(obj.inner.print = obj.inner.print)();
//num: 888 , this.num: 888 , this: Window
-
// 以下代码执行输出结果是什么
-
function b () {
-
console.log(a);
-
var a =
10;
-
function a() {};
-
a =
100;
-
console.log(a);
-
}
-
b();
-
-
function c () {
-
console.log(a);
-
function a() {};
-
var a =
10;
-
a =
100;
-
console.log(a);
-
}
-
c();
-
-
(
function d (num) {
-
console.log(num);
-
var num =
10;
-
}(
100))
-
-
(
function e (num) {
-
console.log(num);
-
var num =
10;
-
function num () {};
-
}(
100))
-
-
(
function f (num) {
-
function num () {};
-
console.log(num);
-
var num =
10
-
console.log(num);
-
}(
100))
-
-
//仍然是预解析(在与解析过程中还要考虑一下当前变量的作用于)
-
function m () {
-
console.log(a1);
// underfined
-
console.log(a2);
// underfined
-
console.log(b1);
// underfined
-
console.log(b2);
// underfined
-
if(
false) {
-
function b1 (){};
-
var a1 =
10;
-
}
-
if(
true) {
-
function b2 (){};
-
var a2 =
10;
-
}
-
console.log(a1);
// underfined
-
console.log(a2);
// 10
-
console.log(b1);
// underfined
-
console.log(b2);
// function
-
}
-
m();
-
-
function n() {
-
if(
2>
1) {
-
arr =
10;
-
brr =
10;
-
let arr;
-
var brr;
-
console.log(arr);
-
console.log(brr);
-
}
-
}
-
n();
// ReferenceError
-
-
-
//ƒ a() {}
-
//10:39:10.654 VM1688:7 100
-
//10:39:10.654 VM1688:12 ƒ a() {}
-
//10:39:10.655 VM1688:16 100
-
//10:39:10.655 VM1688:21 100
-
//10:39:10.655 VM1688:26 ƒ num() {}
-
//Uncaught TypeError: (intermediate value)(intermediate value)(...) is not a function
-
-
此阶段浏览器只是对var、function、函数形参进行一个解析的准备过程。而且在这个“预解析”过程中,有一个预解析先后顺序,即函数的形参 -> function -> var。而且重名时预留函数、后来者覆盖前者。预解析结果形参如果有值则解析到值,没有则为underfined,函数则解析到整个函数体,变量都为underfined;这道题目中没有参数出现,所以先不讨论。所以这道题在“预解析”时,函数声明权重优先会被提升
有一个已经排序的数组,比方[1,4,6,9,11,15,18],给你一个新的数,插入到数组中,写一个function
-
var arr = [
1,
4,
6,
9,
11,
15,
18]
-
-
function arrIndexOf(arr, val) {
-
var mid,
-
min =
0,
-
max = arr.length -
1
-
while (min <= max) {
-
mid = (min + max) >>
1
-
if (val > arr[mid]) {
-
min = mid +
1
-
}
else
if (val < arr[mid]) {
-
max = mid -
1
-
}
else {
-
return mid
-
}
-
}
-
return min
-
}
-
-
function insert(arr, val) {
-
if (arr[
0] === val) {
-
arr.unshift(val)
-
}
else
if (arr[arr.length -
1] === val) {
-
arr.push(val)
-
}
else {
-
arr.splice(arrIndexOf(arr, val),
0, val)
-
}
-
return arr
-
}
-
console.log(insert(arr,
17))
-
-
//
10:41:47.972 VM1742:31 (8) [1, 4, 6, 9, 11, 15, 17, 18]
从字面上就可以理解,函数节流就是用来节流函数从而一定程度上优化性能的。例如,DOM 操作比起非DOM 交互需要更多的内存和CPU 时间。连续尝试进行过多的DOM 相关操作可能会导致浏览器挂起,有时候甚至会崩溃。尤其在IE 中使用onresize 事件处理程序的时候容易发生,当调整浏览器大小的时候,该事件会连续触发。在onresize 事件处理程序内部如果尝试进行DOM 操作,其高频率的更改可能会让浏览器崩溃。又例如,我们常见的一个搜索的功能,我们一般是绑定keyup事件,每按下一次键盘就搜索一次。但是我们的目的主要是每输入一些内容搜索一次而已。为了解决这些问题,就可以使用定时器对函数进行节流。
某些代码不可以在没有间断的情况连续重复执行。第一次调用函数,创建一个定时器,在指定的时间间隔之后运行代码。当第二次调用该函数时,它会清除前一次的定时器并设置另一个。如果前一个定时器已经执行过了,这个操作就没有任何意义。然而,如果前一个定时器尚未执行,其实就是将其替换为一个新的定时器。目的是只有在执行函数的请求停止了一段时间之后才执行。
http://www.cnblogs.com/LuckyW...
-
function relative(parentNode, childNode)
-
{
-
if (parentNode && childNode)
-
{
-
return parentNode.contains(childNode);
-
}
-
}
-
-
var e1 =
document.getElementById(
"a");
-
var e2 =
document.getElementById(
"a1");
-
-
var result = relative( e1, e2 );
-
console.log(
'result: ' + result );
//true
事件捕获 处于目标阶段 事件冒泡
1.可以大量节省内存占用,减少事件注册。比如ul上代理所有li的click事件就很不错。
2.可以实现当新增子对象时,无需再对其进行事件绑定,对于动态内容部分尤为合适
事件代理的常用应用应该仅限于上述需求,如果把所有事件都用事件代理,可能会出现事件误判。即本不该被触发的事件被绑定上了事件。
定义:浏览器缓存(Browser Caching)是为了加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览。
cache的作用:
1、减少延迟,让你的网站更快,提高用户体验。
2、避免网络拥塞,减少请求量,减少输出带宽。
Cache-Control中的max-age是实现内容cache的主要手段,共有3种常用策略:max-age和Last-Modified(If-Modified-Since)的组合、仅max-age、max-age和ETag的组合。
对于强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行比较缓存策略。
对于比较缓存,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存。
-
// 有一个构造函数A,写一个函数B,继承A
-
function A (num) {
-
this.titileName = num;
-
}
-
A.prototype = {
-
fn1:
function () {},
-
fn2:
function () {}
-
}
这个问题的关注点是B继承的A的静态属性,同时B的原型链中不存在A实例的titleName属性
React为啥这么大?因为它实现了一个虚拟DOM(Virtual DOM)。虚拟DOM是干什么的?这就要从浏览器本身讲起
如我们所知,在浏览器渲染网页的过程中,加载到HTML文档后,会将文档解析并构建DOM树,然后将其与解析CSS生成的CSSOM树一起结合产生爱的结晶——RenderObject树,然后将RenderObject树渲染成页面(当然中间可能会有一些优化,比如RenderLayer树)。这些过程都存在与渲染引擎之中,渲染引擎在浏览器中是于JavaScript引擎(JavaScriptCore也好V8也好)分离开的,但为了方便JS操作DOM结构,渲染引擎会暴露一些接口供JavaScript调用。由于这两块相互分离,通信是需要付出代价的,因此JavaScript调用DOM提供的接口性能不咋地。各种性能优化的最佳实践也都在尽可能的减少DOM操作次数。
而虚拟DOM干了什么?它直接用JavaScript实现了DOM树(大致上)。组件的HTML结构并不会直接生成DOM,而是映射生成虚拟的JavaScript DOM结构,React又通过在这个虚拟DOM上实现了一个 diff 算法找出最小变更,再把这些变更写入实际的DOM中。这个虚拟DOM以JS结构的形式存在,计算性能会比较好,而且由于减少了实际DOM操作次数,性能会有较大提升
1.基本数据类型(自身不可拆分的):Undefined、Null、Boolean、Number、String
2.引用数据类型(对象):Object (Array,Date,RegExp,Function)
ES6基本数据类型多了个symbol 据说这道题刷了百分之二十的人 感谢Abbyshen提出
-
function
gettype
(nm){
-
return
Object.prototype.toString.call(nm);
-
}
1.行内样式 1000
2.id 0100
3.类选择器、伪类选择器、属性选择器[type="text"] 0010
4.标签选择器、伪元素选择器(::first-line) 0001
5.通配符*、子选择器、相邻选择器 0000
首先传输对象的双向数据绑定 Object.defineProperty(target, key, decription),在decription中设置get和set属性(此时应注意description中get和set不能与描述属性共存)
数组的实现与对象不同。
同时运用观察者模式实现wather,用户数据和view视图的更新
vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的,那么vue是如果进行数据劫持的,
可以看到属性a有两个相对应的get和set方法,为什么会多出这两个方法呢?因为vue是通过Object.defineProperty()来实现数据劫持的。
Object.defineProperty( )是用来做什么的?它可以来控制一个对象属性的一些特有操作,比如读写权、是否可以枚举,这里我们主要先来研究下它对应的两个描述属性get和set
1 component层面,web component和virtual dom
2 数据绑定(vue双向,react的单向)等好多
3 计算属性 vue 有,提供方便;而 react 不行
4 vue 可以 watch 一个数据项;而 react 不行
5 vue 由于提供的 direct 特别是预置的 directive 因为场景场景开发更容易;react 没有
6 生命周期函数名太长 directive
-
git stash
//将本次修改存到暂存区(紧急切换分支时)
-
git stash
pop
//将所有暂存区的内容取出来
静态、自适应、流式、响应式四种网页布局
静态布局:意思就是不管浏览器尺寸具体是多少,网页布局就按照当时写代码的布局来布置;
自适应布局:就是说你看到的页面,里面元素的位置会变化而大小不会变化;
流式布局:你看到的页面,元素的大小会变化而位置不会变化——这就导致如果屏幕太大或者太小都会导致元素无法正常显示。
自适应布局:每个屏幕分辨率下面会有一个布局样式,同时位置会变而且大小也会变。
-
var a = {};
-
var b = {
key:
'b'};
-
var c = {
key:
'c'};
-
var d = [
3,
5,
6];
-
a[b] =
123;
-
a[c] =
345;
-
a[d] =
333;
console.log(a[b]);
// 345
console.log(a[c]);
// 345
console.log(a[d]);
// 333//3,5,6:333//[object Object]:345
-
var R = (
function() {
-
var u = {
a:
1,
b:
2};
-
var r = {
-
fn:
function(k) {
-
return u[k];
-
}
-
}
-
return r;
-
}());
-
R.fn(
'a');
// 1
上述代码中如何获取匿名函数中的u
-
var arr =
new
Array(
100);
-
//方法1
-
//扩展运算符(spread)是三个点(...)
-
[...arr.keys()];
-
//方法二
-
Array.from(arr.keys());
-
-
//方法三
-
Array.from({
length:
100});
-
-
// 方法四 借助string
-
var arr1 =
new
Array(
101);
-
var str = arr1.join(
'1,');
-
str = str.replace(
/(1\,)/g,
function ($0, $1, index) {
-
var start =
'' +
Math.ceil(index/
2);
-
if(index < str.length -
2) {
-
start +=
','
-
}
-
return start;
-
});
-
return str.split(
',');
-
-
-
// 方法五(函数式变成,参考网络)
-
function reduce(arr, val) {
-
if(
Object.prototype.toString.apply(val)){
-
return;
-
}
-
if(val >=
100) {
-
return arr;
-
}
-
arr.push(val);
-
return reduce(arr, val+
1);
-
}
-
var res = reduce([],
0)
-
var a =
function (val, index) {
-
console.log(index);
-
return {
-
fn:
function (name) {
-
return a(name, val);
-
}
-
}
-
}
-
-
var b = a(
0);
// underfined
-
b.fn(
1);
// 0
-
b.fn(
2);
// 0
-
b.fn(
3);
// 0
1) dom节点的根节点是不是body
回答: 不是,dom节点的根节点是html(包含head和body,head中分为meta、title等。body又分为一组)
2)dom元素都会有offsetParent吗
回答: offsetParent属性返回一个对象的引用,这个对象是距离调用offsetParent的元素最近的(在包含层次中最靠近的),并且是已进行过CSS定位的容器元素。 如果这个容器元素未进行CSS定位, 则offsetParent属性的取值为根元素(在标准兼容模式下为html元素;在怪异呈现模式下为body元素)的引用。 当容器元素的style.display 被设置为 "none"时(译注:IE和Opera除外),offsetParent属性 返回 null。
3) [1,3,5]转译成字符串是什么
回答: '1,3,5'
调用toString方法,生成该字符串
4)li标签的祖级元素可以为li,父级元素也可以为例
回答: 错误
在同源策略下;在某个服务器下的页面是无法获取到该服务器以外的数据的;Jquery中ajax 的核心是通过 XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加