這篇文章主要是對阮一峯老師javascript教程中數據類型和運算的筆記,方便記憶。
有需要的朋友建議直接觀看阮一峯老師javascript教程,寫得更詳細
一:數據類型概述
1、簡介6種數據
1.1數值(number):整數和小數
1.2字符串(string):文本
1.3布爾值(boolean):表示真僞的兩個特殊值,即true(真)和false(假)
1.4undefined:表示“未定義”或不存在
1.5null:表示空值,
1.6對象(object):各種值組成的集合,分成三個子類型。
- 狹義的對象(object)
- 數組(array)
- 函數(function)
2、typeof 運算符
這個運算符測試一個值到底是什麼數據類型
重點就是
typeof null // "object"
typeof undefined // "undefined"
二、null, undefined 和布爾值
1、null, undefined轉數字化
null 轉爲數字是 0
undefined 轉爲數字是 NAN
2、null, undefined的使用場景
null表示空值。
undefined表示“未定義”,場景有4個
- 2.1變量聲明瞭,但沒有賦值
var i;
i // undefined
- 2.2調用函數時,應該提供的參數沒有提供,該參數等於 undefined
function f(x) {
return x;
}
f() // undefined
- 2.3對象沒有賦值的屬性
var o = new Object();
o.p // undefined
- 2.4函數沒有返回值時,默認返回 undefined
function f() {}
f() // undefined
3、布爾值
3.1哪些運算符會產出布爾值
- 前置邏輯運算符: ! (Not)
- 相等運算符:===,!==,==,!=
- 比較運算符:>,>=,<,<=
3.2其他數據類型轉換成布爾值
轉換規則是除了下面六個值被轉爲false,其他值都視爲true。
- undefined
- null
- false
- 0
- NaN
- ""或''(空字符串)
3.3轉換成布爾值的應用環境
大部分是用於判斷程序流程,如下面把if()裏面判斷成布爾值
if ('') {
console.log('true');
}
三、數值(該部分內容較多,我只是簡要摘取一部分)
數值組成方式
JavaScript 內部,所有數字都是以64位浮點數形式儲存。
第1位:符號位,0表示正數,1表示負數
第2位到第12位(共11位):指數部分
第13位到第64位(共52位):小數部分(即有效數字)
四、字符串
1、定義:
字符串就是零個或多個排在一起,放在單引號或雙引號之中的字符
2、字符串使用的異常場景
- 2.1 單引號字符串的內部,可以使用雙引號,不能直接使用單引號。雙引號字符串的內部,可以使用單引號,不能直接使用雙引號
'key = "value"'
- 2.2 在單引號字符串的內部,使用單引號,就必須在內部的單引號前面加上反斜槓,用來轉義
'Did she say \'Hello\'?'
// "Did she say 'Hello'?"
- 2.3字符串默認只能寫在一行內,分成多行將會報錯
'a
b
c'
// SyntaxError: Unexpected token ILLEGAL
- 2.4如果長字符串必須分成多行,可以在每一行的尾部使用反斜槓
注意,反斜槓的後面必須是換行符,而不能有其他字符(比如空格),否則會報錯。
var longString = 'Long \
long \
long \
string';
longString
// "Long long long string"
- 2.5可以用+連接多個單行字符串,將長字符串拆成多行書寫
var longString = 'Long '
+ 'long '
+ 'long '
+ 'string';
2.6 es6新增寫法
使用`包裹字符串,就可以實現換行。**
這個符號是鍵盤esc下面那個鍵**
3、字符串的使用
3.1獲取字符串的長度
var str = "hello";
console.log( str.length );
3.2通過下標獲取到字符串某個字符的值
console.log( str[0] ); //h
console.log( str[str.length - 1] ); // 0
3.3通過charaAt獲取到字符串某個字符的值
var str = "hello";
console.log( str.charAt(0) ); // h
console.log( str.charCodeAt(0) ); //輸出對應字符的ASCII碼
3.4字符串截取
注意截取後,原來的字符串不變
var str = "hello world";
var sub1 = str.substr(1, 3); // 第一個是開始位置, 第二個是長度
var sub2 = str.substring(1, 3); // 第一個是開始位置,第二個是結束位置,str[結束位置]不會被截取進去
3.5用search查找字符串內是否有對應的內容
原來的字符串不變
var str = "hello my world";
var s1 = str.search('my'); //6(開始位置) 找不到爲-1
3.6 用replace替換字符串的值
原來的字符串不變
var s2 = str.replace('my', 'your') //前面是被替換內容,後面是替換內容
3.7改變字符串大小寫
字符串操作不會修改原來的字符串
var str = "Hello";
str.toUpperCase(); //HELLO
str.toLowerCase(); //hello
3.8字符串拼接
- 兩個不同字符串相+
var str1='hello'
var str2='world'
str1+str2 //"helloworld"
- 字符串名和字符串相加
var color ='red'
var str='衣服的顏色是'+color //衣服的顏色是red
- 字符串模板
var name = '飢人谷'
var website = 'jirengu.com'
var str = `你好, 這裏是${name},${website},開啓你的前端之路`
//"你好, 這裏是飢人谷,jirengu.com,開啓你的前端之路"
五、對象
1、定義:
對象就是一組“鍵值對”(key-value)的集合,是一種無序的複合數據集合。
2、對象的組成
var obj = {
foo: 'Hello',
bar: 'World'
};
- 該對象內部包含兩個鍵值對
- foo是“鍵名”(成員的名稱),字符串Hello是“鍵值”(成員的值)
- 兩個鍵值對之間用逗號分隔
3、鍵名的定義規則
對象的每一個鍵名又稱爲“屬性”(property)
- 3.1對象的所有鍵名都是字符串,可以不用打引號
- 3.2鍵名如果是數值,會轉成字符串
var obj = {
1: 'a',
3.2: 'b',
1e2: true,
1e-2: true,
.234: true,
0xFF: true
};
- 3.3鍵名的命名滿足標識名的條件,不然就要打上引號
var obj = {
1p: 'Hello World'
};
// 不報錯
var obj = {
'1p': 'Hello World',
'h w': 'Hello World',
'p+q': 'Hello World'
};
4、鍵值的使用場景
對象的每一個鍵名又稱爲“屬性”(property),它的“鍵值”可以是任何數據類型。
- 4.1屬性的值爲函數,通常把這個屬性稱爲“方法”,它可以像函數那樣調用。
var obj = {
p: function (x) {
return 2 * x;
}
};
obj.p(1) // 2
- 4.2屬性的值還是一個對象,就形成了鏈式引用。
var o1 = {};
var o2 = { bar: 'hello' };
o1.foo = o2;
o1.foo.bar // "hello"
5、對象獲取鍵值的方式(只有兩種)
- 5.1通過對象名.屬性名來獲取屬性的值
var o1 = {};
var o2 = { bar: 'hello' };
o1.foo = o2;
**o1.foo.bar** // "hello"
- 5.2通過對象名['屬性名']來獲取屬性的值,注意中括號裏面是字符串,所以一定要加引號
o1['foo']
ol[foo]就是錯誤的,因爲瀏覽器解析時會認爲foo是一個變量,找不到這個變量就會報錯
6、對象的引用
- 如果把一個原始類型(number 字符串 等)的值賦值給變量。那變量這時都是值的拷貝。
如果把對象賦值給變量,我們只是將對象的存儲地址指向了變量。 - 如果不同的變量名指向同一個對象,那麼它們都是這個對象的引用,修改其中一個變量,會影響到其他所有變量。
var o1 = {};
var o2 = o1;
o1.a = 1;
o2.a // 1
o2.b = 2;
o1.b // 2
7、表達式還是語句?
JavaScript規定,如果行首是大括號,一律解釋爲語句(即代碼塊)。
如果要解釋爲表達式(即對象),必須在大括號前加上圓括號。
eval('{foo: 123}') // 123 這是一個語句,表示一個代碼區塊,裏面有一個標籤foo,指向表達式123。
eval('({foo: 123})') // {foo: 123} 這是一個表達式,表示一個包含foo屬性的對象
{foo:123}.foo 是錯誤的
({foo:123}).foo //輸出的是123
8、對象的使用方法
8.1 檢查變量是否聲明
原理:在瀏覽器環境,所有全局變量都是window對象的屬性。
window.a的含義就是讀取window對象的a屬性,如果該屬性不存在,就返回undefined,並不會報錯。
if ('a' in window) {
// 變量 a 聲明過
} else {
// 變量 a 未聲明
}
8.2屬性的賦值
和讀取值一樣,有兩種方法
o.p = 'abc';
o['p'] = 'abc';
8.3用Object.keys查看所有屬性
var o = {
key1: 1,
key2: 2
};
Object.keys(o);
// ['key1', 'key2']
8.4 delete刪除對象的屬性
var o = {p: 1};
Object.keys(o) // ["p"]
delete o.p // true
o.p // undefined
注意:delete命令不能刪除var命令聲明的變量,只能用來刪除屬性。因爲var聲明的全局變量都是頂層對象的屬性,而且默認不得刪除。
var p = 1;
delete p // false
delete window.p // false
8.5用for...in循環用來遍歷對象的全部屬性
var obj = {a: 1, b: 2, c: 3};
for (var i in obj) {
console.log(o[i]);
}
// 1
// 2
// 3
i就是定義了一個變量,裏面放的就是對象的屬性