【經驗】JavaScript

1.
function closeWin(){         
    window.open('','_self');   
    window.opener=null;  
//    window.open(location, '_self').close();
    window.close();      
}
這段是兼容最新瀏覽器的關閉窗口代碼,可是在chrome下以輸入網址打開的頁面沒法使用window.close(),會提示Scripts may close only the windows that were opened by it.

2.爲input元素添加屬性autocomplete="off" ,能夠阻止火狐對input元素的緩存。聽說type="hidden"的input會遇到這個問題。
3.
var a = {f:function f(){}};
console.log(a.f);//f()
console.log(f);//ReferenceError: f is not defined
4.依賴注入有兩種實現,一種以f.toString方法獲取函數字符串,這種在代碼壓縮時有缺陷,另外一種以顯式注入獲取參數。
5.angularJS的做用域與DOM的關聯是:做用域的層級由DOM的層級決定。
6.frameElement、frameDocument是非法變量名
7.HTML中的文本會包含"\n"," ","\t"等,每一個算一個字符長度,若是用console的話會被轉換,而後顯示到控制檯中。

8.(function(){}());var fn = function(){}()爲什麼不報錯而function(){}()會報錯?
先說結論與其推導:
(1)function(){}()的報錯是function statement requires a name
(2)function f(){}()的報錯是expected expression, got ')'
(3)()的報錯是expected expression, got ')'
這三個證據指明一個結論:function(){}()會被執行爲function(){};();
緣由應該是:以"function"關鍵字開頭的語句,會被視爲函數聲明


【觀點1:是{}沒有被正確理解】
http://blog.csdn.net/woshinia/article/details/18666223
function(){}() //匿名函數當即執行, 語法分析期報錯
{}.constructor //獲取對象直接量的構造器,語法分析期報錯
使人不解的是爲什麼[].constructor這麼寫卻不報錯呢,一個是想獲取對象直接量的構造器,一個是獲取數組直接量的構造器而已。
固然添加個變量接收也不會報錯
var c = {}.constructor;
var fn = function(){}(),也不會報錯。
其實是js的「語句優先」在做怪,即{}被理解成複合語句塊而不是對象直接量或聲明函數的語義。
【可是,個人測試結果並不支持這個說法,以下】
function f(){}()//Firebug報錯SyntaxError: expected expression, got ')'
function a(){};();//報錯同上
();//報錯同上,這多是括號被理解爲「表達式分組」,而不是「函數調用」。並非大括號的問題。
【我以爲緣由是是第二對()沒有被正確理解】
【可是http://www.cnblogs.com/snandy/archive/2011/03/08/1977112.html的評論裏仍是支持觀點1】

http://www.zhcexo.com/round-brackets-in-javascript/
//例3
(function () {
    //...
})();

//例4
(function () {
    //...
}());

例3實際上是強制運算圓括號中的函數,運算的結果是返回了函數自身,後面的括號就是函數的調用運算符,去調用被強制運算了的函數。
而例4,圓括號的強制運算使得函數的調用運算得以執行,而後返回的是調用結果。雖然都能讓函數調用起做用,但其實背後的原理就有這種小區別。
//例5
void function () {  
    //...
}();

//例6
~function () {
    //...
}();
void 和 ~ 都是一元運算符,它們的運算優先級都是低於最後面的括號的,可是 js 在解析的過程當中,遇到了 void 和 ~,就會把後面的匿名函數識別爲操做數,而它們的計算優先級比圓括號低,因此就發生了函數的調用,調用的結果再進行 void 和 ~ 運算,返回 undefined 和 -1。
還有-,+,!,或者2*funct...}()。恐怕都是把匿名函數視爲操做數,同理(function(){}())也應該是一樣道理。
10.javascript有get和set訪問器,不知道爲什麼從未看到過。
data = 1;
var o = {
  data : 2,
  get data(){
    console.log('獲取data數據');
    return data;
  },
  set data(value){
    console.log('設置data數據');
    data = value;
    console.log(this.data);
  }
}
o.data = 99;//data與o.data都會變成99
若是打印o,o的data屬性仍顯示1,而不是2

11.
http://www.cnblogs.com/snandy/archive/2011/03/08/1977112.html#comment_anchor_2042145

void操做符會觸發其後表達式的GetValue(也就是get訪問器)。分組運算符() 同 delete typeof 等運算符相似. 不會對運算元.形成 GetValue()。
delete 玩笑; //不會拋出異常.
緣由是運行時,執行到 delete 玩笑; 時, 並不會對標識符-玩笑,進行GetValue().

delete (玩笑);//一樣不會拋出異常.
可見分組運算符() 並無對 標識符 -玩笑 作額外的工做. 它僅僅是影響語法樹的產生過程.


以上,根據《你不知道的js》上卷P8所言,void彷佛是觸發了所謂的RHS查詢,delete觸發了LHS查詢(RHS查詢容器的值,LHS查詢容器自己)

