值類型(boolean,string,number,null,undefined)node
var a = 10; var b = a; a = 20; console.log(b); //10
引用類型(對象,數組,函數)jquery
var a = {x:10} var b = a; a.x = 20; console.log(b); //20
值類型直接把值存儲在堆中,把a賦值給b在內存中是又給b開闢了一塊新的空間,存儲了一樣的值。web
引用類型分兩塊存儲,先在堆中存儲一個實際的值,再在棧中存儲一個堆中值的引用地址,指向堆中的對象。把a賦值給b是在棧中從新開闢一塊空間存儲的仍是相同對象的引用地址,a和b存儲的地址相同,指向的對象也相同。當對象值發生改變時,二者會同時改變。面試
引用類型的值通常都比較大,採用此種存儲方式能夠節省內存空間。json
typeof 'abc' //string typeof 123 //number typeof true //boolean typeof undefined //undefined typeof null //object typeof {a:10} //object typeof [1,2,3] //object typeof console.log() //function
強類型轉換:經過String(),Number(),Boolean(),parseInt()函數強制轉換數組
可能發生隱式類型轉換的場景瀏覽器
1、首先看雙等號先後有沒有NaN,若是存在NaN,一概返回false。安全
2、再看雙等號先後有沒有布爾,有布爾就將布爾轉換爲數字。(false是0,true是1)xss
3、接着看雙等號先後有沒有字符串, 有三種狀況:函數
一、對方是對象,對象使用toString()或者valueOf()進行轉換;
二、對方是數字,字符串轉數字;(前面已經舉例)
三、對方是字符串,直接比較;
四、其餘返回false
4、若是是數字,對方是對象,對象取valueOf()或者toString()進行比較, 其餘一概返回false
5、null, undefined不會進行類型轉換, 但它們倆相等
上面的轉換順序必定要牢記,面試的時候,常常會出現類型的問題。
'100'==100 //轉換成字符串 ''==0 //轉換成false undefined == null; // true 1 == true; // true 2 == true; // false 0 == false; // true 0 == ' '; // true NaN == NaN; // false [] == false; // true [] == ![]; // true
//在if中轉換成false的: null undefined '' NaN 0 false
10 && 0 //0 10轉換成true '' || 'abc' //abc ''轉換成false !window.abc //true
null:是被賦值過的對象,刻意把一個對象賦值爲null,故意表示其爲空,不該有值,因此對象爲null是正常的,typeof null 返回 'object' ,null能夠轉換爲0
undefined 表示「缺乏值」,即此處應有一個值,但尚未定義;轉爲數值時爲NaN(非數字值的特殊值) typeof undefined 返回 'undefined'
typeof 'abc' //string typeof 123 //number typeof true //boolean typeof undefined //undefined typeof null //object typeof {a:10} //object typeof [1,2,3] //object typeof console.log() //function
jquery源碼中的寫法:
除了如下方式其餘所有使用 ===
if(obj.a == null){ //至關於 obj.a === undefined || obj.a === null }
單純做爲語言來講,不考慮node和瀏覽器web
內置對象:Math,JSON
值類型何引用類型
JSON是JS中的一個內置對象
區別
//將JS對象轉換成json串 JSON.stringify({x:10}); //將json字符串轉換成json對象 JSON.parse("{'x':10}");
目的
消除Javascript語法的一些不合理、不嚴謹之處,減小一些怪異行爲;
消除代碼運行的一些不安全之處,保證代碼運行的安全;
提升編譯器效率,增長運行速度;
爲將來新版本的Javascript作好鋪墊。
特性
"use strict";
能夠選擇放在一個函數中或自定義做用域中。
禁止this指向全局對象
function f(){ return !this; } // 返回false,由於"this"指向全局對象,"!this"就是false function f(){ "use strict"; return !this; } // 返回true,由於嚴格模式下,this的值爲undefined,因此"!this"爲true。
創設eval做用域
正常模式下,Javascript語言有兩種變量做用域(scope):全局做用域和函數做用域。嚴格模式創設了第三種做用域:eval做用域。
正常模式下,eval語句的做用域,取決於它處於全局做用域,仍是處於函數做用域。嚴格模式下,eval語句自己就是一個做用域,再也不可以生成全局變量了,它所生成的變量只能用於eval內部。
"use strict"; var x = 2; console.info(eval("var x = 5; x")); // 5 console.info(x); // 2
全局變量顯式聲明
v = 1; // 報錯,v未聲明 for(i = 0; i < 2; i++) { // 報錯,i未聲明 }
禁止刪除變量
嚴格模式下沒法刪除變量。只有configurable設置爲true的對象屬性,才能被刪除。
"use strict"; var x; delete x; // 語法錯誤 var o = Object.create(null, {'x': { value: 1, configurable: true }}); delete o.x; // 刪除成功
函數不能有重名的參數
保留字
爲了向未來Javascript的新版本過渡,嚴格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。
使用這些詞做爲變量名將會報錯。
function package(protected) { // 語法錯誤 "use strict"; var implements; // 語法錯誤 }
1.沒有必須使用的應用場景
2.不容易調試,可讀性很差
3.在舊的瀏覽器中若是你使用了eval,性能會降低10倍。
4.容易xss