[TOC]
1、結果是什么?為什么?
```
<script>
function Foo() {
getName = function () {
console.log(1)
}
return this
}
Foo.getName = function () {
console.log(2)
}
Foo.prototype.getName = function () {
console.log(3)
}
function getName() {
console.log(5)
}
var getName = function () {
console.log(4)
}
// 運行結果
Foo.getName() // 2
getName() // 4
Foo().getName() // 1
getName() // 1
new Foo.getName() // 2
new Foo().getName() // 3
new new Foo().getName() // 3
/*
* 預解析:
* function Foo() {
getName = function () {
console.log(1)
}
return this
}
function getName() {
console.log(5)
}
重名:PK!!!
getName = undefined // 沒有值 失敗了
最終結果就是只有兩個函數:
Foo、getName
* 逐行解讀代碼:
* 函數聲明,不會改變值;函數表達式,會改變值;
* Foo.getName = function() { console.log(2) }
* Foo.prototype.getName = function() { console.log(3) }
* getName = function() { console.log(4) }
*
* Foo.getName() // 2 自身上有停止向上查找
* getName() // 4
* Foo().getName() // 先執行Foo()函數,開啟新的一輪預解析、解讀代碼;再執行getName()函數,
* 預解析:
* 空
* 逐行解讀:
* getName = function() { console.log(1) }
* this指向的是window,因為Foo是window調用的;
* Foo().getName()變形為:window.getName = function() { console.log(1) },全局作用域掛載了getName()方法
* 所以:getName = function() { console.log(4) } 被 window.getName = function() { console.log(1) }覆蓋了
* 因此:Foo().getName() 結果就是:1
* getName() // 1
* new Foo.getName() // 點的優先級是最高的,因此變形為:Foo.getName() -> 結果是:2;接下來相當于 new function() { console.log(2) },所以最終結果肯定是:2
* new Foo().getName() // 點的優先級最高,但是更高的是先執行整體,因此變形為:new Foo()先執行 結果為:Foo實例對象,然后再在實例對象上查找getName(),變形為:Foo.getName(),按照實例對象的查找規則,自身上有停止,沒有會按照原型鏈__proto__查找,結果就是:3
* new new Foo().getName() // 變形:new Foo().getName(),運行結果是: 3,然后new function() { console.log(3) },最終結果肯定是:3
* */
// new Foo.getName() 和 new Foo().getName() 不好理解看這里
function Foo() {
// this.getName = function() {
// console.log(1)
// }
}
Foo.getName = function () {
console.log(2)
}
Foo.prototype.getName = function() {
console.log(3)
}
console.log(new Foo().getName())
</script>
```
*****
2、運行結果是什么?為什么?
```
<script>
var arr = [1,2,3]
function test(arr) {
arr = []
}
test(arr)
// 結果
console.log(arr) //1,2,3
/*
* 預解析:
* arr = undefined
* function test(arr) { arr = [] }
* 逐行解讀代碼:
* arr = [1,2,3]
* function test(arr) { arr = [] } // 函數聲明,跳過
* test(arr) // 函數調用,開啟新的預解析、解讀代碼
* 預解析:
* arr = undefined
* 解讀代碼:
* arr = []
* console.log(arr) // 此arr非函數內部的arr,因為作用域額關系,因此結果就是1,2,3
* */
</script>
```
*****
3、運行結果是什么?為什么?
```
<script>
var a = 1;
if (!(b in window)) { // false
var b = 2;
a+=1
} else {
a+=2
}
// 結果
console.log(a) // 3
console.log(b) // undefined
/*
* 預解析:
* a = undefined
* b = undefined
* 逐行解讀代碼:
* a = 1
* !(b in window) // 預解析中有了b,因此b是掛載到window上,所以b in window 為true,然后取反,所以是false,因此不走if,走了else,所以:a += 2,a最終結果就是:3
* console.log(a) // 3
* console.log(b) // undefined
* */
</script>
```
*****
4、運行結果是什么?為什么?
```
<script>
var scope = 'global scope'
function checkscope() {
var scope = 'local scope'
function f() {
return scope
}
return f
}
// 結果
console.log(checkscope()()) // local scope
/*
* 預解析:
* scope = undefined
* function checkscope() { var scope = 'local scope'; function f() { return scope }; return f }
* 逐行解讀代碼:
* scope = 'global scope'
* function checkscope() { var scope = 'local scope'; function f() { return scope }; return f } // 函數聲明,跳過
* console.log(checkscope()()) // 分開兩次執行:第一次執行,checkscope(),函數調用,開啟新一輪的
* 預解析:
* scope = undefined
* function f() { return scope }
* 逐行解讀:
* scope = 'local scope'
* function f() { return scope }; // 函數聲明
* return f // 返回出去
* checkscope() // 結果就是:function f() { return scope }
* checkscope()() // 第二次執行:相當于:function f() { return scope } () 執行,開啟新的預解析、解讀代碼:
* 預解析:
* 空
* 逐行解讀:
* return scope // 預解析后沒有,按照作用域鏈向上級查找,上級的scope = 'local scope',因此最終結果就是:local scope
* */
</script>
```
5、運行結果是什么?為什么?
```
<script>
var y = 10
if (!(x in window)) {
var x = 10;
} else {
++y
}
//結果
console.log(x) // undefined
console.log(y) // 11
/*
* 預解析:
* y = undefined
* x = undefined
* 逐行解讀代碼:
* y = 10
* (x in window) // x 在預解析中存在,因此是掛載在window上面的,所以結果是:true;但是!(x in window)結果就是:false,因此,if不執行
* else ++y // 前++在這里,結果是:11
* console.log(x) // undefined
* console.log(y) // 11
* */
</script>
```
6、運行結果是什么?為什么?怎么修改達到預期
```
for(var i = 0; i< 5; i++) {
setTimeout(function () {
// 結果
console.log(i) // 5
}, 300)
}
~~~
for( var i = 0;i<5;i++) {
(function(i){
setTimeout(function () {
console.log(i);
},1000)
})(i);
}
~~~~~~
/*
* 這個setTimout在for里面是異步執行的,在延遲輸出的時候,i的值已經是5了,因此會輸出 5,5,5,5,5
* */
for( var i = 0;i<5;i++) {
(function(i){
setTimeout(function () {
console.log(i);
},1000)
})(i);
}
/*得采用閉包的方法,將里面的i值保存下來;結果就是 01234*/
```
7、運行結果是什么?為什么?
```
var str1 = 'abc123def456';
var str2 = str1.replace(/\d+/gi, '*')
// 結果
console.log(str2) // abc*def*
```
8、1&&2和1||2的值分別是多少?
```
1&&2 // 2
1||2 // 1
```
9、指出以下代碼的區別
```
function Person() {}
var person = Person()
var person = new Person()
```
10、alert(undefined == null)彈出什么
```
alert(undefined == null) // true
```
11、以下代碼輸出的結果是什么
```
console.log(1 + '2' + '2')
console.log(1 ++ '2' + '2')
console.log('A' - 'B' + '2')
console.log('A' - 'B' + 2)
```
12、以下代碼輸出的結果是什么?
```
A:var test = 1; typeof test = 'number'
B:var test = 1.2; typeof test = 'float'
C:var test = undefined; typeof test = 'undefined'
D:var test = {}; typeof test = 'object'
E:var test = '4299' - 0; typeof test = 'number'
F:var test = null; typeof test = 'object'
```
13、以下代碼的運行結果是
```
var arr = new Array(2,3,4,5,6)
var newArr = 0
for(var i=1;i<arr.length;i++) {
newArr+=arr[i]
}
// 結果
document.write(newArr) // 18
```
14、分析下面代碼,結果是
```
var s1 = parseInt('101 小四')
document.write(s1)
```
*****
15、看下列代碼輸出為何?解釋原因
```
var a = null;
alert(typeof a); //object
// 解釋:null 是一個只有一個值的數據類型,這個值就是 null。表示一個空指針對象,所以用 typeof 檢測會
返回”object”
```
*****
16、看下列代碼,輸出什么?解釋原因
```
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。
```
*****
17、看下面的代碼,輸出什么,foo 的值為什么
```
var foo = "11"+2-"1";
console.log(foo);
console.log(typeof foo);
結果:
執行完后 foo 的值為 111,foo 的類型為 String
```
18、看代碼給答案
```
var a = new Object();
a.value = 1;
b = a;
b.value = 2;
alert(a.value);
答案:2(考察引用數據類型細節)
```
19、看程序,寫結果
```
function setN(obj){
obj.name='屌絲';
obj = new Object();
obj.name = '腐女';
};
var per = new Object();
setN(per);
alert(per.name); //屌絲
```
20、下面輸出多少
```
var o1 = new Object();
var o2 = o1;
o2.name = "CSSer";
console.log(o1.name); // CSSer
```
21、a 輸出多少
~~~
var a = 6;
setTimeout(function () {
var a = 666;
alert(a); // 666
}, 1000);
/*
* 逐行解讀:
* a = 6
* 遇到了setTimeout,執行function函數,開啟新的預解析、逐行解讀
* 預解析:
* a = undefined
* 逐行解讀:
* a = 666
* alert(a) // 666,作用域鏈查找規則:自己有,拿自己的,自己沒有找父級的
* */
var a = 6;
setTimeout(function () {
alert(a);
var a = 666;
}, 1000);
/*
* 逐行解讀:
* a = 6
* 遇到了setTimeout,執行function函數,開啟新的預解析、逐行解讀
* 預解析:
* a = undefined
* 逐行解讀:
* alert(a) // undefined
* a = 666
* */
var a = 6;
setTimeout(function () {
alert(a);
var a = 66;
}, 1000);
a = 666;
alert(a);
/*
* 逐行解讀:
* a = 6
* 遇到了setTimeout,執行function函數,開啟新的預解析、逐行解讀
* 預解析:
* a = undefined
* 逐行解讀:
* alert(a) // undefined
* a = 66
* a = 666
* alert(a) // 666
*
* */
/*
* 預解析(總):
* a = undefined
* 逐行解讀:
* 直接看代碼!!!
*
* */
~~~
*****
22、看下列代碼輸出為何?解釋原因
```
var a;
alert(typeof a); // undefined
alert(b); // 報錯
```
解釋:Undefined 是一個只有一個值的數據類型,這個值就是“undefined”,在使用 var 聲明變量但并
未對其賦值進行初始化時,這個變量的值就是 undefined。而 b 由于未聲明將報錯。注意未申明的變量和
聲明了未賦值的是不一樣的
*****
23、分析代碼,得出正確的結果
```
var a=10, b=20 , c=30;
++a;
a++;
e=++a + (++b) + (c++) + a++;
alert(e);
彈出提示對話框:77
```
24、寫出函數 DateDemo 的返回結果,系統時間假定為今天
```
function DateDemo(){
var d, s="今天日期是:";
d = new Date();
s += d.getMonth() +1+ "/";
s += d.getDate() + "/";
s += d.getFullYear();
return s;
}
結果:今天日期是:7/21/2016
```
25、寫出程序運行的結果?
```
for(i=0, j=0; i<10, j<6; i++, j++){
k = i + j;}
結果:10
```
26、閱讀以下代碼,請分析出結果
```
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
```
27、看題作答
```
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 。
```
28、下面輸出多少
```
var o1 = new Object();
var o2 = o1;
o2.name = "CSSer";
console.log(o1.name);
如果不看答案,你回答真確了的話,那么說明你對 javascript 的數據類型了解的還是比較清楚了。js 中有
兩種數據類型,分別是:基本數據類型和引用數據類型(object Array)。對于保存基本類型值的變量,
變量是按值訪問的,因為我們操作的是變量實際保存的值。對于保存引用類型值的變量,變量是按引用訪
問的,我們操作的是變量值所引用(指向)的對象。答案就清楚了: //CSSer;
```
29、再來一個
```
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); // “http://www.csser.com/”
如果 CSSer 參數是按引用傳遞的,那么結果應該是"http://www.popcg.com/",但實際結果卻仍是
"http://www.csser.com/"。事實是這樣的:在函數內部修改了引用類型值的參數,該參數值的原始引用保持不變。我們可以把參數想象成局部變量,當參數被重寫時,這個變量引用的就是一個局部變量,局部
變量的生存期僅限于函數執行的過程中,函數執行完畢,局部變量即被銷毀以釋放內存。
(補充:內部環境可以通過作用域鏈訪問所有的外部環境中的變量對象,但外部環境無法訪問內部環境。
每個環境都可以向上搜索作用域鏈,以查詢變量和函數名,反之向下則不能。)
```
30、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 聲明提前
```
31、精度問題: 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
```
32、加減運算
```
alert('5'+3); //53 string
alert('5'+'3'); //53 string
alert('5'-3); //2 number
alert('5'-'3'); //2 number
```
33、結果是什么?
```
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
```
34、輸出結果
```
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
```
35、結果是
```
var bool = !!2; alert(bool);//true;
雙向非操作可以把字符串和數字轉換為布爾值。
```
36、下面這段代碼想要循環輸出結果 01234,請問輸出結果是否正確,如果不正
確,請說明為什么,并修改循環內的代碼使其輸出正確結果
~~~
for(var i=0;i<5;++i){
setTimeout(function(){
console.log(i+'');
},100*i);
}
~~~
37、.JavaScript alert(0.4*0.2);結果是多少?和你預期的一樣嗎?如果不一樣該如何
處理?
有誤差,應該比準確結果偏大。
原因:
java和JavaScript中計算小數運算時,都會先將十進制的小數換算到對應的二進制,一部分小數并不能完整的換算為二進制,這里就出現了第一次的誤差
解決方案:
一般我會將小數變為整數來處理。當然原理也是一致先轉為整數再計算。
```
alert(((0.4*10)*(0.2*10))/10);
```
38、下列 JavaScript 代碼執行后,依次 alert 的結果是
```
(function test(){
var a=b=5;
alert(typeof a);
alert(typeof b);
})();
alert(typeof a);
alert(typeof b);
答案:number
number
undefined
number
```
39、下列 JavaScript 代碼執行后,iNum 的值是
```
var iNum = 0;
for(var i = 1; i< 10; i++){
if(i % 5 == 0){
continue;
}
iNum++;
}
答案:8
```
40、輸出結果是多少?
```
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)
<script>
var a = 1;
</script>
<script>
var a;
var b = a * 0;
if (b == b) {
console.log(b * 2 + "2" - 0 + 4);
} else {
console.log(!b * 2 + "2" - 0 + 4);
}
</script>
答案: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)
<script>
var a = 1;
</script>
<script>
var a;
var b = a / 0;
if (b == b) {
console.log(b * 2 + "2" + 4);
} else {
console.log(!b * 2 + "2" + 4);
}
</script>
答案:Infinity24
```
41、下列 JavaScript 代碼執行后,運行的結果是
```
<button id='btn'>點擊我</button>
var btn = document.getElementById('btn');
var handler = {
id: '_eventHandler',
exec: function(){
alert(this.id);
}
}
btn.addEventListener('click', handler.exec);
答案:”btn"
```
42、下列 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
```
43、下列 JavaScript 代碼執行后的效果是
```
<ul id='list'>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
</ul>
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]獲取不到元素
```
44、下列 JavaScript 代碼執行后的 li 元素的數量是
```
<ul>
<li>Item</li>
<li></li>
<li></li>
<li>Item</li>
<li>Item</li>
</ul>
var items = document.getElementsByTagName('li');
for(var i = 0; i< items.length; i++){
if(items[i].innerHTML == ''){
items[i].parentNode.removeChild(items[i]);
}
}
```
45、數組和字符串
```
<script lang="JavaScript" type="text/javascript">
function outPut(s) {
document.writeln(s);
}
var a = "lashou";
var b = a;
outPut(b);
a = "拉手";
outPut(a);
outPut(b);
var a_array = [1, 2, 3];
var b_array = a_array;
outPut(b_array);
a_array[3] = 4;
outPut(a_array);
outPut(b_array);
</script>
輸出結果:
答案:lashou 拉手 lashou 1,2,3 1,2,3,4 1,2,3,4
```
46、下列控制臺都輸出什么
```
第 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(c); //答案: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 函數
定時器回調函數
```
47、對作用域上下文和 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());
```
48、運行結果
~~~
console.log(a)
var a = 12
function fn() {
console.log(a)
var a = 13
}
fn()
console.log(a)
/*
* 預解析:
* a = undefined
* function fn() { console.log(a); var a = 13 }
* 逐行解讀代碼:
* console.log(a) // undefined
* var a = 12
* function fn() { console.log(a); var a = 13 } // 函數聲明,不執行跳過
* fn() // 函數調用
* 預解析:
* a = undefined
* 逐行解讀代碼:
* console.log(a) // undefined
*
* console.log(12) // 12
* */
~~~
49、運行結果
~~~
console.log(a)
var a = 12
function fn() {
console.log(a)
a = 13
}
fn()
console.log(a)
/*
* 預解析:
* a = undefined
* function fn() { console.log(a); a = 13 }
* 逐行解讀代碼:
* consosle.log(a) // undefined
* var a = 12
* function fn() { console.log(a); a = 13 } // 不執行,因為是函數聲明
* fn() // 這個函數調用,開啟新的局部作用域解析機制
* 預解析:
* 空 // 因為沒有var、參數、function、this,預解析找的就是這些東西
* 逐行解讀代碼:
* console.log(a) // 12
* a = 13
* console.log(a) // 13
*
* */
~~~
50、運行結果 ~ O(∩_∩)O哈哈~
~~~
console.log(a)
a = 12
function fn() {
console.log(a)
a = 13
}
fn()
console.log(a)
/*
* 實際情況是下面這樣:
* 預解析:
* function fn() { console.log(a); a = 13 }
* 逐行解讀代碼:
* console.log(a) // a is not defined,程序報錯后續代碼不執行
* */
/*
* 把第一行注釋掉就是下面的結果
* 預解析:
* function fn() { console.log(a); a = 13 }
* 逐行解讀代碼:
* console.log(a) // a is not defined
* a = 12
* function fn() { console.log(a); a = 13 } // 函數聲明,不理會它,跳過
* fn() // 函數執行,開啟新的局部預解析、逐行解讀代碼
* 預解析:
* 空
* 逐行解讀代碼:
* console.log(a) // 12
* a = 13
* console.log(a) // 13
* */
~~~
51、運行結果:
~~~
var foo = 1
function bar() {
if (!foo) {
var foo = 10
}
console.log(foo)
}
bar()
/*
* 預解析:
* foo = undefined
* function bar() { if(!foo) { var foo = 100 } console.log(100) }
* 逐行解讀代碼:
* foo = 1
* function bar() { if(!foo) { var foo = 100 } console.log(100) } // 函數聲明,不理會它,跳過
* bar() // 函數執行,開啟新的局部解析作用域
* 預解析:
* foo = undefined
* 逐行解讀代碼:
* if(!foo) { var foo = 100 } // 此時foo = undefined, undefined取反,不就是真么,所以條件成立
* foo = 10
* console.log(10) // 最終結果就是:10
* */
~~~
52、運行結果:
~~~
var n = 0
function a() {
var n = 10
function b() {
n++
console.log(n)
}
b()
return b
}
var c = a()
c()
console.log(n)
/*
* 預解析:
* n = undefined
* function a() {
var n = 10
function b() {
n++
console.log(n)
}
b()
return b
}
c = undefined
逐行解讀代碼:
n = 0
c = a()
c() // 執行a開啟新的局部作用域
* 預解析:
* n = undefined
* function b() { n++; console.log(n) }
* 逐行解讀代碼:
* n = 10
* function b() { n++; console.log(n) } // 函數聲明 跳過 不理它
* b() // 函數調用,開啟新的局部作用域:
* 預解析:
* 空
* 逐行解讀代碼:
* n++ // 按照作用域鏈線上及查找
* console.log(n) // 11
* return b // n++; console.log(n)
c() 會導致B()函數的里面的n再次++,因此結果就是:n = 12
console.log(n) // 但是外部作用域無法訪問內部的變量,結果就是:0
*
* 最終結果就是:11 12 0
*
* */
~~~
53、運行結果
~~~
var a = 10, b = 11, c = 12
function test(a) {
a = 1
var b = 2
c = 3
}
test(10)
console.log(a)
console.log(b)
console.log(c)
/*
* 預解析:
* a = undefined
* b = undefined
* c = undefined
* function test(a) { a = 1; var b = 2; c = 3 }
* 逐行解讀代碼:
* a = 10
* b = 11
* c = 12
* function test(a) { a = 1; var b = 2; c = 3 } // 跳過,不理會,因為是函數聲明
* test(10) // 函數執行,開啟新的作用域解析:
* 預解析:
* a = undefined
* b = undefined
* 逐行解讀代碼:
* a = 10 // 實參傳遞進來的
* b = 2 // 私有的
* c = 3 // 全局的
* console.log(a) // 10
* console.log(b) // 11
* console.log(c) // 3
* */
~~~
54、分析運行結果
~~~
if (!("a" in window)) {
var a = 1
}
console.log(a)
/*
* 預解析:
* a = undefined
* 在全局聲明的變量相當于掛載到了window上面,因此window上面此時就存在了a變量
* 逐行解讀代碼:
* if語句不成立,所以不進入
* console.log(a) // undefined
* */
~~~
55、分析運行結果
~~~
// 'use strict'
var a = 4
function b(x, y, a) {
console.log(a)
arguments[2] = 10
console.log(a)
}
a = b(1, 2, 3)
console.log(a)
/*
* 預解析:
* a = undefined
* function b(x, y, a) {
console.log(a)
arguments[2] = 10
console.log(a)
}
逐行解讀代碼:
a = 4
function b() {} // 函數聲明,跳過,不執行
a = b(1, 2, 3) // 函數調用,執行代碼,開啟新的局部作用域:
* 預解析:
* x = undefined
* y = undefined
* a = undefined
* 逐行解讀代碼:
* console.log(a) // 3
* arguments[2] = 10 -> a = 10
* console.log(a) // 10
a = b(1, 2, 3) // 把b函數的返回值給我到a變量,而此時b沒有返回值,所以 a = undefined
console.log(a) // 結果就是:undefined
*
*
* */
/*
* 在JS的非嚴格模式下,函數的實參集合與形參變量存在映射關系,不管其中一個誰改變了,另外一個都會跟著改變
* function fn(a) {
* // a = 10
* arguments[0] = 100
* // a = 100
* }
* fn(10)
*
* 在JS嚴格模式下,arguments和形參變量的映射關系就被切斷了,相互之間互不干擾
* */
~~~
56、分析結果:
~~~
var foo = 'hello';
(function (foo) {
console.log(foo)
var foo = foo || 'world'
console.log(foo)
})(foo) // 把全局foo的值當做實參傳遞給私有作用域中的形參
console.log(foo)
/*
* 預解析:
* foo = undefined
* 逐行解讀代碼:
* foo = 'hello'
* 自執行函數執行,開啟函數內部的解析
* 預解析:
* foo = undefined // 注意:這里的foo和外部全局的foo,不是同一個
* 逐行解讀代碼:
* console.log(foo) // hello - 外部傳遞進來的數據是hello,雖然此foo非彼foo但是值是同一個
* var foo = foo || 'world' //
* console.log(foo) // hello
* console.log(foo) // hello
*
*
*
* 邏輯&& 與 邏輯||
* 在&&和||一起使用的時候:
* &&的優先級高于||
* 在條件判斷中:
* &&:所有條件都為真,整體才為真
* ||:只要有一個條件為真,整體就為真
* 在賦值操作中:
* ||:A||B,首先看A的真假,A為真返回的是A的值,A為假返回的是B的值(不管B是啥)
* 1||2 => 1
* 0||false => false
* &&:A&&B,首先看A的真假,A為假返回A的值,A為真返回B的值
* 1&&2 => 2
* 0&&false => 0
* // 在實際中的應用
function fn(num, callback) {
// 如果num沒有傳值,讓其默認為0
num = num || 0 // 這種做法不太嚴謹
callback && callback() // 如果傳了就執行,如果不傳就不執行
}
* // 調用
fn(1, function() {})
* */
~~~
57、分析結果:
~~~
console.log(0||2&&false||3)
/*
* 按照運算符優先級來看的話:
* 先計算:2 && false
* 結果是:2 為真 返回 false
* 接下來就是:
* 0 || false || 3 對比
* 結果:0 為假 返回 false
* false || 3
* 結果:false 為假 返回 3
* 最終結果就是:3
*
* */
~~~
*****
預解析規則:
1,預解析:找東西通過var、function、參數、this
2,逐行解讀代碼,遇到表達式就會改變原來預解析倉庫中的內容,如果遇到函數調用就開了一個新的 作用域,重新開始預解析、逐行解讀代碼;如果在函數作用于內部沒有通過var、function、參數找到任何東西,那么就會返回到父級繼續查找,這就是作用域鏈的過程
58、分析結果
~~~
console.log(a); // undefined
var a = 1;
~~~
59、分析結果
~~~
console.log(a); // a is not defined
a = 1;
~~~
60、分析結果
~~~
alert(a);
var a = 1;
function fn() {
alert(2)
};
解析順序:
1,找一些東西:var、function、參數(先把需要的東西找齊了才去逐行解讀代碼)
根據var找到a = 未定義(為什么不去讀取呢?我們有理由相信一個偷懶機制,萬一a = \[\]或{}那默認上來讀取的數據量就比較龐大),所有的變量在正式運行代碼之前都會提前賦值:未定義
根據function找到fn = function fn() {alert(2)}(所有函數,在正式運行代碼之前都是整個函數塊)
我們把這個步驟稱為:JS的預解析
2,逐行解讀代碼
當逐行解讀代碼的時候,每次都要去倉庫里看一眼,看看里面有沒有現在遇到的東西:當讀取到a的時候不會往下繼續讀取而是先回到倉庫里面看看有沒有a,我們倉庫中現在有一個a = 未定義,所以alert(a)的結果就是undefined。
~~~
61、分析結果
~~~
console.log(a); // a is not defined
a = 1;
解析順序:
1,整個代碼片段一看沒有var,沒有函數,沒有參數,所以以上代碼預解析完成后倉庫里面什么都沒有
2,倉庫里面什么都沒有的情況下再逐行解讀代碼就會出現a is not defined
~~~
62、分析結果
~~~
// 示例: 逐行解讀代碼
alert(a); // function a() {alert(4)}
var a = 1;
alert(a); // 1
function a() {
alert(2);
};
alert(a); // 1
var a = 3;
alert(a); // 3
function a() {
alert(4);
};
alert(a); // 3
// 解析過程
1,預解析:var function 參數
倉庫中的值:
a = undefined
a = function a() {alert(2)}
注意:在預解析的過程中,如果遇到重名的只會留下一個,一個是a = undefined另一個是a = function a(0 {alert(2)},這個和上下文沒有關系,主要是看有沒有值,所以現在倉庫中的值發生了變化。
倉庫中的值:
a = function a() {alert(2)}
var a = 3;這行的時候又會把a提取出來a = undefined,沒有值所以:
倉庫中的值:
a = function a() {alert(2)}
function a() {alert(4)};這行的時候會把a = function a(){alert(4)}提取出來,這個時候倉庫中的值為:
a = function a() {alert(2)}
a = function a() {alert(4)}
這兩個PK才會遵循上下文的順序
倉庫中的值:
a = function a() {alert(4)}
預解析完成!!!
倉庫中的值為:
a = function a() {alert(4)}
2,逐行解讀代碼:
表達式:=+-\*/%++--!,表達式可以修改預解析的值
第一個alert結果:function a() {alert(4)}
表達式是可以修改倉庫中的值所以
第二個alert結果:1
函數聲明不能修改預解析的值所以
第三個alert結果:1
第四個alert結果:3
第五個alert結果:3
擴展:如果我在本實例最下面添加a();結果是什么?
// 示例: 逐行解讀代碼
alert(a); // function a() {alert(4)}
var a = 1;
alert(a); // 1
function a() {
alert(2);
};
alert(a); // 1
var a = 3;
alert(a); // 3
function a() {
alert(4);
};
alert(a); // 3
a(); //a is not defined
解答:
alert(typeof a) //number
因為a這時候等于3,相當于3();JS 中有這樣的語法嗎?沒有所以報錯了
~~~
63、分析結果
~~~
var a = 1;
function fn() {
alert(a); // undefined
var a = 2;
}
fn();
alert(a); // 1
1,預解析:
a = undefined
fn = function fn() {alert(a);var a = 2;}
2,逐行解讀代碼:
第一行:var a = 1;由于是表達式可以改變值,所以a得值變為了:
a = 1;
第二行:function fn() {alert(a);var a = 2;},由于這是函數聲明不會改變值,所以不做任何修改,繼續往下走
第三行:fn();這個時候遇到了函數調用,那么就會往這個函數里面走,函數呢也是一個域,所以就會執行預解析、逐行解讀代碼:
1,fn()函數局部預解析:
由于遇到了var a = 2;所以預解析的結果為:a = undefined
2,fn()含數局部逐行解析代碼:
第一行:alert(a);由于預解析a = undefined此時和外面的a沒有半毛錢關系,所以結果就是undefined
第二行:var a = 2;由于是表達式所以會改變函數作用于中a的值 所以a = 2
fn()函數調用已走完
第四行:alert(a);這里會查找全局a = 1;所以結果就是1
~~~
64、分析結果
~~~
var a = 1;
function fn() {
alert(a);
a = 2;
}
fn();
alert(a);
// 解析過程
1,預解析:
a = undefined
fn = function fn () {alert(a); a = 2;}
2,逐行解讀代碼:
a = 1;
function fn () {alert(a); a = 2;},函數聲明不做修改
fn(); 函數調用,掉頭執行function fn () {alert(a); a = 2;},函數作用于執行:
1,預解析:
沒有找到var function 參數
2,逐行解讀代碼:
alert(a)內部沒又找到,查找外層a = 1(作用域鏈);所以alert(a)結果就是:1
a = 2;
第二個:alert(a); // 2
~~~
65、解析過程
~~~
var a = 1;
function fn(a) {
alert(a);
a = 2;
}
fn();
alert(a);
// 解析過程
1,預解析:
a = undefined
fn = function fn(a) {alert(a); a = 2}
2,逐行解讀代碼
a = 1;
fn()函數調用開始新的作用域:
1,預解析:
沒有var,沒有function,找到了參數a,參數本質上就是局部變量
a = undefined;
2,逐行解讀代碼:
第一個alert(a): undefined
a = 2;(修改的是局部的a,并非全局的a)
第二個alert(a): 1
~~~
66、解析過程
~~~
var a = 1;
function fn(a) {
alert(a);
a = 2;
}
fn(a);
alert(a);
// 解析過程
1,預解析:
a = undefined
fn = function fn (a) {aler(a); a= 2};
2,逐行解讀代碼
a = 1;
fn(a) 函數調用:
1,預解析(var、function、參數):
a = undefined
2,逐行解讀代碼:
傳遞了實參:a = 1
alert(a) //1
a = 2;
alert(a)(全局的a) // 1
~~~
- 公告
- HTML
- 1、什么是盒模型
- 2、行內、塊元素、空元素分別舉例
- 3、src和href的區別
- 4、html5為什么只需要寫<!
- 5、link和@import的區別
- 6、Doctype作用,標準模式與兼容模式有什么區別
- 7、至少用兩種方法寫兩列布局,左列定寬200px,右側自適應
- 8、寫出HTML5新增的語義化標簽
- 9、前端頁面由那三層構成,分別是什么,作用是什么
- 10、請描述一下cookies,sessionStorage和localStorage的區別
- 11、Sass 、S LESS 是什么?大家為什么要使用他們
- 12、css 優先級算法如何計算?
- 13、javascript的 typeof 返回哪些數據類型
- 14、例舉 3 種強制類型轉換和 2 種隱式類型轉換
- 15、數組方法 pop() push() unshift() shift()
- 16、window.onload 和 document ready 的區別
- 17、”==”和“===”的不同
- 18、iframe的作用
- 19、png、jpg、gif 這些圖片格式解釋一下,分別什么時候用。有沒有了解過webp?
- 20、style標簽寫在body后與body前有什么區別
- 21、在網頁中的應該使用奇數還是偶數的字體?為什么呢
- CSS
- 1、未知寬高垂直水平居中
- 2、都知道哪些CSS Hack
- 3、簡述優雅降級和漸進增強
- 4、box-sizing常用的屬性及分別有什么用
- 5、postion有幾種取值?每種取值相對于誰來進行定位
- 6、CSS選擇器有哪些?哪些屬性可以繼承?
- 7、移動端分辨率適配
- 8、PC常見兼容問題
- 9、display:none和visibility:hidden的區別
- 10、瀏覽器中的回流和重繪是什么,分別在什么情況下觸發
- 11、分析代碼結果
- 12、px、em、rem的區別
- 13、清除浮動的方式有哪些,比較好的是哪種
- 14、簡述 readyonly 與 disabled 的區別
- 15、有下面這樣一段 HTML 結構,使用 css 實現這樣的效果
- 16、你做的頁面在哪些流覽器測試過?這些瀏覽器的內核分別是什么?
- 17、為什么要初始化樣式
- 18、Doctype 的作用?嚴格模式與混雜模式的區別?
- 19、瀏覽器的內核分別是什么?經常遇到的瀏覽器的兼容性有哪些?原因,解決 方法是什么,常用 hack 的技巧 ?
- 20、哪些 css 屬性可以繼承
- 21、css 優先級算法如何計算?
- 22、CSS3 有哪些新特性?
- 23、html5 有哪些新特性、移除了那些元素?如何處理 HTML5 新標簽的瀏覽器兼 容問題?如何區分 HTML 和 HTML5?
- 24、CSS3 新增偽類有那些?
- 25、rgba()和opacity的透明效果有什么區別
- 26、知道css有個content屬性嗎?有什么用?有什么應用?
- 27、頁面導入樣式時,使用link和@import有什么區別
- 28、介紹以下你對瀏覽器內核的理解
- 29、CSS3新增的特性
- 30、解釋css sprites,如何使用?
- 31、用純css創建一個三角形的原理是什么?
- 32、一個滿屏品字布局如何設計
- 33、CSS屬性overflow屬性定義溢出元素內容區的內容會如何處理
- 34、請解釋一下CSS3的flexbox(彈性盒布局模型),以及適用場景
- 35、瀏覽器是怎樣解析CSS選擇器的
- 36、PC常見兼容問題匯總
- JS
- 1、getAttribute
- css
- 1、IE6雙倍邊距bug
- 2、IE6中圖片鏈接的下方有間隙
- 3、IE6下空元素的高度BUG
- 4、不同瀏覽器的標簽默認的margin和padding不一樣
- 5、漸進識別的方式
- 37、絕對定位和相對定位區別
- 38、position跟display、overflow、float這些特性相互疊加后會怎么樣?
- 39、上下margin重合的問題
- 40、設置元素浮動后,該元素的display值是多少
- 41、::before 和 :after中雙冒號和單冒號有什么區別?解釋一下這2個偽元素的作用
- 42、 li與li之間有看不見的空白間隔是什么原因引起的?有什么解決辦法?
- 43、實現三欄布局
- 44、rem原理
- JavaScript1.0
- 1、簡述同步和異步的區別
- javascript異步的幾種實現方式
- 2、怎樣添加、移除、復制、創建、查找節點
- 3、實現一個函數clone
- 4、數組去重
- 5、在JavaScript中什么是偽數組?如何將偽數組轉化為標準數組
- 6、JavaScript中callee和caller的作用
- 7、簡述cookie、sessionStorage、localStorage的區別
- 8、jQuery的事件委托on、live、delegate之間有什么區別
- 9、如何理解閉包,有何作用,使用場景
- 10、跨域請求資源的方式有哪些
- 11、談談垃圾回收機制
- 12、描述一次完整的http請求過程
- 13、http狀態碼有哪些
- 14、如何優化圖像,圖像格式的區別
- 15、瀏覽器是如何渲染頁面的
- 16、寫一個function,清除字符串前后的空格
- 17、正則
- 驗證郵箱
- 按照規則編寫正則
- 《正則》寫出正確的正則表達式匹配固話號,區號 3-4 位,第一位為 0,中 橫線,7-8 位數字,中橫線,3-4 位分機號格式的固話號
- 最短 6 位數,最長 20 位,阿拉伯數和英文字母 (不區分大小寫)組成
- 18、改變this的方式有哪些,實現一個bind
- 19、移動端點擊事件延遲300ms,原因是什么,如何解決
- 20、運行題 ※
- 21、選擇題 ※
- 22、封裝一個函數,參數是定時器的時間,.then執行回調函數
- 23、請盡可能詳盡的解釋ajax的工作原理,以及跨域
- 24、alert(undefined == null)彈出什么
- 25、typeof和instanceof相同點與不同點
- 26、JavaScript中如何檢測一個變量是String類型,寫出具體實現函數
- 27、JavaScript實現二分法查找
- 28、"aaaasdserdsfssa"中出現次數最多的字符及個數
- 29、談談你所了解的Web攻擊技術
- 30、描述DOM事件代理(委托)的原理
- 31、使用代碼實現,原型繼承
- 32、寫出五個以上常用JavaScript modules(庫或包)
- 33、思考中獎概率問題如何用代碼實現,A中獎概率10%,B中獎概率20%,C中獎概率30%
- 34、JS的繼承相關
- 35、如何解決回調地獄
- 36、移動端常見問題
- 37、IOS和安卓常見兼容問題
- 38、一個長度不超5位的正整數轉換成對應的中文字符串,例如:20876 返回 “兩萬零八百七十六”(JS編寫)
- 39、第一個人10歲,第二個比第一個大2歲,依次遞推,請用遞歸編寫一個方法,可以計算出第8個人多大?(JS編寫)
- 40、JavaScript獲取網頁傳輸過來的參數name和sex的值(http://www.wyunfei.com?name=小四&sex=男)
- 41、Common、AMD、CMD的區別
- 42、正則,把一個字符串轉為駝峰
- 43、call、apply、bind方法的作用分別是什么?有什么區別?
- 44、JavaScript數據類型
- 45、線程與進程的區別
- 46、哪些常見操作會造成內存泄漏
- 47、你知道哪些項目優化方法
- 48、json的了解
- 49、new操作符具體干了什么
- 50、null和undefined的區別
- 51、eval是做什么的
- 52、構造函數Fn原型對象、實例對象、三者之間的區別
- 53、瀏覽器的同源策略
- 54、JavaScript 是一門什么樣的語言,它有哪些特點
- 55、編程算法題※
- 56、window.location.search() 返回的是什么
- 57、window.location.reload() 作用
- 58、例舉 3 種強制類型轉換和 2 種隱式類型轉換
- 59、列舉瀏覽器對象模型 BOM 里常用的至少 4 個對象,并列舉 window 對象的常 用方法至少 5 個
- 60、簡述創建函數的幾種方式
- 61、iframe 的優缺點
- 62、請你談談 Cookie 的弊端
- 63、哪些操作會造成內存泄漏
- 64、事件委托是什么
- 65、解釋 jsonp 的原理,以及為什么不是真正的 ajax
- 66、為什么不能定義 1px 左右的 div 容器
- 67、bind(), live(), delegate()的區別
- 68、你如何優化自己的代碼
- 69、請盡可能詳盡的解釋 ajax 的工作原理
- 70、什么是三元表達式?“三元”表示什么意思?
- 71、JavaScript 的循環語句有哪些
- 72、列出 3 條以上 ff 和 IE 的腳本兼容問題
- 73、寫一個函數可以計算 sum(5,0,-5);輸出 0; sum(1,2,3,4);輸出 10;
- 74、JQuery 一個對象可以同時綁定多個事件,這是如何實現的?
- 75、原生 JS 的 window.onload 與 Jquery 的$(document).ready(function(){}) 有什么不同?如何用原生 JS 實現 Jq 的 ready 方法?
- 76、請實現如下功能
- 77、eval 是做什么的?
- 78、javascript 代碼中的"use strict";是什么意思 ? 使用它區別是什么?
- 79、如何判斷一個對象是否屬于某個類?
- 80、new 操作符具體干了什么呢
- 81、視差滾動效果
- 82、談談模塊化開發
- 83、如何合并兩個對象
- 84、頁面初始化的時候,需要連續調用多個接口,該怎么辦?
- 85、深拷貝淺拷貝
- 86、什么是防抖和節流?有什么區別?如何實現?
- 87、函數柯里化
- 88、作用域鏈
- 89、原型鏈的繼承機制
- 90、$(window).load和$(window).ready的區別
- 91、微任務和宏任務
- 92、EventLoop
- 93、原型
- 94、JS單線程該多線程
- 95、this指向
- ECMAScript6
- 1、var、let、const區別
- 2、解構賦值
- 3、Promise 詳解
- 瀏覽器
- 輸入url敲回車發生了什么
- 瀏覽器渲染機制、渲染引擎及JS引擎
- 瀏覽器緩存機制
- 兼容問題 - PC
- ajax
- 1、Ajax 是什么? 如何創建一個 Ajax?
- 2、同步和異步的區別?
- 3、如何解決跨域問題?
- 4、頁面編碼和被請求的資源編碼如果不一致如何處理?
- 5、簡述 ajax 的過程
- 6、闡述一下異步加載
- 7、GET 和 POST 的區別,何時使用 POST?
- 8、ajax 是什么?ajax 的交互模型?同步和異步的區別?如何解決跨域問題?
- 9、Ajax 的最大的特點是什么
- 10、ajax 的缺點
- 11、ajax 請求的時候 get 和 post 方式的區別
- 12、解釋 jsonp 的原理,以及為什么不是真正的 ajax
- 13、什么是 Ajax 和 JSON,它們的優缺點
- 14、http 常見的狀態碼有那些?分別代表是什么意思?
- 15、axios
- Vue
- 1、對MVC 、MVVM、MVP的理解
- 2、v-if、v-show區別
- 3、組件通信
- 4、組件生命周期
- 5、分別簡述computed和watch的使用場景
- 6、項目構建中,如何提取公共資源
- 7、簡述Vuex工作流程
- 8、Vue-router傳參及區別
- 9、v-on可以監聽多個方法嗎
- 10、$nextTick的使用
- 11、vue組件中data為什么必須是一個函數
- 12、vue事件對象的使用
- 13、vue-router響應路由參數的變化
- 14、vue-router導航守衛(鉤子函數)
- 15、vue-router傳參
- 16、vue-router的兩種模式
- 17、vue-router路由模式為history,導致的問題
- 18、keep-alive組件的作用
- 19、漸進式框架的理解
- 20、詳述虛擬DOM中的diff算法
- 21、Vue中雙向數據綁定是如何實現的
- 22、Vuex中如何異步修改狀態
- 23、單頁面應用和多頁面應用區別及優缺點
- 24、vue中過濾器有什么作用
- 25、v-if和v-for的優先級
- 26、vue中key值得作用
- 27、vue提供了幾種腳手架模板
- 28、assets和static的區別
- 29、常見的幾種MVVM的實現方式
- 30、組件樣式屬性 scoped 問題及解決方法
- 31、列舉常用的指令
- 32、vue常用的修飾符
- 33、vue事件中如何使用event對象?
- 34、數組更新檢測
- 35、對象更新檢測
- 36、自定義指令詳解
- 37、自定義過濾器詳解
- 38、$route和$router的區別
- 39、Vue兩個核心點
- 40、Vue計算屬性computed
- 41、computed和methods區別
- 42、watch監聽詳解
- 43、computed和watch區別
- 44、vue和jQuery的區別
- 45、組件第一次加載會觸發那幾個鉤子(生命周期函數)
- 46、vue-loader是什么?用途有哪些?
- 47、Vuex中actions和mutations的區別
- 48、v-model是什么
- 49、ajax請求應該寫在組件的created中還是vuex的actions中
- 50、vue.cli項目中src目錄每個文件夾和文件的用法
- 51、active-class 是哪個組件的屬性?嵌套路由怎么定義
- 52、vue-router 是什么?它有哪些組件
- 53、不用 vuex 會帶來什么問題
- 54、hash模式和history模式的實現
- 55、引入組件的步驟
- 56、Vue-cli打包命令是什么?打包后悔導致路徑問題,應該在哪里修改
- 57、開發中遇到的問題
- 58、三大框架的對比
- 59、簡述Vue響應式原理
- 60、跨組件雙向數據綁定
- 61、delete和Vue.delete刪除數組的區別
- 62、SPA首屏加載慢如何解決
- 63、Vue-router跳轉和location.href有什么區別
- 64、SPA改為MPA
- 65、Vue中的slot是什么
- 66、你們vue項目是打包了一個js文件,一個css文件,還是有多個文件
- 67、vue的雙向綁定的原理,和angular的對比
- 68、Vue2中注冊在router-link上事件無效解決方法
- 69、<router-link>在IE與火狐上點擊失效(路由不跳轉)問題
- 70、Vue中跨域
- 71、axios post請求問題
- 72、SPA 路由history模式上線后刷新404
- 73、Vue路由的實現原理
- 74、swiper獲取數據、css都沒有問題,但是圖片不動
- 75、Vue-router懶加載
- 76、子組件能不能修改父組件傳遞過來的數據
- 人力資源
- 1、對前端工程師你是如何理解的
- 2、你怎樣看待加班
- 3、離職原因
- 4、說說你的職業規劃
- 5、你對我們公司了解多少
- 6、你為什么選擇我們公司
- 7、你能為我們公司帶來什么
- 8、認為自己的最大的優缺點是什么
- 9、談談你對跳槽的看法
- 10、怎么理解你應聘的崗位
- 11、你找工作首要考慮的因素是什么
- 12、上家公司的組織架構
- 13、談談你對薪資的要求
- 14、你經常逛的博客及公眾號等
- 15、你的業余愛好
- 16、你有什么要問我的嗎
- 17、如果你未被我們錄用,你怎么打算
- 18、最能概括你自己的三個詞是什么
- 19、說說你對行業、技術發展趨勢的看法
- 20、就你申請的這個職位,你認為你還欠缺什么
- 21、你怎樣對待自己的失敗
- 22、什么會讓你有成就感
- 23、你和別人發生過爭執嗎?你是怎樣解決的
- 24、家庭情況介紹
- 25、你在上家單位主要負責什么
- 26、你愿意接受背景調查嗎
- 27、你朋友對你的評價
- 28、如果通過這次面試我們單位錄用了你,但工作一段時間卻發現你根本不適合這個職位,你怎么辦
- 29、在完成某項工作時,你認為領導要求的方式不是最好的,自己還有更好的方法,你應該怎么做
- 30、如果你的工作出現失誤,給本公司造成經濟損失,你認為該怎么辦
- 31、如果你做的一項工作受到上級領導的表揚,但你主管領導卻說是他做的,你該怎樣
- 32、工作中你難以和同事、上司相處,你該怎么辦
- 33、假設你在某單位工作,成績比較突出,得到領導的肯定。但同時你發現同事們越來越孤立你,你怎么看這個問題?你準備怎么辦
- 34、為什么喜歡前端?
- 35、請你自我介紹
- 36、你新到一個部門,一天一個客戶來找你解決問題,你努力想讓他滿意,可是始終達不到群眾得滿意,他投訴你們部門工作效率低,你這個時候怎么作
- 37、在工作中遇到的問題及解決方案
- 38、何時可以到崗
- 39、談談你對工作的期望與目標
- 40、你更喜歡和哪種性格的人共事
- 41、如果你是老板,最不喜歡哪種類型的員工
- 42、怎樣和上級溝通
- 43、面試中,大腦出現短路怎么辦
- 44、近期和長期的規劃是什么
- 項目實戰
- B2C商城API
- 后臺
- 用戶接口
- 管路員登錄
- 用戶列表
- 退出
- 訂單接口
- 訂單列表
- 訂單詳情
- 訂單查詢
- 分類接口
- 分類列表
- 分類添加
- 分類編輯
- 統計接口
- 產品接口
- 產品列表
- 產品搜索
- 產品上下架
- 添加商品
- 圖片上傳
- 富文本圖片上傳
- 富文本編輯器
- 商品詳情
- 產品保存&更新
- 前臺
- 產品
- 產品列表&排序
- 產品詳情
- 用戶
- 大眾點評
- 商鋪列表
- 商鋪詳情
- 添加收藏
- 收藏列表
- 刪除收藏
- 檢測是否收藏
- 登錄
- Vue
- 開發前必讀
- 主題
- 收藏
- 用戶相關
- 評論
- 消息
- 其它功能
- 公司中的那些事兒
- 工作流程
- 上線流程
- 知識點解析
- 第一節:布局
- 第二節:盒模型&BFC
- 第三節:DOM事件
- 第四節:HTTP協議
- 第五節:原型鏈
- 第六節:繼承
- 移動端
- 1、點透
- 2、1px問題
- 3、圖片在安卓上,有些設備會模糊
- 4、防止手機中頁面放大和縮小
- 5、上下拉動滾動條時卡頓、慢
- 6、iphone及ipad下輸入框默認內陰影
- 7、webkit mask兼容處理
- 8、click的300ms延遲問題
- 9、移動端和PC端有什么區別?
- 10、固定定位布局 鍵盤擋住輸入框內容
- 11、移動端是如何調試的
- hybird
- 歷屆面試真題
- 1807
- 面試題解
- webSocket
- 微信支付流程詳解及源碼 - 前端
- 微信分享流程詳解及源碼 - 前端
- 前后端協作及綜合問題
- 1、跨域
- 2、前后端交互 - 傳參
- 面向對象
- 1、普通方法
- 2、工廠方式
- 3、構造函數
- 4、原型
- 5、通過原型實現customPush方法
- 6、原型鏈
- 7、面試題
- 1、構造函數(廢棄)
- 2、原型(廢棄)
- 3、原型鏈 - 面試題鏈接
- 8、繼承 - ES5
- 9、繼承 - ES6
- 前端安全
- 1、XSS攻擊
- 2、CSRF
- 3、HTTP和HTTPs
- 后臺管理系統介紹及權限管理
- webpack
- 1、首屏加速 - CDN
- 2、首屏加速 - 懶加載
- 3、首屏加速 - 按需加載
- 4、搭建測試(test)&預發(pre)環境
- 項目中的鑒權是如何實現的?
- 前端優化
- 1、你的前端性能還能再搶救一下
- 2、解讀雅虎35條軍規(上)
- 3、解讀雅虎35條軍規(下)
- 4、你要不要看這些優化指標?
- 5、性能優化百寶箱(上)
- 6、性能優化百寶箱(下)
- 7、聊聊 DNS Prefetch
- 8、Webpack 性能優化兩三事
- 9、圖片加載優化(上)
- 10、圖片加載優化(下)
- 安卓、IOS兼容性
- 真機調試
- 隨堂筆記
- 1902B
- Vue2.0 - 課堂筆記&源碼
- 實訓
- 周考題
- 面試題
- 前端面試體系核心攻略
- 1. 前端面試的知識體系