因爲字符串、對象和數組沒有固定大小,全部當他們的大小已知時,才能對他們進行動態的存儲分配。JavaScript程序每次建立字符串、數組或對象時,解釋器都必須分配內存來存儲那個實體。只要像這樣動態地分配了內存,最終都要釋放這些內存以便他們可以被再用,不然,JavaScript的解釋器將會消耗完系統中全部可用的內存,形成系統崩潰。 如今各大瀏覽器一般用採用的垃圾回收有兩種方法:標記清除、引用計數。javascript
可是用這種方法存在着一個問題,下面來看看代碼:vue
function problem() {
var objA = new Object();
var objB = new Object();
objA.someOtherObject = objB;
objB.anotherObject = objA;
}
複製代碼
在這個例子中,objA和objB經過各自的屬性相互引用;也就是說這兩個對象的引用次數都是2。在採用引用計數的策略中,因爲函數執行以後,這兩個對象都離開了做用域,函數執行完成以後,objA和objB還將會繼續存在,由於他們的引用次數永遠不會是0。這樣的相互引用若是說很大量的存在就會致使大量的內存泄露。java
雖然有垃圾回收機制可是咱們編寫代碼操做不當仍是會形成內存泄漏。數組
Cookie
數量和長度的限制。每一個domain最多隻能有20條cookie,每一個cookie長度不能超過4KB,不然會被截掉var a = [1,2,3,4,5];
var b = a;
var c = a[0];
alert(b);//1,2,3,4,5
alert(c);//1
//改變數值
b[4] = 6;
c = 7;
alert(a[4]);//6
alert(a[0]);//1
複製代碼
JS 中的淺拷貝與深拷貝,只是針對複雜數據類型(Object,Array)的複製問題。淺拷貝與深拷貝均可以實如今已有對象上再生出一份的做用。可是對象的實例是存儲在堆內存中而後經過一個引用值去操做對象,由此拷貝的時候就存在兩種狀況了:拷貝引用和拷貝實例,這也是淺拷貝和深拷貝的區別。瀏覽器
深複製和淺複製最根本的區別在因而否是真正獲取了一個對象的複製實體,而不是引用安全
var a = {
key1:"11111"
}
function Copy(p) {
var c = {};
for (var i in p) {
  c[i] = p[i];
}
return c;
}
a.key2 = ['小輝','小輝'];
var b = Copy(a);
b.key3 = '33333';
alert(b.key1); //1111111
alert(b.key3); //33333
alert(a.key3); //undefined
b.key2.push("大輝");
alert(b.key2); //小輝,小輝,大輝
alert(a.key2); //小輝,小輝,大輝
複製代碼
緣由是key1的值屬於基本類型,因此拷貝的時候傳遞的就是該數據段;可是key2的值是堆內存中的對象,因此key2在拷貝的時候傳遞的是指向key2對象的地址,不管複製多少個key2,其值始終是指向父對象的key2對象的內存空間。bash
function Copy(p, c) {
var c = c || {};
for (var i in p) {
if (typeof p[i] === 'object') {
c[i] = (p[i].constructor === Array) ? [] : {};
Copy(p[i], c[i]);
} else {
c[i] = p[i];
}
}
return c;
}
a.key2 = ['小輝','小輝'];
var b={};
b = Copy(a,b);
b.key2.push("大輝");
alert(b.key2); //小輝,小輝,大輝
alert(a.key2); //小輝,小輝
複製代碼
來源https://blog.csdn.net/daimomo000/article/details/72897035服務器
Function.prototype.bind2 = function (context) {
if (typeof this !== "function") {
throw new Error("Function.prototype.bind - what is trying to be bound is not callable");
}
var self = this;
var args = Array.prototype.slice.call(arguments, 1);
var fNOP = function () {};
var fbound = function () {
self.apply(this instanceof self ? this : context, args.concat(Array.prototype.slice.call(arguments)));
}
fNOP.prototype = this.prototype;
fbound.prototype = new fNOP();
return fbound;
}
複製代碼
對象和布爾值進行比較時,對象先轉換爲字符串,而後再轉換爲數字,布爾值直接轉換爲數字cookie
[] == true; //false []轉換爲字符串'',而後轉換爲數字0,true轉換爲數字1,因此爲false
複製代碼
對象和字符串進行比較時,對象轉換爲字符串,而後二者進行比較。session
[1,2,3] == '1,2,3' // true [1,2,3]轉化爲'1,2,3',而後和'1,2,3', so結果爲true;
複製代碼
對象和數字進行比較時,對象先轉換爲字符串,而後轉換爲數字,再和數字進行比較。
[1] == 1; // true `對象先轉換爲字符串再轉換爲數字,兩者再比較 [1] => '1' => 1 因此結果爲true
複製代碼
字符串和數字進行比較時,字符串轉換成數字,兩者再比較。
'1' == 1 // true
複製代碼
字符串和布爾值進行比較時,兩者所有轉換成數值再比較。
'1' == true; // true
複製代碼
布爾值和數字進行比較時,布爾轉換爲數字,兩者比較。
true == 1 // true
複製代碼
任意兩種類型比較時,若是不是同一個類型比較的話,則按如圖方式進行相應類型轉換,如對象和布爾比較的話,對象 => 字符串 => 數值 布爾值 => 數值。
在HTML與CSS的標準化未完成以前,各個瀏覽器對於HTML和CSS的解析有各自不一樣的實現,而有不少舊的網頁都是按照這些非標準的實現去設計的。在HTML與CSS標準肯定以後,瀏覽器一方面要按照標準去實現對HTML與CSS的支持,另外一方面又要保證對非標準的舊網頁設計的後向兼容性。所以,現代的瀏覽器通常都有兩種渲染模式:標準模式和怪異模式。在標準模式下,瀏覽器按照HTML與CSS標準對文檔進行解析和渲染;而在怪異模式下,瀏覽器則按照舊有的非標準的實現方式對文檔進行解析和渲染。
定義函數有兩種方式:函數聲明和函數表達式。
函數聲明
function functionName(arg0,arg1){
//函數體
}
複製代碼
函數表達式
a();
function a(){alert("a");}
//a
複製代碼
function fn(x){
return function(y){
return x*y
}
}
複製代碼
__proto__ = constructor.prototype
複製代碼
只有函數纔有prototype屬性而且能夠訪問到,可是對象實例不具備該屬性,只有一個內部的不可訪問的__proto__屬性。__proto__是對象中一個指向相關原型的神祕連接。按照標準,__proto__是不對外公開的,也就是說是個私有屬性,可是Firefox的引擎將他暴露了出來成爲了一個共有的屬性,咱們能夠對外訪問和設置。
每建立一個函數都會有一個prototype屬性,這個屬性是一個指針,指向一個對象(經過該構造函數建立實例對象的原型對象)。原型對象是包含特定類型的全部實例共享的屬性和方法。原型對象的好處是,可讓全部實例對象共享它所包含的屬性和方法。(原型對象屬於普通對象。Function.prototype是個例外,它是原型對象,卻又是函數對象,做爲一個函數對象,它又沒有prototype屬性。)
在JavaScript 中,每一個對象都有一個指向它的原型(prototype)對象的內部連接。這個原型對象又有本身的原型,直到某個對象的原型爲 null 爲止(也就是再也不有原型指向),組成這條鏈的最後一環。這種一級一級的鏈結構就稱爲原型鏈(當試圖訪問一個對象的屬性時,它不只僅在該對象上搜尋,還會搜尋該對象的原型,以及該對象的原型的原型,依此層層向上搜索,直到找到一個名字匹配的屬性或到達原型鏈的末尾。)
原型對象(Person.prototype)是 構造函數(Person)的一個實例。
function Animal(){
this.type = "animal";
}
Animal.prototype.getType = function(){
return this.type;
}
function Dog(){
this.name = "dog";
}
Dog.prototype = new Animal();
Dog.prototype.getName = function(){
return this.name;
}
var xiaohuang = new Dog();
//原型鏈關係
xiaohuang.__proto__ === Dog.prototype
Dog.prototype.__proto__ === Animal.prototype
Animal.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null
複製代碼
(當元素在容器中被滾動超過指定的偏移值時,元素在容器內固定在指定位置。亦即若是你設置了top: 50px,那麼在sticky元素到達距離相對定位的元素頂部50px的位置時固定,再也不向上移動。)
sticky屬性生效的條件有如下兩點:
- 是元素自身在文檔流中的位置
- 一個是該元素的父容器的邊緣
複製代碼