2018-03-06 JavaScript紅寶書學習筆記

第一章

defer屬性的作用
<script type="text/javascript" defer="defer" src="xxx.js"><script>

相當于告訴瀏覽器立即下載,但延遲執(zhí)行

async屬性的作用

與defer類似,只是標記為async的腳本不保證按照指定它們的先后順序執(zhí)行

</script>字符串問題

在使用<script>嵌入JavaScript代碼時,記住不要在代碼中的任何地方出現(xiàn)"</script>"字符串。例如下面一個錯誤:

<script type="text/javascript">
  function sayScript() {
    alert("</script>");
  }
src屬性

需要注意的是,帶有src屬性的<script>元素如果包含了嵌入的代碼,則只會下載并執(zhí)行腳本文件,潛入的代碼會被忽略,比如:

<script src="xxx.js" type="text/javascript">
  alert("hello") // 這句不會被執(zhí)行
</script>

數(shù)據(jù)類型

ECMAScript中規(guī)定了五種簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型)和一種復雜數(shù)據(jù)類型:

  • 簡單數(shù)據(jù)類型
    • Undefined
    • Null
    • Boolean
    • Number
    • String
  • 復雜數(shù)據(jù)類型
    • Object
typeof操作

typeof是一個操作符而不是函數(shù),但也可以加圓括號使用

var message = "something"
alert(typeof message); // "string"
alert(typeof(message)); // "string"
alert(typeof 95); // "number

typeof返回的可能值有:

  • "number"
  • "string"
  • "boolean"
  • "undefined"
  • "object" (null也返回"object")
  • "function" (從技術(shù)角度講,函數(shù)在ECMAScript中是對象,然而由于特殊性,因此通過typeof來區(qū)分函數(shù)和其他對象是有必要的)

對尚未初始化的變量和未聲明的變量執(zhí)行typeof操作都會返回undefined:

var message;
// 下面這個變量并未聲明
// var age

alert(typeof message); // "undefined"
alert(typeof age); // "undefined"

對尚未聲明的變量,只能執(zhí)行一項操作,即typeof,其他操作將導致報錯。
undefined值是派生自null值的,因此ECMA-262規(guī)定對它們的相等性測試要返回true(兩個等號):

alert(null == undefined); // true

如果用三個等號則返回false:

alert(null === undefined); // false
數(shù)據(jù)的Boolean值
數(shù)據(jù)類型 true false
String 任何非空字符串 ""(空字符串)
Number 任何非零數(shù)值(包括無窮大) 0和NaN
Object 任何對象 null
Undefined undefined

ECMAScript中所有類型的值都有與Boolean值等價的值

Number

八進制用前置0代表,十六進制用前置0x代表,如果前置了0,但是數(shù)值超過八進制,則前置0被忽略,最終按十進制表示。

var n1 = 070; // 八進制的56
var n2 = 079; // 無效的八進制數(shù)值--解析為79

var n3 = 0x1f; // 十六進制的31,可大寫,也可小寫

由于浮點數(shù)值需要的內(nèi)存空間是整數(shù)的兩倍,因此ECMAScript會不失時機地將浮點數(shù)值轉(zhuǎn)化為整數(shù)值。

var floatNum1 = 1.; // 小數(shù)點后面沒有數(shù)字,解析為1
var floatNum2 = 10.0; // 整數(shù),解析為10

永遠不要測試某個特定的浮點數(shù)值。

if (a + b == 0.3) { // 不要做這樣的測試!
  alert("you got 0.3");
}

任何數(shù)除以0將得到NaN,任何涉及NaN地操作都會返回NaN,NaN與任何值都不想等,包括NaN本身。
isNaN()方法可以用來檢測是否是NaN,isNaN()在接收到一個值之后,會嘗試將這個值轉(zhuǎn)換為數(shù)值,某些不是數(shù)值的值會直接轉(zhuǎn)換為數(shù)值,例如字符串“10”或Boolean值:

alert(isNaN(NaN)); // true
alert(isNaN(10)); // false
alert(isNaN("10")); // false (可以被轉(zhuǎn)換為數(shù)值10)
alert(isNaN("blue")); // true
alert(isNaN(true)); // false(可以被轉(zhuǎn)換為數(shù)值1)

盡管有點不可思議,但isNaN確實也適用于對象。在基于對象調(diào)用isNaN()時,會首先調(diào)用對象的valueOf()方法,然后確定該方法返回的值是否可以轉(zhuǎn)換為數(shù)值,如果不能,則基于這個返回值再調(diào)用toString()方法,再測試返回值。

Object

Object的每個實例都具有下列屬性和方法

  • Constructor 構(gòu)造函數(shù)
  • hasOwnProperty(propertyName): 用于檢查給定的屬性在當前實例中(而不是在實例原型中)是否存在。其中,作為參數(shù)的屬性名必須以字符串形式指定。
  • isPrototypeOf(object)
  • propertyIsEnumerable
  • toLocalString()
  • toString()
  • valueOf()
一元操作符
var s1 = "2"; 
var s2 = "z"; 
var b = false; 
var f = 1. 1; 
var o = { 
    valueOf: function() { return -1; } 
}; 
s1++; // 值 變成 數(shù)值 3 
s2++; // 值 變成 NaN 
b++; // 值 變成 數(shù)值 1 
f--; // 值 變成 0. 10000000000000009( 由于 浮點 舍入 錯誤 所致) 
o--; // 值 變成 數(shù)值- 2

一元+操作符加在變量前面,等同于Number()操作。

var s1 = "2"; 
var s2 = "z"; 
var b = false; 
var f = 1. 1; 
var o = { 
    valueOf: function() { return -1; } 
}; 

s1++; // 值 變成 數(shù)值 3 
s2++; // 值 變成 NaN 
b++; // 值 變成 數(shù)值 1 
f--; // 值 變成 0. 10000000000000009( 由于 浮點 舍入 錯誤 所致) 
o--; // 值 變成 數(shù)值- 2
o = +o; // 值變成-1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容