1、類型轉換
-
原始值到對象的轉換
通過調用String()、Number()、Boolean()構造函數(shù),轉換為對應的包裝對象。null和undefined沒有包裝對象,所以在期望是對象的地方不會執(zhí)行正常的隱式轉換,拋出異常。 -
顯式類型轉換和隱式類型轉換
顯式類型:使用String()、Number()、Boolean()或Object()函數(shù)作為類型轉換函數(shù);類似于其他語言中的強制類型轉換。
Number("3") //=> 3
String(false) //=> "false"或使用false.toString(),除了null和undefined之外的任何值都有toString()方法
Boolean([]) //=>true (除了假值,其他任何值都是真值)
Object(3) //=>new Number(3)
Object(null) //=>返回一個新創(chuàng)建的空對象,不會像隱式轉換那樣報錯,undefined同樣如此
隱式類型:某些運算符會做隱式的類型轉換。比如,
- 若二元“+”運算符的一個操作數(shù)是字符串,它將會把另一個操作數(shù)轉換為字符串;
- 一元“+”運算符將其操作數(shù)轉換為數(shù)字;
- 一元“!”運算符將其操作數(shù)轉換為布爾值再取反。
- 比較遠算符和“==”也會對不同情況進行相應的類型 轉換,比較運算符偏愛數(shù)字,只要其中一個操作數(shù)為數(shù)字,則將另一個操作數(shù)轉換為數(shù)字。
-
對象轉換為原始值
所有對象到布爾值的轉換均為true。
對象到字符串和數(shù)字則通過待轉換對象的一個方法來完成。
所有的對象繼承了toString()和valueOf()方法。通過使用toString()和valueOf()方法完成對象到字符串和對象到數(shù)字的轉換。根據(jù)自己的理解總結如下:
普通的對象的toString()方法將返回對象的類屬性(是一個字符串,用于表示對象的類型信息);
eg. ({x:1,y:2}).toString() //=>"[object Object]"但是很多類重新定義了toString()方法:
1> 數(shù)組類的toString()方法將每個數(shù)組元素轉換為一個字符串,并在元素之間添加逗號合并成結果字符串;
2> 函數(shù)類的toString()方法返回這個函數(shù)的實現(xiàn)定義的表示方式(即js源代碼字符串);
3> 日期類返回一個可讀的日期和時間字符串;
4> RegExp類將RegExp對象轉換為表示正則表達式直接量的字符串;
各示例如下:
[1,2,3].toString() //=>"1,2,3"
(function(x) { f(x); }).toString() //=> "function(x) {\n f(x);\n}"
/\d+\g.toString() //=>"/\\d+/g"
new Date().toString() //=>"Tue Apr 25 2017 17:40:05 GMT+0800 (中國標準時間)"
- 默認的valueOf()方法簡單地返回對象本身。數(shù)組、函數(shù)和正則表達式簡單地繼承了這個默認方法。日期類定義的valueOf()方法返回它的一個內部表示:1970年1月1日以來的毫秒數(shù)。
當運算符“+”、“==”、“!=”和關系運算符其中一個操作數(shù)是對象時,JavaScript將隱式轉換對象到原始值。
2、變量聲明
- 使用var重復聲明變量合法,如果帶有初始化量相當于一條簡單的賦值語句;
- 在函數(shù)體內,局部變量的優(yōu)先級高于同名的全局變量;
- JavaScript會將變量聲明提前,只有在程序執(zhí)行到var語句的時候,局部變量才會被真正的賦值;見如下示例:
function f(){
console.log(scope); //=>"undefined"
var scope="local";
console.log(scope); //=>"local"
}
- 當使用var聲明一個變量時,創(chuàng)建的這個屬性時不可配置的,也就是說這個變量無法通過delete運算符刪除;
3、作用域鏈
當JavaScript需要查找變量x的時候(這個過程叫做“變量解析”),它會從作用域鏈中的第一個對象開始查找,若第一個對象中不存在名為x的屬性,則會繼續(xù)查找鏈上的下一個對象。若作用域鏈上沒有任何一個對象含有屬性x,則拋出異常(ReferenceError)。
例如,在不包含嵌套的函數(shù)體內,作用域上有兩個對象,第一個是定義函數(shù)參數(shù)和局部變量的對象,第二個是全局變量??梢岳斫鉃閺淖顑葘油鈹U展。