12.FF上在setTimeout計時中執行alert(),不會阻塞計時器;在chrome和ie11上,退出alert後會繼續計時。
13.delete數組元素會用undefined填充,因此用[].splice吧
14.p不能包含div,若是p>div>img時用$('p img')會查不到元素
15. new Date(2015,0,1)的結果是1月1日。new Date(2015,0,0)的結果是2014年12月31日。
16.mouseleave和mouseenter是不會冒泡的mouseout、mouseover
17.
關於jQuery的event對象的target:
relatedTarget是指與在mouseover/enter、mouseout/leave時,鼠標將從中進入監聽事件的元素的元素、鼠標將從監聽事件的元素內進入的元素。
currentTarget綁定事件處理函數的元素。
delegateTarget是指使用jq的事件委託時,受委託的父元素。當事件綁定沒使用事件委託時,等於currentTarget。
target是指觸發事件的元素。target多是currentTarget也多是currentTarget的子元素。

關於原生event對象:

target:觸發事件的元素
currentTarget:綁定事件處理函數的元素
originalTarget:至關於target
explicitOriginalTarget:最原始的事件發生節點,有多是文本節點

18.keypress與keydown和keyup無關。它監聽字符輸入,並以charCode或keyCode返回字符的Unicode值,若是按鍵爲ctrl之類的不會觸發keypress。
19.href用"/"分割,能夠用string.split("/")分割。
20.導航欄跟隨滾動的經驗
第一次:使用fixed
發現fixed根據視口定位,這樣left就會有問題,當頁面有水平滾動時也會跟隨滾動。
第二次:使用absolute+js
元素相對body絕對定位,滾動時使用jq的offset()設定其top。
問題在於ie和chrome下導航會出現緣由不明的閃爍,並不是性能問題。
第三次:使用fixed+js
元素採起fixed,滾動時使用jq的css()設定其left。
head.css({
  left: (-1 * scrollLeft || 'auto') + 'px'
})
當無水平滾動時使用auto,當有水平滾動時相對視口往左偏移滾動的數值。
21.$(document).scroll(function...)這在IE8沒法監聽滾動事件,應該改爲$(window)
22.window.undefined是不可改變的,但函數內部能夠定義undefined
23.比較瀏覽器視口與頁面body的高度
(document.documentElement.clientHeight > document.body.clientHeight)
23.1 document.documentElement.scrollHeight === $(document).height()

24.聲明一個空數組arr,設置arr[5] = undefined;
則arr.length === 6,使用for(var i in arr){console.log(i)},會只打印5
25.在callback中寫this,好像會變成undefined
26.arguments不是數組,因此不能直接作arguments.slice()
得要Array.prototype.slice.call(arguments, 1)
27.var a;並不等同於var a = undefined;
function f(a){
  var a ;
  console.log(a)
}
f(0)//0
function f(a){
  var a = undefined ;
  console.log(a)
}
f(0)//undefined
優先執行順序爲:
var a;
a = arguments[0]
a = undefined;
27.1 那麼對於外部變量的讀取優先度又如何呢?
var data = 1;
function f(){
  var data = data;
  console.log(data)
}
f()//打印undefined。

var data = 1;
function f(data){
  var data = data;
  console.log(data)
}
f(data)//打印1。
說明外部變量的讀取,還在a = arguments[0]以前;
【也有多是,讀data時會在做用域找,結果找到內部做用域的var a了,沒能去到外部】


28.對a執行elem.click(),是不會觸發其跳轉功能的,必須給其加一個子元素,對子元素模擬點擊。
29.事件綁定中的事件對象,
e.delegateTarget是被委託的父元素
e.currentTarget是目標子元素
e.target是觸發事件的元素,即子元素或其子元素
30.JSON.parse('{"left": 1}'),注意其中必定要用雙引號,$.parseJSON也是同樣的。

31.都說for-in會遍歷全部原型鏈上的屬性,爲何對{}作遍歷不能遍歷到toString這些key?
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
Object.defineProperty()

32.深拷貝使用還原字符串的實現有限制性:
var o = {
 a: 1,
 b: 2,
 sum: function() { return a + b; }
};
var o2 = JSON.parse(JSON.stringify(o));//Object {a: 1, b: 2}
彷佛是沒法複製方法的意思

並且在繼承上有問題:
JSON.parse(JSON.stringify(new A())) instanceof A === false

