20 資料型別、運算子、隱式轉換
分類
基本資料型別: number string boolean null undefined
複雜/複合/引用資料型別: object array function
語法: typeof 資料
typeof(資料)
返回當前資料的型別
var a = 20;
console.log(a);
console.log(typeof a);
console.log(typeof (a));
number
分類
-
整型資料 正整數 負整數 0
-
浮點型 小數點後至少有一位不為0的數字
-
特殊值:
3.1 NaN Not a Number 不是一個數字
\1. 當計算錯誤的時候
\2. 自己宣告
3.2 進位制數 瞭解
八進位制數: 以0為開頭 並且沒有超過8的數字
十六進位制: 以0x為開頭 0-9a-f 0-15 a--10 b--11
3.3 Infinity -Infinity 正/負無窮大
3.4 10的次冪 e
注意
-
js中沒有分數 所有分數都會轉換成小數
-
由於計算機儲存精度的問題,導致小數計算不準確 避免使用小數計算
NaN的特性
-
typeof檢驗以後 返回結果是number
-
NaN和任何數值都不相等 包括自身
-
NaN和任何數值計算結果都是NaN
var a = 20;
console.log(a);
console.log(typeof a);
console.log(typeof (a));
var b = .5;
console.log(b);
console.log(typeof b);
console.log(10 - 'a');
var c = NaN;
console.log(c);
console.log(typeof c);
console.log(NaN == NaN);
console.log(NaN + 10);
var d = 070;
console.log(d);
var e = 090;
console.log(e);
var f = 0xa;
console.log(f);
var g = Infinity;
console.log(g);
var h = -1/0;
console.log(h);
var i = 1e10;
console.log(i);
console.log(1/3);
console.log(0.1 + 0.2); // 0.30000000000000004
string
概念: 成對的單引號或者雙引號中包裹的都是字串
獲取字串的長度: 字串.length
找到指定下標字元的方法: 字串.charAt(下標) 字串[下標]---ie8以上
下標: 從左往右, 從0開始的數字
var a = '123';
var b = "str";
console.log(typeof a, typeof b);
var str = '中新網1月5日電 據河北省衛健委網站訊息,2021年1月4日0—24時,河北省新增14例本地新型冠狀病毒肺炎確診病例,其中石家莊市報告11例(2例為無症狀感染者轉為確診病例),邢臺市報告3例(1例為無症狀感染者轉為確診病例)。無新增死亡病例,無新增疑似病例。\
1月4日0—24時,河北省新增30例本地無症狀感染者,均為石家莊市報告。\
截至1月4日24時,河北省現有確診病例19例(重型2例、普通型15例、輕型2例),累計治癒出院病例367例(含境外輸入34例),累計死亡病例6例,累計報告本地確診病例358例、境外輸入病例34例。尚在醫學觀察無症狀感染者40例。';
console.log(str);
// 獲取字串的長度: 字串.length
console.log(str.length); // 295
// 找到第50個字是什麼字 下標--49
// 找到指定下標字元的方法: 字串.charAt(下標) 字串[下標]---ie8以上
// 下標: 從左往右, 從0開始的數字
console.log(str.charAt(49));
console.log(str[49]);
boolean
boolean: 布林值 true(真) false(假)
場景: 1. 判斷 2. 條件的結果(比較運算子)
var t = true;
console.log(t);
console.log(typeof t); // boolean
console.log(typeof false);
// if(true){
// alert(1);
// }
console.log(NaN == NaN); // false
console.log(1 == 1); // true
null
null: 空,一個真正的空 只有一個值就是自己
做佔位 當前變數沒有值,但是後續有可能有值
var n = null;
console.log(n);
console.log(typeof n); // object
undefined
undefined: 值得空缺 本身應該有 但是沒有
只宣告變數,沒有賦值變數
var a;
console.log(a);
console.log(typeof undefined); // undefined
規定: js中規定,null和undefined相等,但是不全等
console.log(null == undefined); // true
object
萬物皆物件 一切皆物件
console.log(document);
console.log(typeof document); // object
console.log(window);
console.log(typeof window); // object
var box = document.getElementById('box');
console.log(box);
console.log(typeof box); // object
物件: json格式的資料
-
宣告物件
宣告空物件: var 變數 = {};
var obj = {}; console.log(obj); console.log(typeof obj); // object
-
宣告物件 儲存資料: var 變數 = {屬性名: 屬性值, 屬性名1: 屬性值1, ...};
var obj1 = { 'name': '彭于晏', 'height': 188, 'age': 33 }; console.log(obj1);
-
從物件中取值: 物件.屬性名 物件['屬性名']
console.log(obj1.name); console.log(obj1['name']);
array
array: 陣列 儲存不定數量不定型別的資料的容器
宣告: var 變數名 = [值1, 值2, ....];
獲取陣列的長度: 陣列.length
獲取指定的下標的值: 陣列[下標]
var arr = []; console.log(arr); console.log(typeof arr); // object var arr1 = [1, 0xa, true, false, "123str", null, undefined, document,window]; console.log(arr1); // 獲取陣列的長度: 陣列.length console.log(arr1.length); // 獲取指定的下標的值: 陣列[下標] // 下標: 從0開始的數字 console.log(arr1[4]);
function
function: 函式 用來儲存程式碼塊 在有需要的時候進行呼叫
宣告函式:
\1. 函式宣告建立函式: function 函式名(){ // 要執行的程式碼 }
\2. 呼叫函式: 函式名();
注意: 如果只宣告函式不呼叫,函式不起任何作用
function fun(){ console.log('今天是週二'); console.log('明天是週三'); console.log('還有3天放假'); } fun(); fun(); fun(); console.log(typeof fun); // function 函式檢驗資料型別的時候 只加函式名
陣列的應用
-
當圖片的名稱沒有任何規律的時候, 用陣列來儲存圖片的地址
-
在js中又不知道下標是幾 假設當前下標是從0開始
// 當圖片的名稱沒有任何規律的時候, 用陣列來儲存圖片的地址 var arr = ["./img/0987.jpg", "./img/3786.jpg", "./img/aaa.jpg", "./img/12am.jpg"]; console.log(arr); // 在js中又不知道下標是幾 假設當前下標是從0開始 var n = 0; // 想辦法將arr中的圖片地址依次從第一個賦值給img的src // 點選一次切換到第二個 img.onclick = function(){ // 怎麼樣能找到arr中第二個地址 // 通過下標 第二個--下標1 n = n + 1; console.log(n); // 通過下標拿到地址 console.log(arr[n]); // 將地址賦值給img的src img.src = arr[n]; }
資料儲存
基礎資料型別: 宣告和資料都直接儲存在棧裡面, 儲存的資料量比較小 並且資料型別比較單一
複雜資料型別: 宣告儲存在棧裡面, 資料儲存在堆裡面, 儲存的資料量比較大 資料型別比較多樣化
強制轉換
為什麼要強制轉換
由於鍵盤上輸入的都是字串 字串的+,變成了拼接
強制轉換成數值後才能計算
/* 描述: 點選等號, 獲取第一個輸入框和第二個輸入框得值,求和之後,賦值給span */ // 找元素 var inp1 = document.getElementById('inp1'); var inp2 = document.getElementById('inp2'); var btn = document.getElementById('btn'); var span = document.getElementById('span'); console.log(inp1, inp2, btn, span); // 新增事件 btn.onclick = function(){ var txt1 = inp1.value; var txt2 = inp2.value; console.log(txt1, txt2); console.log(typeof txt1); // 賦值給span span.innerHTML = txt1 + txt2; }
number
Number
Number(要轉換的資料) 將資料直接轉換成number型別
可轉換: 空字串、空格字串、純數字字串、boolean、null
console.log(Number('')); // 0 console.log(Number(' ')); // 0 console.log(Number('12')); // 12 console.log(Number('200px')); // NaN console.log(Number('a')); // NaN console.log(Number(true)); // 1 console.log(Number(false)); // 0 console.log(Number(null)); // 0 console.log(Number(undefined)); // NaN
parseInt
parseInt: parseInt(要轉換的資料, 進位制);
不寫預設按照十進位制轉換 建議寫上10
從左往右,依次轉換每一個字元,遇到不能轉換的就結束,如果第一個字元就不能轉換,返回NaN
返回整型資料
console.log(parseInt('200px', 10)); console.log(parseInt('200.5px', 10));
parseFloat
parseFloat: parseFloat(要轉換的資料)
從左往右,依次轉換每一個字元,遇到不能轉換的就結束,如果第一個字元就不能轉換,返回NaN
返回浮點型、整型資料
console.log(parseFloat('200px')); console.log(parseFloat('200.5px'));
isNaN
isNaN: isNaN(資料) 判斷一個數據 是不是 不是一個數字
判斷規則與Number一致
可轉換: 空字串、空格字串、純數字字串、boolean、null
不是數字: true
是數字: false
console.log(isNaN('')); // false console.log(isNaN(' ')); // false console.log(isNaN('200')); // false console.log(isNaN('200px')); // true console.log(isNaN('true')); // true 加了引號之後的true不是布林值 // typeof 返回的結果都是字串型別的資料 console.log(isNaN(typeof 30)); // typeof 30 ---> number --> string isNaN('string') true
string
toString
toString: 資料.toString(進位制);
進位制可傳可不傳 預設傳十進位制
將資料轉換成字串
null\undefined不能使用這個方法
屬於物件的一個方法
var n = 10; console.log(n.toString()); console.log(typeof n.toString()); // 轉換成多少進位制的字串 console.log(n.toString(2)); console.log(n.toString(8)); var t = true; console.log(t.toString()); console.log(typeof t.toString()); var obj = {}; console.log(obj.toString()); // [object Object] // var arr = [1,2,3]; var arr = [1]; console.log(arr.toString()); // "1,2,3" "1"
String
String: String(要轉換的資料)
強制轉換方法
console.log(String(null)); // console.log(null.toString()); // Cannot read property 'toString' of null console.log(String(undefined)); // console.log((undefined).toString()); // Cannot read property 'toString' of undefined
Boolean
Boolean(要轉換的資料)
js中的真真假假:
假: 0 NaN 空字串 null undefined false
真: 除了假以外都是真的
console.log(Boolean(1)); // true console.log(Boolean(0)); // false console.log(Boolean(-1)); // true console.log(Boolean(NaN)); // false console.log(Boolean('')); // false console.log(Boolean(' ')); // true console.log(Boolean(null)); // false console.log(Boolean(undefined)); // false console.log({}); console.log(Boolean({})); // true console.log([]); console.log(Boolean([])); // true
運算子
分類
-
算術運算子: + - * / % ++(自加) --(自減)
-
賦值運算子: = += -= *= /= %=
-
比較運算子: > >= < <= ==(相等) ===(全等) !=(不等) !==(不全等)
-
邏輯運算子: &&(與) ||(或) !(非 取反)
-
三目運算子: 條件 ? 條件為真, 執行的程式碼 : 條件為假, 執行的程式碼;
算術運算子
console.log(10 + 20); // 30 console.log(10 - 20); // -10 console.log(10 * 10); // 100 console.log(10 / 10); // 1 console.log(10 % 3); // 1
注意:
++ 表示自加, 可以在變數前面寫 也可以在後面寫 在自身的基礎上+1 並且賦值給自身
++在前 先自加, 然後在執行其他程式碼;++在後的時候, 先執行其他的程式碼,在自加;
--在前, 先自減, 然後在執行其他程式碼;--在後的時候, 先執行其他程式碼, 再自減;
// ++ 表示自加, 可以在變數前面寫 也可以在後面寫 在自身的基礎上+1 並且賦值給自身 var n = 10; ++n; console.log(n); // 11 n++; console.log(n); // 12 // ++在前 先自加, 然後在執行其他程式碼 var m = 10; // console.log(++m); // ++m; console.log(m); 11 // ++在後的時候, 先執行其他的程式碼,在自加 console.log(m++); // 10 // console.log(m); m++; console.log(m); // 11 // --在前, 先自減, 然後在執行其他程式碼 var mn = 10; // console.log(--mn); // 9 // --在後的時候, 先執行其他程式碼, 再自減 console.log(mn--); // 10 console.log(mn); mn--;
賦值運算子
將等號右邊的給等號左邊
var a = 20; // +=: 在自身的基礎上加一個數 a += 10; // a = a + 10; console.log(a); // 30 a *= 10; // a = a * 10; a = 30 * 10; console.log(a); // 300 a %= 10; // a = a % 10; a = 300 % 10; console.log(a); // 0
比較運算子
比較運算子: 將符號左右兩邊進行比較, 看當前條件是否成立,如果成立返回true,如果不成立返回false
==: 相等 只比較資料的值
===: 全等 比較資料的值 和 資料型別 值和資料型別都相等 返回true
!=: 不等 只比較資料的值
!==: 不全等 比較資料的值 比較資料型別 有一個不相等 返回true
console.log(1 > 1); // false console.log(1 >= 1); // 1>1 或 1==1 true console.log(1 < 1); // false console.log(1 <= 1); // true // ==: 相等 只比較資料的值 // ===: 全等 比較資料的值 和 資料型別 值和資料型別都相等 返回true console.log(1 == '1'); // true console.log(1 === '1'); // false console.log('1' === '1'); // true // !=: 不等 只比較資料的值 // !==: 不全等 比較資料的值 比較資料型別 有一個不相等 返回true console.log(1 != 2); // true console.log(1 != '1'); // false console.log(1 !== '1'); // true
邏輯運算子
邏輯運算子: 返回true和false
&&
&&: 左右兩邊各有一個條件, 如果兩邊條件都是true, 返回true, 如果有一個是false, 返回false
全真為真 一假為假
從左往右運算, 如果第一個條件為真,判斷第二個條件 如果第一個條件為假,直接結束,返回false
console.log(true && false); // false console.log(1 == 1 && true); // true console.log(1 != 1 && false); // false
||
||: 左右兩邊各有一個條件, 如果兩邊條件都是false, 返回false, 如果有一個是true, 返回true
一真為真,全假為假
從左往右運算, 如果第一個條件為假,判斷第二個條件 如果第一個條件為真,直接結束,返回true
console.log(false || true); // true console.log(2 > 3 || 4 < 5); // true console.log(1 !== '1' || true); // true
!
!: 取反 非 為真的返回 false 為假返回true
console.log(!{}); // false console.log(!NaN); // true console.log(!'a'); // false var a; console.log(!a); // true !undefined
三目運算子
三目運算子: 條件 ? 條件為真, 執行的程式碼 : 條件為假, 執行的程式碼;
// 2 > 3 ? alert(1) : alert(2); // 如果2 > 3 彈出1 否則 彈出2 1 > 2 ? alert(1) : 2 > 3 ? alert(2) : alert(3); // 有幾個?就有幾個判斷 // 判斷 1 > 2 如果 1> 2 彈出1 // 否則 判斷 2 > 3 如果 2 > 3 彈出2 否則 彈出3
隱式轉換
-
數值之間正常計算;
-
如果有字串的加法, 會進行字串拼接;
-
如果沒有字串的加法, 儘可能將資料都轉換成數值之後進行計算, 其他運算子也是如此; Number
-
如果有物件或者陣列,先呼叫自身的toString方法,轉成字串之後,再參考上述規則;
console.log(20 + 30); // 50 console.log('a' + 10); // a10 console.log('' + true); // 'true' console.log('' + undefined); // undefined console.log('1' + true); // 1true console.log(1 + true); // 1 + 1 2 console.log(true - false); // 1 - 0 1 console.log(null * undefined); // 0 * NaN NaN console.log(true / null); // 1 / 0 Infinity var n = '1'; // console.log(n++); // 1 先輸出 後自加 console.log(++n); // 2 console.log({} + 20); // [object Object]20 console.log([30] - '2'); // '30' - '2' 28 console.log([30,20] * 10); // '30,20' * 10 呼叫Number轉換 Number('30,20')-->NaN NaN*10 NaN console.log(3 > 2 + {} - ['20']); console.log(3 > (2 + {} - ['20']));