1. 程式人生 > >JavaScript學習(一)——基礎知識查漏補缺

JavaScript學習(一)——基礎知識查漏補缺

出現 個數字 時代 編寫代碼 條件 undefined 不支持 lock convert

標簽script

我們知道,html要使用js就要使用<script>標簽。
兩種方式:
一是直接在<script>這裏</script>寫入代碼。
二是在別的文件寫好js代碼,然後script標簽的src屬性引入進來。

script其實有6個屬性(全都是可選):

  1. src:包含要執行代碼的外部文件;
  2. language:現在已廢棄;
  3. type:表示編寫代碼使用的腳本語言的內容類型;
  4. charset:指定src引入代碼的字符集;
  5. async:表示應該立即下載腳本;
  6. defer:表示腳本可以延遲到文檔完全被解析和顯示後再執行。

    type的解釋也說明了一個問題,<script></script>

    中間的代碼不必需是js代碼。如果不聲明,則默認為text/javascript,此時代碼按照js的規則解析。如果聲明了其他的不可識別的類型,則它和其中的內容會被忽略掉。
    例如:
    <script type=‘text/html‘ id="tpl"></script>
    <script type=‘text/foo-template‘ id="foo-tpl"></script>
    有些模板引擎就利用了它來實現DOM節點的模板填充。

註意:<script><script> 中間不要在任何地方出現‘</script>‘字符串

關鍵字,保留字

以前只記住了幾個關鍵字,現在還註意到了保留字,保留字就是在js當中其實沒啥用的但是就是不給用來當做命名的單詞,多為Java語言的關鍵字。

數據類型

typeof操作符,可以判斷某值的數據類型。我們都知道,一共六種。
1、undefined
2、boolean
3、string
4、number
5、function
6、object

undefined與null

undefined 指變量尚未初始化
null 指變量值為一個空對象指針
其實它們的意思和用法基本都是一致的,在js裏,我們完全可以只用undefined而不去使用null,這樣混不混淆都無所謂了。
唯一的區別:
console.log(typeof undefined)--undefined
console.log(typeof null)--object

阮一鋒的解釋:
null表示"沒有對象",即該處不應該有值。典型用法是:

(1) 作為函數的參數,表示該函數的參數不是對象。
(2) 作為對象原型鏈的終點。

Object.getPrototypeOf(Object.prototype)
// null

undefined表示"缺少值",就是此處應該有一個值,但是還沒有定義。典型用法是:
(1)變量被聲明了,但沒有賦值時,就等於undefined。
(2) 調用函數時,應該提供的參數沒有提供,該參數等於undefined。
(3)對象沒有賦值的屬性,該屬性的值為undefined。
(4)函數沒有返回值時,默認返回undefined。

var i;
i // undefined

function f(x){console.log(x)}
f() // undefined

var  o = new Object();
o.p // undefined

var x = f();
x // undefined

number

轉換數值的三個方法:

Number(),parseInt(),pasreFloat()

Number()功能比較強大,規則如下:
true:1
false:0
null:0
undefined:NaN
"":0
"011":11(忽略前面的0)
"011.1":11.1(忽略前面的0)
"0x11":17(0x開頭十六進制)
"別的格式的字符":NaN

parseInt()規則如下:
僅轉換字符串,其他非數字類型統一返回NaN
"":NaN
"011":11(忽略前面的0)
"011.1":11(忽略前面的0)
"0x11":17
"123abc":123
"abc123":NaN

parseFloat()規則如下:
僅轉換字符串,其他非數字類型統一返回NaN
"":NaN
"011":11(忽略前面的0)
"011.1":11(忽略前面的0)
"0x11":0(忽略前面的0)
"123abc":123
"abc123":NaN

整數還可以通過二進制,八進制,十六進制來表示。
其中,八進制字面值的第一位必須是0
十六進制字面值的前兩位必須是0x

我們從字符串轉過來的時候如果有要求則要再傳一位進制數:
parseInt("011",2):3
parseInt("011",8):9
parseInt("011",16):17
parseInt("0xaa",16):170
parseInt("aa",16):170

註意:程序在計算的時候0開頭的數字會被解析為八進制,0x開頭的數字會被解析為十六進制。最終結果為十進制。因此,我們做計算的時候最好不要用帶0開頭的數字進行計算,避免讓別人看迷糊

等號

一個等號:賦值
兩個等號:判斷相等
三個等號:判斷全等

一、賦值問題
在echarts.js源碼中看到了一句:

var ecModel = this._model = new GlobalModel(null, null, theme$$1, optionManager);

其中連續賦值了兩次,後來查閱資料,發現執行過程是這樣的:

1、var ecModel =new GlobalModel(null, null, theme$$1, optionManager);
2、this._model = new GlobalModel(null, null, theme$$1, optionManager);

連續多個賦值操作,可從左到右拆分成每個變量直接等於最後的值,而不會執行像var ecModel = this._model這樣的語句。

其實不推薦這樣寫,這種寫法能避開就避開唄。

二、關於 ==

== 和 != 會先轉換再比較

比較規則:
1、一個布爾值,一個數字 true:1,false:0
2、一個字符串,一個數字 先轉成數字
3、一個對象,一個數字 先調用對象的valueOf()再按前面的規則
4、兩個對象 比較是否同一個對象
例: var a={},b={}; console.log(a==b);//false
5、null==undefined true
6、NaN==NaN false

label 語句

label語句可以在代碼中添加標簽,以便將來使用。一般與循環語句的break和continue配合使用。
舉個例子:
我有一個嵌套循環,當滿足條件的時候執行語句並跳出外層循環。
var num=0;
firstfor:
for(var i=0;i<10;i++){
    secondfor:
    for(var j=0;j<10;j++){
        if(i==5 && j==5){
          break firstfor;//跳出第一個for循環
        }
        num++;
    }
}
alert(num); //num=55

重載

js沒有重載!

重載只在java裏只說過,js沒聽說過。

然而百度到的全都是js實現重載的方法。

我的疑問(等待回答):

既然js都不支持重載了,為什麽還要特意去模仿實現重載呢?

JavaScript學習(一)——基礎知識查漏補缺