33.我認爲,全部構造函數必須擁有函數名,以便於使用o.constructor查看其實例o的構造器。
34.onblur事件能夠在body上觸發(點一下body,再點一下body所處的frame以外的頁面。點網頁外面是無效的,點frame內body外的區域也是無效)。
若是寫<body onblur="">,和onclick不一樣,在input裏觸發的onblur是不會觸發這個事件處理函數的(畢竟click也點到了body,而焦點並無離開body);
34.1 使用jq的話,雖然div元素沒法觸發blur事件,可是能夠爲其中的input作blur的事件委託。
34.1.1 blur事件沒法作事件傳播,事件委託的原理是檢查
35. var a = function f(){};console.log(f)//f is not defined
f竟然會成爲私有變量
36.大括號"{"不能做爲表達式開頭
http://www.cnblogs.com/ziyunfei/archive/2012/09/16/2687589.html
{} == true//expected expression, got '=='
true == {}//無報錯
36.1 {a:2}中的大括號會被認爲是代碼塊,a:2是正確的語法,但我不明白是作什麼用
37.'0' == false; 但('0' && 9)會經過並返回9。
http://www.cnblogs.com/mofish/p/3402407.html
緣由是==的規則,若是任一值是 true,把它轉換成 1 再比較;若是任一值是 false,把它轉換成 0 再比較。
38.不管是ng或者其餘,當一個元素會被重用時,應該off掉其上相應的事件監聽
39.keypress在ff下能夠由方向鍵觸發,在IE和chrome下不行。
40.function f(a, b){a = 2, b = 2;console.log(arguments)};
f();//打印空數組
f(3);//打印[2]
f(3,3);//打印[2,2]
是說,當參數爲空時,對參數的修改不會影響到arguments對象。
41.若是函數a返回了函數引用(包括返回對象,對象具備在函數中定義的方法),那得注意a在返回時,其內部是否有廢棄數據(好比運算的中間緩存)。如有,則將之置爲null。
固然儘量地在運算中不產生廢棄數據是未雨綢繆。
另外,儘量在函數中使用匿即調封裝做用域,不讓返回的函數能訪問到沒必要要的數據。
42.只有undefined==null
43.js的date,date是從1到31。month和day都是從0開始。
44. Function是它自己的構造器
44.1 Function的原型的類型是"function",卻又不繼承自Function,其構造器直接是Object
var p = Function.__proto__
typeof p === 'function' // true 這個應該是有問題的
p instanceof Function // false
p === Object.prototype // true
45.for (var i in obj){ obj = {} }
for會暫存對初始obj的引用,改變obj變量的指向,並不會中斷遍歷
46. typeof asd 在asd未定義時不會報錯
47.使用var a = 1聲明的變量,使用delete window.a返回false,不使用var而直接賦值一個變量b = 2,這個隱式全局變量將能夠經過delete window.b刪除,結果返回true
48. Function與eval的區別
Function只能訪問全局做用域,其所處做用域的變量沒法在其中訪問到。
而eval是在當前做用域執行的。
49.變量對象(簡稱VO)不包括arguments,是一個抽象概念。活動對象(簡稱AO)是一個實體,它在函數被執行時產生,包括arguments。
變量對象的屬性應該包括指向父級活動對象的__parent__,由於這個在編譯期就能夠決定,並且全局對象中也存在__parent__(指向null)。
this不是變量對象的屬性,也不是活動對象的屬性——this與它同輩,是執行上下文的屬性。(執行上下文,包含變量對象(我認爲這裏是活動對象)、做用域鏈、this)
做用域鏈鏈接的是變量對象。
全局中貌似不存在活動對象。
50.數組裏存放undefined與默認生成undefined仍是有區別的
function keepUndefined(v){return v === undefined}
var arr1 = []; arr1[2] = 1; var arr2 = [undefined, undefined, 1];
console.log(arr1.filter(keepUndefined));// []
console.log(arr2.filter(keepUndefined));// [undefined, undefined]
// 而map比較奇怪,實際上"0" in arr1 的結果是false,它依舊會返回三個值。而實際上並無遍歷到arr1[0]和arr1[1],若是keepUndefined裏打印只會打印一次。
// arr1 = new Array(3);arr1[0] = 1;同理,結果是[false,u,u]
console.log(arr1.map(keepUndefined));// [undefined, undefined, false]
51. [0]參與運算的結果有如下幾種狀況
+[0] // 0,數字
0+[0] // "00",字符串
0-[0] // 0,數字
if([0])[] // 經過
[0] == 0 // true
[0] === 0 // false
52. 1 + - + + + - + 1 這個式子應該被理解爲1+(...1),後面的加減是正負號。
53.arguments和形參是相關聯的。
54. js裏大數和小數運算會有精確度問題
var a = 111111111111111110000,
    b = 111111;
a + b; // 111111111111111230000 千位及後面被向上捨去
55.關於valueOf和toString的優先度:
https://zhidao.baidu.com/question/1928417783204179667.html
valueOf偏向於運算,toString偏向於顯示。
一、 在進行對象轉換時(例如:alert(a)),將優先調用toString方法,如若沒有重寫toString將調用valueOf方法,若是兩方法都不沒有重寫,但按Object的toString輸出。
二、 在進行強轉字符串類型時將優先調用toString方法,強轉爲數字時優先調用valueOf。
三、 在有運算操做符的狀況下,valueOf的優先級高於toString。

document.write({toString: function(){return 1}, valueOf: function(){return 10}})  // 1 這是第一種狀況
1+{toString: function(){return 1}, valueOf: function(){return 10}} // 11 第二種狀況javascript

相關文章
相關標籤/搜索