JavaScript權威指南(2)

1、類型轉換

  1. 原始值到對象的轉換
    通過調用String()、Number()、Boolean()構造函數(shù),轉換為對應的包裝對象。nullundefined沒有包裝對象,所以在期望是對象的地方不會執(zhí)行正常的隱式轉換,拋出異常。
  2. 顯式類型轉換和隱式類型轉換
    顯式類型:使用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ù)字。
  1. 對象轉換為原始值
    所有對象到布爾值的轉換均為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展。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • ??引用類型的值(對象)是引用類型的一個實例。 ??在 ECMAscript 中,引用類型是一種數(shù)據(jù)結構,用于將數(shù)...
    霜天曉閱讀 1,221評論 0 1
  • 函數(shù)和對象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句,而且...
    道無虛閱讀 4,961評論 0 5
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,687評論 0 4
  • 昨晚的瘦身課做了一些調整。 首先放棄了以前的金剛坐呼吸,選用了死蟲子呼吸,然后以地面動態(tài)扭轉作為練習前的熱身。 前...
    渦孩緹閱讀 299評論 0 0
  • 昨天下午傍晚時分,我和小米去了廣場上玩耍。我?guī)Я藭?,小米帶了他的“槍支彈藥”,隨后各自尋了地方。 快天黑時,在椅子...
    小米嬸嬸閱讀 462評論 0 3

友情鏈接更多精彩內容