主頁 > 後端開發 > 前端知識之JavaScript

前端知識之JavaScript

2021-11-05 08:18:33 後端開發

文章目錄

    • 一. JavaScript概述
      • 1. ECMAScript和JavaScript的關系
      • 2. ECMAScript的歷史
    • 二. JavaScript2種引入方式
      • 1. Script標簽內寫代碼
      • 2. 引入額外的JS檔案
    • 三. JavaScript語言規范
      • 1. 注釋(注釋是代碼之母)
      • 2. 結束符
    • 四. JavaScript語言基礎
      • 1. 變數宣告
      • 2. 變數的命令規范
      • 3. 變數的5種基本資料型別
      • 4. ES6新增關鍵字let & const
      • 5. 使用var變數的宣告被提前到作用域頂部,賦值則保留在原地(重點)
      • 6. let和var定義變數的區別(重點)
    • 五. JavaScript資料型別
      • 1. JavaScript擁有動態型別
      • 2. 數值(Number)
      • 3. 字串(String)
        • **基本用法:**
        • **字串型別常用方法:**
      • 4. 數值和字串轉換
        • **數值轉字串:**
        • 隱式轉換[#](https://www.cnblogs.com/yang1333/articles/12892543.html#2327406825)
        • **字串轉數值:**
      • 4. 布林值(Boolean)
        • **null和undefined:**
    • 六. 運算子
      • 1. 算術運算子
      • 2. 比較運算子
      • 3. 邏輯運算子
      • 4. 賦值運算子
    • 七. 物件(Object): 陣列
      • 1. 陣列物件的常用方法:
      • 2. forEach, map, seqlice
      • 3. JS中Map和ForEach的區別
      • 4. 總結:
    • 八. 流程控制
      • 1. if判斷
      • 2. switch語法: 提前列舉好可能出現的條件和解決方式
      • 3. for回圈
      • 4. while回圈: 列印1~100
      • 5. 三元運算式
      • 6. 總結
    • 九. 函式
      • 1. 函式定義
      • 2. 函式中的arguments引數: 能夠獲取到函式接受到的所有的引數
      • 3. 函式的回傳值: 使用的也是等同于python中的關鍵字return
      • 4. 匿名函式: 就是沒有名字
      • 5. 箭頭函式: 主要用來處理簡單的業務邏輯 類似于python中的匿名函式
      • 6. 總結[#](https://www.cnblogs.com/yang1333/articles/12892543.html#1945347978)
    • 十. 函式的全域變數和區域變數
      • 1. 介紹
      • 2. 示例
    • 十一. 內置物件和方法
      • 1. 自定義物件
      • 2. Date物件
      • 3. JSON物件
      • 4. RegExp物件
      • 5. Math物件(了解)
      • 6. window物件

一. JavaScript概述

1. ECMAScript和JavaScript的關系

1996年11月,JavaScript的創造者–Netscape公司,決定將JavaScript提交給國際標準化組織ECMA,希望這門語言能夠成為國際標準,次年,ECMA發布262號標準檔案(ECMA-262)的第一版,規定了瀏覽器腳本語言的標準,并將這種語言稱為ECMAScript,這個版本就是1.0版,

該標準一開始就是針對JavaScript語言制定的,但是沒有稱其為JavaScript,有兩個方面的原因,一是商標,JavaScript本身已被Netscape注冊為商標,而是想體現這門語言的制定者是ECMA,而不是Netscape,這樣有利于保證這門語言的開發性和中立性,

因此ECMAScript和JavaScript的關系是,前者是后者的規格,后者是前者的一種實作,

2. ECMAScript的歷史

年份名稱描述
1997ECMAScript 1第一個版本
1998ECMAScript 2版本變更
1999ECMAScript 3添加正則運算式添加try/catch
ECMAScript 4沒有發布
2009ECMAScript 5添加"strict mode"嚴格模式添加JSON支持
2011ECMAScript 5.1版本變更
2015ECMAScript 6添加類和模塊
2016ECMAScript 7增加指數運算子(**)增加Array.prototype.includes

**注意:**ES6就是指ECMAScript 6,

盡管 ECMAScript 是一個重要的標準,但它并不是 JavaScript 唯一的部分,當然,也不是唯一被標準化的部分,實際上,一個完整的 JavaScript 實作是由以下 3 個不同部分組成的:

  • 核心(ECMAScript)
  • 檔案物件模型(DOM) Document object model (整合js,css,html)
  • 瀏覽器物件模型(BOM) Broswer object model(整合js和瀏覽器)

簡單地說,ECMAScript 描述了JavaScript語言本身的相關內容,

JavaScript 是腳本語言
JavaScript 是一種輕量級的編程語言,

JavaScript 是可插入 HTML 頁面的編程代碼,

JavaScript 插入 HTML 頁面后,可由所有的現代瀏覽器執行,

JavaScript 很容易學習,

二. JavaScript2種引入方式

1. Script標簽內寫代碼

<script>
  // 在這里寫你的JS代碼
</script>

2. 引入額外的JS檔案

<script src="myscript.js"></script>

三. JavaScript語言規范

1. 注釋(注釋是代碼之母)

// 這是單行注釋

/*
多行注釋1
多行注釋2
多行注釋3
*/

2. 結束符

JavaScript中的陳述句要以分號(;)為結束符,

四. JavaScript語言基礎

1. 變數宣告

宣告變數的關鍵字: var

  • 變數的初始化: var x = 2;
  • 變數的宣告: var y;
  • 變數的賦值: y = 2

2. 變數的命令規范

  • 1.必須使用字母, 下劃線, $開始
  • 2.多個英文字母, 駝峰的表示: myName
  • 3.不能使用JS中關鍵字或保留字來進行命令
  • 4.嚴格區分大小寫

3. 變數的5種基本資料型別

5種基本資料型別: number, string, boolean, undefined, null

列印資料型別: alert(宣告的變數名);

查看屬性型別: alert(typeof 宣告的變數名);

  • Number 數值型別
    • 整數, 負數, 浮點數
  • String 字串型別
    • 單引號或雙引號表示方式
  • Boolean 布爾資料型別
    • 成立回傳: true
    • 不成立回傳: false
  • undefined 未定義的變數
    • alert列印回傳值: undefined
    • alert+typeof列印資料型別回傳值: undefined
  • null 空物件
    • alert列印回傳值: null
    • alert+typeof列印資料型別回傳值: object

4. ES6新增關鍵字let & const

ES6新增了let命令,用于宣告變數,其用法類似于var,但是所宣告的變數只在let命令所在的代碼塊內有效,例如:for回圈的計數器就很適合使用let命令,

for (let i=0;i<arr.length;i++){...}

ES6新增const用來宣告常量,一旦宣告,其值就不能改變,

const PI = 3.1415;
PI // 3.1415

PI = 3
// TypeError: "PI" is read-only

5. 使用var變數的宣告被提前到作用域頂部,賦值則保留在原地(重點)

JS變數的宣告被提前到作用域頂部,賦值保留在原地;(不要小看這句總結)請看下面這個例子:

var color = "blue";  
function getColor()  
{  
    console.log(color);   // undefined  
    var color = "red";  
    return color;  
}  
console.log(getColor());  // red  

可能你已經掌握了區域作用域會覆寫上一級作用域的同名變數,然后Line4的color先使用上一級作用域的color,所以誤認為值是blue,其實不是,原因就在于,JS變數的宣告(var修飾)會被提前到函式作用域的開始處,即相當于Line5的var color=“red”;被分解成var color; color=“red”;而var color先被JS引擎決議,覆寫了上一級的color,接著執行Line4的輸出,此時color沒有被賦值,賦值color=“red”;依然保留在Line5處,以上代碼理解如下:

Copyvar color;  
color = "blue"
function getColor()  
{  
    var color;
    console.log(color);   // undefined  
    color = "red";  
    return color;  
}  
console.log(getColor());  // red  

這個細節,告訴我們,不能只知其一不知其二,特別是函式:

console.log(window.sum);
// 執行結果
/*
? sum(a,b){
    return a+b;
}
*/

alert(sum(1,1));  // 2
function sum(a,b){
    return a+b;
}
Copyconsole.log(window.sum);  // undefined
alert(sum(1,1));  // 報錯
var sum = function (a,b){
    return a+b;
}

// 如下
var sum;
alert(sum(1,1));  // 報錯
sum = function (a,b){
    return a+b;
}

總結: 在執行JS代碼之前,所有的全域變數(包括函式和變數),都會系結到window物件上,只是函式會包含函式體,變數僅僅是一個undefined,

6. let和var定義變數的區別(重點)

1. 作用域不一樣,var是函式作用域,而let是塊作用域,也就是說,在函式內宣告了var,整個函式內都是有效的,比如說在for回圈內定義了一個var變數,實際上其在for回圈以外也是可以訪問的,而let由于是塊作用域,所以如果在塊作用域內(比如說for回圈內)定義的變數,在其外面是不可被訪問的,所以let用在for (let i; i < n; i++)是一種很推薦的寫法

2. let不能在定義之前訪問該變數,但是var是可以得,也就是說,let必須是先定義,再使用,而var先使用后宣告也行,只不過直接使用但是沒有卻沒有定義的時候,其值為undefined,這塊要注意,這一塊很容易出問題,這也是個人認為的let比var更好的地方,至于為啥會有這種區別呢,實際上var有一個變數提升的程序,也就是說,當這個函式的作用域被創建的時候,實際上var定義的變數都會被創建,并且如果此時沒有初始化的話,則默認會初始化一個undefined,

3. let不能被重新定義,但是var是可以的,這個呢,我個人認為,從規范化的角度來說,是更推薦的,比如說,你在前面宣告了一個變數,后來寫代碼,因為忘了之前的代碼邏輯,又宣告了一個同名的變數,如果這倆變數邏輯不一樣,并且后面都要用的話,很容易出問題,且不容易維護,

總之呢,let從規范化的角度來說,要比var要進步了很大一步,所以一般情況下的話,推薦用let,const這些,

let 和 const 命令深入: https://es6.ruanyifeng.com/#docs/let

五. JavaScript資料型別

1. JavaScript擁有動態型別

/*
js/python是一門擁有動態型別的語言: 變數名指向一種型別以后可以更改
 但是有一些語言中,變數名之內指向一種后續不能更改.
*/
var xxx;              // 此時x是undefined
var xxx = 'jsaon';    // 此時的xxx是字串
var xxx = 123;        // 此時的xxx是數值
var xxx = [1, 2, 3];  // 此時的xxx是陣列

2. 數值(Number)

JavaScript不區分整型和浮點型,就只有一種數字型別,

var a = 11;
var b = 11.11;

// 如何查看當前資料型別?
console.log(typeof a);  // number
console.log(typeof b);  // number

// 特殊的 NaN:數值型別 表示的意思是“不是一個數字” NOT A NUMBER
console.log(typeof NaN); // number


// 型別轉換
// python中int型別只能轉換純數字的字串, float只能轉換帶一個點的純數字的字串
console.log(parseInt('123123'));             // 12312312
console.log(parseFloat('11.11'));            // 11.11
console.log(parseInt('11.11'));              // 11
console.log(parseInt('123sdasdajs2312d'));   // 123
console.log();parseInt('asdasdad123sdad');   // NaN

console.log(parseFloat('11'));           // 11
console.log(parseFloat('11.11'));        // 11.11
console.log(parseFloat('11.111faweff')); // 11.111
console.log(parseFloat('awefe11.11'));   // NaN


// 總結
/*
1. 數值型別: 純數字, 浮點數, NaN
2. 查看型別: typeof
3. 字串轉換成數值型別: parseInt() parseFloat()
*/

3. 字串(String)

基本用法:

var s = 'jason';
var s1 = 'tank';
// var s2 = '''alex'''  // 不支持三引號(拋出例外: VM665:1 Uncaught SyntaxError: Unexpected string)
console.log(typeof s1); // string

// 模版字串(注意: 如果模板字串中需要使用反引號,則在其前面要用反斜杠轉義,)
var s3 = `
\`多行顯示使用模版字串
\`多行顯示使用模版字串
`;
console.log(typeof s3); // string

// 模版字串除了可以定義多行文本之外還可以實作格式化字串操作
var name = 'jason';
var age = 18;
var sss = `
My name is ${name} My age is ${age}`;
console.log(sss);  //  My name is jason My age is 18

// 書寫${} 會自動去前面找大括號里面的變數名對應的值 如果沒有定義直接報錯
// var s4 = `my name is ${xxxxx}`;
// console.log(s4);  // 拋出例外: Uncaught ReferenceError: namemmmmm is not defined

// 字串的拼接
/*
在python中不推薦你使用+做拼接 join
在js中推薦你直接使用+做拼接: python中字串數值不能直接和字串進行拼接, 但是再js中會把數值型別轉換成字串型別再進行拼接
*/
var sss1 = name + age;
console.log(sss1);  // jason18

// 總結
/*
1. python中使用三引號展示多行字串. js中使用模板字串展示多行字串
2. python中使用%s,format,f"{}"等方式實作字串的格式化. js中使用`${}`實作字串的格式化
3. python中使用+,join實作字串的拼接, +號數值不能直接和字串進行拼接, join中串列中元素必須是字串型別(推薦用join). 而js中使用+實作字串的拼接,且當+號進行拼接時遇見數值型別會先換成字串型別再進行拼接
*/

字串型別常用方法:

功能jspythonmysql區別
回傳長度.lengthlen()char_length()
移除兩邊空白.trim().strip()python中除了移除空白, 還可以指定要移除的字符, js只能單純的移除空白
移除左邊的空白.trimLeft().lstrip()
移除右邊的空白.trimRight().rstrip()
回傳第n個字符.charAt(n)list[n]
拼接.concat(value,…).join(), +concat(), concat_ws(), group_concat()python中使用+,join實作字串的拼接, +號數值不能直接和字串進行拼接, join中串列中元素必須是字串型別(推薦用join). 而js中使用+, 或者.concat()實作字串的拼接,當進行拼接時遇見數值型別會先換成字串型別再進行拼接
子序列位置.indexOf(substring, start).index(), rindex(), .find(), .rfind()
根據索引獲取子序列.substring(start , end)list[start, end, step]python中可以識別負數, js中substring不識別, 而slice則支持負數(推薦)
切片.slice(start, end)list[start, end, step]
小寫.toLowerCase().lower()
大寫.toupperCase(0.upper()
分割.split(delimiter, limit).split(sep, maxsplit), rsplit(sep, maxsplit)python中第二個引數是限制分隔字符的個數, js中式獲取切割之后的元素個數
var name = 'egonDSB';
console.log(name.length); // 7

var name1 = '   egonDSB  ';
console.log(name1.trim());      // egonDSB
console.log(name1.trimLeft());  // egonDSB
console.log(name1.trimRight()); //    egonDSB
var name2 = '$$jason$$';
console.log(name2.trim('$'));  // $$jason$$(不能加括號指定去除的內容)

console.log(name2.charAt(0));      // $

console.log(name2.indexOf('as'));  // 3

console.log(name2.substring(0,2));   // $$
console.log(name2.substring(0,-1));  // 不識別負數

console.log(name2.slice(0,-1));      // $$jason$

var name3 = 'eGoNDsb123666HahA';
console.log(name3.toUpperCase());  // EGONDSB123666HAHA
console.log(name3.toLowerCase());  // egondsb123666haha

var name4 = 'tank|hecha|liaomei|mengsao|...';
console.log(name4.split('|'));     // ["tank", "hecha", "liaomei", "mengsao", "..."]
console.log(name4.split('|', 2));  //  ["tank", "hecha"](第二個引數不是限制切割字符的個數還是獲取切割之后元素的個數)


console.log(name.concat(name1, name2));  // egonDSB   egonDSB  $$jason$$
console.log(name+name1+name2);  // egonDSB   egonDSB  $$jason$$
var p = 1;
console.log(name.concat(p));  // egonDSB1*(js是弱型別, 內部會自動轉換成相同的資料型別做操作)

// 總結
/*
.length  長度
.trim(), .trimLeft(), .trimRight() 只能移除空格沒有引數
.substring(start, end), .slice(start, end) slice支持負數
.concat(val, ...), +
.indexOf(substring, start), .charAt(substring)
.toUpperCase(), toLowerCase()
.split(delimiter, limit) 第二個引數指定切分的個數, 不是次數
*/

4. 數值和字串轉換

數值轉字串:

2種轉換方式: 隱式轉換, 呼叫.toString()方法

  • 隱式轉換#

    • 第一步: var num = 123;
    • 轉換成字串: var str = 123 + "abc";
  • 呼叫.toString()方法

    • 第一步: var num = 123;
    • 轉換成字串: var str = num.toString();

字串轉數值:

呼叫函式Number()方法

  • 字串中不是全是數值型別的情況下:

    報錯, alert列印出現NaN: Not a number, 型別列印為number

    • 第一步: var str = 'abc';
    • 轉換成數值: var num = Number(str);
  • 字串中全是數字型別的情況:

    正確轉換

    • 第一步: var str = '123.123';
    • 轉換成數值: var num = Number(str);

4. 布林值(Boolean)

"""
1.在python中布林值是首字母大寫的
	True
	False
2.但是在js中布林值是全小寫的
	true
	false
# 布林值是false的有哪些
	空字串、0、null、undefined、NaN
"""
Copyconsole.log(Boolean(0));         // false
console.log(Boolean(false));     // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN));       // false

null和undefined:

  • null表示值是空,一般在需要指定或清空一個變數時才會使用,如 name=null;
  • undefined表示當宣告一個變數但未初始化時,該變數的默認值是undefined,還有就是函式無明確的回傳值時,回傳的也是undefined,

null表示變數的值是空(null可以手動清空一個變數的值,使得該變數變為object型別,值為null),undefined則表示只宣告了變數,但還沒有賦值,

還不明白,上圖吧!

img

img

六. 運算子

1. 算術運算子

/*
++表示自增1 類似于python中的 +=1
加號在前先加后賦值 加號在后先賦值后加
*/
var x = 10;
var res = x++;
console.log(res);  // 10
var res1 = ++x;
console.log(res1); // 12

2. 比較運算子

/*
==, != 弱等于  內部自動轉換成相同的資料型別比較了
===, !== 強等于  內部不做型別轉換
*/
console.log(1 == '1');   // true
console.log(1 === '1');  // false
console.log(1 != '1');   // false
console.log(1 !== '1');  // true

3. 邏輯運算子

/*
python中 and or not
js中      && ||  !
注意: 比較運算子回傳的結果是布林值, 邏輯運算回傳的結果是短路運算以后的結果.
短路運算舉例:
    0 && 1   回傳結果是0. 也就是說0的布林值為false, 與運算只要有一個結果是false那么結果就是false, 所以計算到0就不會往后計算了.
*/
console.log(5 && '5');   // '5'
console.log(0 || 1);     // 1
console.log(!5 && '5');  // false

4. 賦值運算子

  • 加法賦值運算子: +=
  • 減法賦值運算子: -=
  • 乘法賦值運算子: *=
  • 除法賦值運算子: /=
  • 取余賦值運算子: %=

七. 物件(Object): 陣列

1. 陣列物件的常用方法:

功能jspython區別
陣列的大小.lengthlen()
獲取陣列中的元素array[index]list[index]python中支持負數, js中不支持負數索引
尾部追加元素.push(ele).append(ele)
彈出尾部的元素.pop().pop()
頭部插入元素.unshift(ele).insert(0, ele), list[0]=ele
頭部移除元素.shift().remove(頭ele), pop(0), del list[0]
切片.selice(start, end)list[start, end]
反轉.reverse().reverse()
將陣列元素連接成字串.join(seq)'.join()python中join中’'中放的是連接的字符括號中放的是每個元素都是字串型別的索引型別元素, 而js中點前面是陣列后面是連接的字符.
連接陣列.concat(val, …).extend, +
排序.sort().sort()
將陣列的每個元素傳遞給回呼函式forEach(function(currentValue, index, arr), thisValue)
洗掉元素,并向陣列添加新元素,splice(index,howmany,item1,…,itemX)
回傳一個陣列元素呼叫函式處理后的值的新陣列map(function(currentValue,index,arr), thisValue)
// 陣列(類似于python里面的串列)	[]
var array1 = [222, 333, 444, 555];
console.log(typeof array1);  // object

console.log(array1[1]);   // 333
console.log(array1[-1]);  // undefined(不支持負數索引)

console.log(array1.push(666));  // 5
console.log(array1);  // [222, 333, 444, 555, 666]

console.log(array1.pop());  // 666
console.log(array1);  //  [222, 333, 444, 555]

console.log(array1.unshift(111));  // 5
console.log(array1);  // [111, 222, 333, 444, 555]

console.log(array1.shift(111));  // 111
console.log(array1);  // [222, 333, 444, 555]

console.log(array1.slice(0, -1));  // [222, 333, 444]
console.log(array1.slice(0, array1.length));  // [222, 333, 444, 555] (如果通過切片的方式復制一門陣列物件, 結束位置指定-1是不行的, 這也只能取到陣列的倒數第二個值, 因此我們要用.length屬性)

console.log(array1.reverse());  // [555, 444, 333, 222]

console.log(array1.join('$'));  // 555$444$333$222

console.log(array1.concat(['aaa', 'bbb']));  // [555, 444, 333, 222, "aaa", "bbb"]
console.log(array1);  // [555, 444, 333, 222]

2. forEach, map, seqlice

// forEach: forEach(function(currentValue, index, arr), thisValue)
// 1. 一個引數就是陣列里面每一個元素物件
var array2 = [111, 222, 333, 444, 555];
array2.forEach(function (value) {
    console.log(value);
}, array2);
// 執行結果:
/*
111
222
333
444
555
666
 */

// 2. 兩個引數就是元素 + 元素索引
array2.forEach(function (value, index) {
    console.log(value, index);
}, array2);
// 執行結果:
/*
111 0
222 1
333 2
444 3
555 4
666 5
 */

// 3. 元素 + 元素索引 + 元素的資料來源
array2.forEach(function (value, index, arr, xxx) {
    console.log(value, index, arr, xxx); // 最多三個. 基于js這種弱型別語言, 如果沒有xxx傳入也不會報錯. 會拋出undefined
    // return [value, index, arr, xxx]; // 最多三個. 基于js這種弱型別語言, 如果沒有xxx傳入也不會報錯. 會拋出undefined
}, array2);
// 執行結果:
/*
111 0 (6) [111, 222, 333, 444, 555, 666] undefined
222 1 (6) [111, 222, 333, 444, 555, 666] undefined
333 2 (6) [111, 222, 333, 444, 555, 666] undefined
444 3 (6) [111, 222, 333, 444, 555, 666] undefined
555 4 (6) [111, 222, 333, 444, 555, 666] undefined
666 5 (6) [111, 222, 333, 444, 555, 666] undefined
 */

// map: map(function(currentValue,index,arr), thisValue)
var array4 = [11, 22, 33, 44, 55];
array4.map(function (value) {
    console.log(value);
}, array4);
// 執行結果:
/*
11
22
33
44
55
66
 */

var res1 = array4.map(function (value, index) {
    return [value * 2, index]; // 如果相回傳多個值, 必須被包含, 如果不包含回傳的是逗號前的第一個值. 和python中只要逗號隔開回傳元組不一樣.
}, array4);
console.log(res1);  // [11, 22, 33, 44, 55]
// 執行結果:
/*
 [Array(2), Array(2), Array(2), Array(2), Array(2)]
0: (2) [22, 0]
1: (2) [44, 1]
2: (2) [66, 2]
3: (2) [88, 3]
4: (2) [110, 4]
length: 5
 */

var res2 = array4.map(function (value, index, arr) {
    return [value * 2, index*2, arr];
}, array4);
console.log(res2);  // [22, 44, 66, 88, 110]
// 執行結果:
/*
[Array(3), Array(3), Array(3), Array(3), Array(3)]
0: (3) [22, 0, Array(5)]
1: (3) [44, 2, Array(5)]
2: (3) [66, 4, Array(5)]
3: (3) [88, 6, Array(5)]
4: (3) [110, 8, Array(5)]
length: 5
 */

// splice: splice(index,howmany,item1,.....,itemX)
var array3 = [111, 222, 333, 444, 555];
array3.splice(0, 3);  // 兩個引數 第一個是起始索引位置 第二個是洗掉的個數
console.log(array3);  // [444, 555]

array3.splice(0, 1, 666);  // 第三個引數 要添加到陣列的新元素
console.log(array3);  // [666, 555]
array3.splice(0, 1, ['aaa', 'bbb']);
console.log(array3);
/*
[Array(2), 555]
0: (2) ["aaa", "bbb"]
1: 555
length: 2
*/

3. JS中Map和ForEach的區別

// 
/*
1. 能用forEach()做到的,map()同樣可以,反過來也是如此,
2. map()會分配記憶體空間存盤新陣列并回傳,forEach()方法不會回傳執行結果,而是undefined. 也就是說,forEach()會修改原來的陣列,而map()方法會得到一個新的陣列并回傳,
*/
var array5 = [11, 22, 33, 44, 55];
var aaa = array5.forEach(function (value) {
    return value;
});
var bbb = array5.map(function (value) {
    return value*2;
});
console.log(aaa);  //  undefined
console.log(bbb);  //  [11, 22, 33, 44, 55]

4. 總結:

Copy// 
/*
.length 長度
array[index] 索引取值(索引不能為負數)
.push(ele), .pop() 尾部追加/洗掉
.unshift(ele), .shift() 頭部追加/洗掉
.slice(start, end) 切片(想實作復制end通過.length獲取陣列的長度, -1只能取到倒數第二個值)
.reverse() 反轉
.join(seq) 拼接
.concat(val, ...) 連接陣列(+號只能連接字串)
.sort() 排序
.foreach(function(value,index,arr){}, thisValue) function是一個回呼函式callback
.map(function(value,index,arr){}, thisValue)
.splice(index, removeCount, item1, ... , itemX)
*/

八. 流程控制

1. if判斷

/*
注意: 在js中代碼是沒有縮進的, js中的`(條件){代碼塊}`替代了縮進, 以一下的縮進只是為了可讀性, 而python是有縮進這么一說的.
*/
var age = 28;
// if
if (age>18){
  console.log('來啊 來啊')
}

// if-else
if (age>18){
  console.log('來啊 來啊')
}else{
  console.log('沒錢 滾蛋')
}

// if-else if-else
if (age > 25){
    console.log('你好我們不合適!');
} else if (age < 18) {
    console.log('培養一下');
} else {
    console.log('我們在一起吧!');
}

2. switch語法: 提前列舉好可能出現的條件和解決方式

switch中的case子句通常都會加break陳述句,否則程式會繼續執行后續case中的陳述句

var num = 2;
switch (num) {
    case 0:  // case 條件: 條件=num成立執行
        console.log('吃');
        break; // 不加break 匹配到一個之后 就一直往下執行(簡稱: 穿透執行)
    case 1:
        console.log('喝');
        break;
    case 2:
        console.log('玩');  // 執行結果: 玩
        break;
    case 3:
        console.log('樂');
        break;
    default:
        console.log('條件都沒有匹配上 默認走的流程');
}

3. for回圈

// 1. for回圈控制執行次數: 列印0-9數字
for (let i = 0; i < 10; i++) {
    console.log(i);
}

// 2. for回圈遍歷取值
for (let i in ['aaa', 'bbb', 'ccc']) {
    console.log(i);
}


// 3. for回圈死回圈之break和cointinue陳述句+死回圈
let i = 0;
for (;;) {  // 死回圈
    console.log('哈哈哈');
    if (i === 10000) {
        break;  // break跳出當前回圈
    }
    // i ++;
    i += 1;
}

let sum = 0;   // 計算1~10數值, 并排除5這個數
for (let j = 1; j < 11; j++) {
    if (j === 10) {
        continue;  // continue跳出當前回圈, 下次回圈繼續進行
    }
    sum += j;
    j += 1;
}
console.log(sum);   // 25

4. while回圈: 列印1~100

var i = 1;
while (i < 101) {
    console.log(i);
    i += 1;
}

5. 三元運算式

/*
python中三元運算子 res = 條件成立回傳的結果 if 條件 else 條件不成立回傳的結果
JS中三元運算  res = 條件 ? 條件成立回傳的結果:條件不成立回傳的結果
*/
var res = 1 > 2 ? 2:8;
console.log(res); // 8
var res1 = 1 > 2 ? 2:(3 < !6 ? 1:0); // 三元運算子不要寫的過于復雜
console.log(res1); // 0

6. 總結

/*
if (條件) {子代碼塊}
if (條件) {子代碼塊} else (條件) {子代碼塊}
if (條件) {子代碼塊} else if (條件) {子代碼塊} else (條件) {子代碼塊}

switch (引數) {
    case 條件: // 引數=條件則成立就執行以下代碼塊
        子代碼塊
        break;
    ...
    default:
        以上條件都沒成立則指定這里的子代碼塊
}

for回圈控制執行次數+遍歷取值
    for (陳述句 1; 陳述句 2; 陳述句 3) {  // 回圈控制執行次數
         要執行的代碼塊
    }
    陳述句 1 在回圈(代碼塊)開始之前執行,
    陳述句 2 定義運行回圈(代碼塊)的條件,
    陳述句 3 會在回圈(代碼塊)每次被執行后執行,

    for (let i in 可遍歷物件) {
        要執行的代碼塊
    }

while (條件) {
    子代碼塊
}

res = 條件 ? 條件成立回傳的結果:條件不成立回傳的結果
*/

九. 函式

1. 函式定義

/*
在python定義函式需要用到關鍵字def
在js中定義函式需要用到關鍵字function

語法: function 函式名(形參1,形參2,形參3...){函式體代碼}
*/
// 無參函式
function func1() {
    console.log('hello world');
}
func1();  // hello world

// 有參函式
function func2(a, b) {
    console.log(a, b);
}
func2(1, 2); // 1 2
func2(1, 2, 3, 4, 5, 6, 7, 8, 9);  // 1 2(多了沒關系 只要對應的資料)
func2(1); // 1 undefined(少了也沒關系, 未定義的會用undefined填補)

2. 函式中的arguments引數: 能夠獲取到函式接受到的所有的引數

function func3(a, b, c) {
    console.log(arguments);
}
func3(1, 2, 3);
// 執行結果:
/*
Arguments(3) [1, 2, 3, callee: ?, Symbol(Symbol.iterator): ?]
0: 1
1: 2
2: 3
*/

// 使用arguments判斷傳參的確切性
function func4(a, b) {
    if (arguments.length < 2) {
        console.log('引數傳少了!');
    } else if (arguments.length > 2) {
        console.log('引數傳多了!');
    } else {
        console.log('正常執行');
    }
}
func4(1, 2, 3);  // 引數傳多了!
func4(1);        // 引數傳少了!
func4(1, 2);     // 正常執行

3. 函式的回傳值: 使用的也是等同于python中的關鍵字return

function func5() {      // 回傳一個值
    return 666
}
console.log(func5());  // 666

function func6(a, b) {  // 回傳多個值, 多個值必須被包含不然就會回傳逗號前面的那一個值.
    return a, b
}
console.log(func6(1, 2));  // 2

function func7(a, b) {
    return [a, b]
}
console.log(func7(1, 2));  // [1, 2]

4. 匿名函式: 就是沒有名字

/*function () {
   console.log('哈哈哈');
}*/
let res = function() {  // 函式還可以被賦值, 對于匿名函式這也賦值雖然沒有什么意義, 但是為了然函式能正常執行, 還是賦值一個變數吧~
   console.log('哈哈哈');
};
res();  // 哈哈哈

5. 箭頭函式: 主要用來處理簡單的業務邏輯 類似于python中的匿名函式

ES6中允許使用“箭頭”(=>)定義函式

// 如果箭頭函式不需要引數或需要多個引數,就是用圓括號代表引數部分
var f = () => 5;

// 等同于
var f = function(){return 5};

let func8 = v => v*2;  // 箭頭左邊的是形參 右邊的是回傳值
console.log(func8(2)); // 4

let func9 = function (v) {  // 上面與下面作用等同
    return v * 2;
};
console.log(func9(2)); // 4`

6. 總結#

/*
函式定義: 無參, 有參
函式呼叫: 無參直接呼叫. 有參呼叫傳值多余部分不要, 少的部分用undefined提補.
arguments: 可以接受所有引數, 可以通過arguments.length獲取傳入的引數個數.
函式回傳值: 單個回傳值.  多個回傳值需被包含, 如果不包含只回傳逗號前面一個值.
匿名函式: 匿名函式可被賦值.
箭頭函式: 
    無參: let a = () => 回傳值; 
    有參: let a = 形參 => 回傳值; 
*/

十. 函式的全域變數和區域變數

1. 介紹

區域變數:
    在JavaScript函式內部宣告的變數(使用 var)是區域變數,所以只能在函式內部訪問它(該變數的作用域是函式內部),只要函式運行完畢,本地變數就會被洗掉,

全域變數:
    在函式外宣告的變數是全域變數,網頁上的所有腳本和函式都能訪問它,

變數生存周期:
    JavaScript變數的生命期從它們被宣告的時間開始,
    區域變數會在函式運行以后被洗掉,
    全域變數會在頁面關閉后被洗掉,

作用域
    首先在函式內部查找變數,找不到則到外層函式查找,逐步找到最外層,與python作用域關系查找一模一樣

2. 示例

跟python查找變數的順序一致

  • 示例1
var city = "BeiJing";
function f() {
  var city = "ShangHai";
  function inner(){
    var city = "ShenZhen";
    console.log(city);
  }
  inner();
}
f();  // 輸出結果是?  ShenZhen

// ES6推薦使用let
let city = "BeiJing";
function f() {
  let city = "ShangHai";
  function inner(){
    let city = "ShenZhen";
    console.log(city);
  }
  inner();
}
f();  // 輸出結果是?  ShenZhen
  • 示例2
var city = "BeiJing";
function Bar() {
  console.log(city);
}
function f() {
  var city = "ShangHai";
  return Bar;
}
var ret = f();
ret();  // 列印結果是? BeiJing

// ES6推薦使用let
let city = "BeiJing";
function Bar() {
  console.log(city);
}
function f() {
  let city = "ShangHai";
  return Bar;
}
let ret = f();
ret();  // 列印結果是? BeiJing
  • 示例3: 閉包函式
var city = "BeiJing";
function f(){
    var city = "ShangHai";
    function inner(){
        console.log(city);
    }
    return inner;
}
var ret = f();
ret();   // ShangHai

// ES6推薦使用let
let city = "BeiJing";
function f(){
    let city = "ShangHai";
    function inner(){
        console.log(city);
    }
    return inner;
}
let ret = f();
ret();   // ShangHai

十一. 內置物件和方法

JavaScript中的所有事物都是物件:字串、數字、陣列、日期,等等,在JavaScript中,物件是擁有屬性和方法的資料,

我們在學習基本資料型別的時候已經帶大家了解了,JavaScript中的Number物件、String物件、Array物件等,

注意: var s1 = "abc"和var s2 = new String(“abc”)的區別:typeof s1 --> string而 typeof s2 --> Object

img

1. 自定義物件

JavaScript的物件(Object)本質上是鍵值對的集合(Hash結構),但是只能用字串作為鍵,

// 你可以看成是我們python中的字典 但是js中的自定義物件要比python里面的字典操作起來更加的方便
// 創建自定義物件 {}
// 1. 第一種創建自定義物件的方式
let d1 = {'name': 'jason', 'age': 18};
console.log(typeof d1);   // object

console.log(d1['name']);  // jason(獲取物件方式一)
console.log(d1.name);     // jason(獲取物件方式二)

for (let i in d1) {
    console.log(i, d1[i]);  // 支持for回圈 暴露給外界可以直接獲取的也是鍵
}

// 2. 第二種創建自定義物件的方式:  需要使用關鍵字 new
let d2 = new Object();   // 創建的是空物件{}
d2.name = 'jason';   // 物件修改(增)方式一
d2['age'] = 18;      // 物件修改(增)方式二
console.log(d2);     // {name: "jason", age: 18}

// 總結:
/*
定義物件的2種方式: {}, new Object()
訪問物件的2種方式: 物件.屬性名, 物件['屬性名']
修改物件的2種方式: 物件.屬性名=屬性值, 物件['屬性名']=屬性值
*/

ES6中提供了Map資料結構,它類似于物件,也是鍵值對的集合,但是“鍵”的范圍不限于字串,各種型別的值(包括物件)都可以當做鍵,*

*也就是說,Object結構提供了“字串–值”的對應,Map結構提供了“值–值”的對應,是一種更完善的Hash結構實作,

var m = new Map();
var o = {p: "Hello World"}

m.set(o, "content"}
m.get(o)  // "content"

m.has(o)     // true
m.delete(o)  // true
m.has(o)     // false

2. Date物件

// 自動獲取當前時間
let d1 = new Date();
console.log(d1);  // Sun May 17 2020 00:27:39 GMT+0800 (中國標準時間)
console.log(d1.toLocaleString());  // 2020/5/17 上午12:28:34

// 自己手動輸入時間
let d2 = new Date('2020/11/11 11:11:11');
console.log(d2);  // Wed Nov 11 2020 11:11:11 GMT+0800 (中國標準時間)
console.log(d2.toLocaleString());  // 2020/11/11 上午11:11:11

let d3 = new Date(2020,11,11,11,11,11);
console.log(d3);  // Fri Dec 11 2020 11:11:11 GMT+0800 (中國標準時間)
console.log(d3.toLocaleString());  // 2020/12/11 上午11:11:11(注意: 以上使用逗號隔開方式輸入的時間的月份是從0開始 0-11月)

// 時間物件具體方法
let d4 = new Date('2020/5/17 0:28:34');
console.log(d4.getFullYear());  // 2020 (獲取完整的年份)
console.log(d4.getMonth());     // 4 (獲取月份0~11, 0代表1月, 11代表12月)
console.log(d4.getDate());      // 17 (獲取日)
console.log(d4.getDay());       // 0 (獲取星期0~6. 0代表星期日, 6代表星期六)
console.log(d4.getHours());       // 0 (小時. 如果時間小于10, 則顯示個位數)
console.log(d4.getMinutes());   // 37 (獲取分鐘)
console.log(d4.getSeconds());   // 25 (獲取秒)
console.log(d4.getMilliseconds());  // 588 (獲取毫秒)
console.log(d4.getTime());      // 1589647045588 (時間戳)

// 總結:
/*
時間的2種顯示格式:
    1. 默認: Sun May 17 2020 00:27:39 GMT+0800 (中國標準時間)
    2. 使用.toLocaleString()方法: 2020/5/17 上午12:28:34

時間的3種創建方式:
    1. 自動生成當前時間: new Date()
    2. 手動指定方式一: new Date('2020/5/17 12:28:34')
    3. 手動指定方式二: new Date(2020,5,17,12,28,34) 這種時間的指定當使用.toLocaleString()方法時月份范圍是0~11

時間物件的具體方法:
    獲取年完成年份    .getFullYear()
    獲取月份(0~11)   .getMonth()
    獲取日           .getDate()
    獲取星期(0~6)    .getDay()
    獲取小時         .getHours()
    獲取分鐘         .getMinutes()
    獲取秒鐘         .getSeconds()
    獲取毫秒         .getMilliSeconds()
    獲取時間戳        .getTime()
*/

**練習:**撰寫代碼,將當前日期按“2017-12-27 11:11 星期三”格式輸出,

function myDateFor() {
    let days = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天'];
    let nowTime = new Date();
    let fullYear = nowTime.getFullYear();
    let month = nowTime.getMonth();
    let date = nowTime.getDate();
    let hours = nowTime.getHours();
    let minutes = nowTime.getMinutes();
    minutes = minutes < 10 ? '0'+minutes:minutes;
    let day = nowTime.getDay();
    day = days[day];
    month += 1;


    console.log(`${fullYear}-${month}-${date} ${hours}:${minutes} ${day}`);
}
myDateFor();

詳細Date物件方法:點我

3. JSON物件

let obj = [11, 11.11, NaN, 'aaa', false, true, undefined, {}];
let serialize_obj = JSON.stringify(obj);
console.log(serialize_obj); // "[11,11.11,null,"aaa",false,true,null,{}] "  (序列化)

let deserialize_obj = JSON.parse(serialize_obj);
console.log(deserialize_obj); // [11, 11.11, null, "aaa", false, true, null, {…}]  (反序列化)

// 總結:
/*
在python中序列化反序列化
    dumps 		序列化
    loads		反序列化

在js中也有序列化反序列化
    JSON.stringify()	dumps
    JSON.parse()		loads
*/

4. RegExp物件

/*
在python中如果需要使用正則 需要借助于re模塊
在js中需要你創建正則物件
*/
let sss = 'egondsb egondsb 1dsb dsb 111';
// 第一種開啟正則方式: new RegExp('正則規則')
/*
.test():  接受一個字串引數,在模式與該引數匹配的情況下回傳true,否則回傳false
.match(): 回傳一個陣列,陣列中包含了匹配值,匹配值在源字串首次出現的索引值,以及源字串;
*/
let reg1 = new RegExp('[a-zA-Z][a-zA-Z0-9]{5,11}'); // 匹配字母,  加上5~11個字母或者數字
console.log(reg1.test(sss));   // true (正則校驗資料)
console.log(sss.match(reg1));  // ["egondsb", index: 0, input: "egondsb egondsb 1dsb dsb 111", groups: undefined]

// 第二種開啟正則方式: /正則規則/
let reg2 = /[a-zA-Z][a-zA-Z0-9]{5,11}/g;
console.log(reg2.test(sss));   //  true
console.log(sss.match(reg2));  // ["egondsb", "egondsb"]

// 缺陷一: 全域匹配模式的lastIndex與.test()效驗資料(全域匹配時有一個lastIndex屬性)
let reg3 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/g;
console.log(reg3.test('egondsb'));  // true
console.log(reg3.test('egondsb'));  // false
console.log(reg3.test('egondsb'));  // true
console.log(reg3.test('egondsb'));  // false

console.log(reg3.lastIndex);  // 0
console.log(reg3.test('egondsb'));  // true
console.log(reg3.lastIndex);  // 7
console.log(reg3.test('egondsb'));  // false
console.log(reg3.lastIndex);  // 0

// 缺陷二: .test()效驗時不傳參 默認傳的是undefined. 也能回傳匹配成功true的信號.
let reg4 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/;
console.log(reg4.test());  // true
console.log(reg4.test());  // true

let reg5 = /undefined/;
console.log(reg5.test('jason'));  // false
console.log(reg5.test());  // true
console.log(reg5.test(undefined));  // true


// 總結
/*
正則的2種開啟方式: new RegExp('正則規則'), /正則規則/[g]
正則的效驗: reg_obj.text(string)
正則的取值: string.match(reg_obj)  如果正則物件不是全域模式只能獲取匹配到的第一個值
正則效驗模式的2大缺陷:
    1. 全域模式下的lastIndex造成效驗結果2極化; 匹配成功指標狀態被保留到下一次, 導致下一次無法重新開始, 進而導致效驗結果一會兒為false, 一會兒為true
    2. 效驗模式不傳參默認會傳undefined, 導致在正常匹配中無undefined匹配規則情況下, 沒有匹配內容, 默認輸出結果為true.
*/

擴展閱讀

5. Math物件(了解)

abs(x)      回傳數的絕對值,
exp(x)      回傳 e 的指數,
floor(x)    對數進行下舍入,
log(x)      回傳數的自然對數(底為e),
max(x,y)    回傳 x 和 y 中的最高值,
min(x,y)    回傳 x 和 y 中的最低值,
pow(x,y)    回傳 x 的 y 次冪,
random()    回傳 0 ~ 1 之間的亂數,
round(x)    把數四舍五入為最接近的整數,
sin(x)      回傳數的正弦,
sqrt(x)     回傳數的平方根,
tan(x)      回傳角的正切,

6. window物件

<script type="text/javascript">
	// 在ECMAScript中頂層物件就是window物件
		// 定義變數的時候
		var a = 123;
		console.log(a);
		console.log(window.a);
		// 定義函式的時候
		function fun(){
			console.log(a);
			console.log(window.a);
		}
		fun();
		window.fun();
</script>

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/348402.html

標籤:python

上一篇:用python幫別人寫了個文字識別程式

下一篇:如何用Python記錄微信撤回的訊息

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more