1. 程式人生 > 實用技巧 >20 資料型別、運算子、隱式轉換

20 資料型別、運算子、隱式轉換

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

分類

  1. 整型資料 正整數 負整數 0

  2. 浮點型 小數點後至少有一位不為0的數字

  3. 特殊值:

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

注意

  1. js中沒有分數 所有分數都會轉換成小數

  2. 由於計算機儲存精度的問題,導致小數計算不準確 避免使用小數計算

NaN的特性

  1. typeof檢驗以後 返回結果是number

  2. NaN和任何數值都不相等 包括自身

  3. 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格式的資料

  1. 宣告物件

宣告空物件: var 變數 = {};

var obj = {};
console.log(obj);
console.log(typeof obj); // object
  1. 宣告物件 儲存資料: var 變數 = {屬性名: 屬性值, 屬性名1: 屬性值1, ...};

var obj1 = {
   'name': '彭于晏',
   'height': 188,
   'age': 33
};
console.log(obj1);
  1. 從物件中取值: 物件.屬性名 物件['屬性名']

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 函式檢驗資料型別的時候 只加函式名

陣列的應用

  1. 當圖片的名稱沒有任何規律的時候, 用陣列來儲存圖片的地址

  2. 在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

運算子

分類

  1. 算術運算子: + - * / % ++(自加) --(自減)

  2. 賦值運算子: = += -= *= /= %=

  3. 比較運算子: > >= < <= ==(相等) ===(全等) !=(不等) !==(不全等)

  4. 邏輯運算子: &&(與) ||(或) !(非 取反)

  5. 三目運算子: 條件 ? 條件為真, 執行的程式碼 : 條件為假, 執行的程式碼;

算術運算子

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 

隱式轉換

  1. 數值之間正常計算;

  2. 如果有字串的加法, 會進行字串拼接;

  3. 如果沒有字串的加法, 儘可能將資料都轉換成數值之後進行計算, 其他運算子也是如此; Number

  4. 如果有物件或者陣列,先呼叫自身的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']));