JavaScript - 基礎

JavaScript - 基礎

  • JavaScript 是腳本語言
  • JavaScript 是一種輕量級的編程語言。
  • JavaScript 是可插入 HTML 頁面的編程代碼。
  • JavaScript 插入 HTML 頁面後,可由全部的現代瀏覽器執行。
  • JavaScript 很容易學習。

一. JavaScript引用方式

Script標籤內寫代碼java

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

引入額外的JS文件正則表達式

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

二. Javascript語言規範

註釋(註釋是代碼之母)編程

// 這是單行註釋

/*
這是
多行註釋
*/

結束符json

JavaScript中的語句要以分號(;)爲結束符。

三. JavaScript變量聲明

  1. JavaScript的變量名可使用_,數字,字母,$組成,不能以數字開頭。
  2. 聲明變量使用 var 變量名; 的格式來進行聲明數組

    var name = "Alex";
     var age = 18;

注意:瀏覽器

  • 變量名是區分大小寫的。數據結構

  • 推薦使用駝峯式命名規則。閉包

  • 保留字不能用作變量名。dom

補充:

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

四. JavaScript數據類型

JavaScript擁有動態類型

var x;  // 此時x是undefined
var x = 1;  // 此時x是數字
var x = "Alex"  // 此時x是字符串

數值(Number)

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

var a = 12.34;
var b = 20;
var c = 123e5;  // 12300000
var d = 123e-5;  // 0.00123

還有一種NaN,表示不是一個數字(Not a Number)。

經常使用方法:

parseInt("123")  // 返回123
parseInt("ABC")  // 返回NaN,NaN屬性是表明非數字值的特殊值。該屬性用於指示某個值不是數字。
parseFloat("123.456")  // 返回123.456

字符串(String)

var a = "Hello"
var b = "world;
var c = a + b; 
console.log(c);  // 獲得Helloworld

經常使用方法:

方法  說明
.length 返回長度
.trim() 移除空白
.trimLeft() 移除左邊的空白
.trimRight()    移除右邊的空白
.charAt(n)  返回第n個字符
.concat(value, ...) 拼接
.indexOf(substring, start)  子序列位置
.substring(from, to)    根據索引獲取子序列
.slice(start, end)  切片
.toLowerCase()  小寫
.toUpperCase()  大寫
.split(delimiter, limit)    分割

補充:

ES6中引入了模板字符串。模板字符串(template string)是加強版的字符串,用反引號(`)標識。它能夠當作普通字符串使用,也能夠用來定義多行字符串,或者在字符串中嵌入變量。

// 普通字符串
`這是普通字符串!`
// 多行文本
`這是多行的
文本`
// 字符串中嵌入變量
var name = "q1mi", time = "today";
`Hello ${name}, how are you ${time}?`

注意:

若是模板字符串中須要使用反引號,則在其前面要用反斜槓轉義。

JSHint啓用ES6語法支持:/* jshint esversion: 6 */

布爾值(Boolean)

區別於Python,true和false都是小寫。

var a = true;
var b = false;

""(空字符串)、0、null、undefined、NaN都是false。

null和undefined

  • null表示值是空,通常在須要指定或清空一個變量時纔會使用,如 name=null;
  • undefined表示當聲明一個變量但未初始化時,該變量的默認值是undefined。還有就是函數無明確的返回值時,返回的也是undefined。

null表示變量的值是空,undefined則表示只聲明瞭變量,但尚未賦值。

對象(Object)

JavaScript 中的全部事物都是對象:字符串、數值、數組、函數...此外,JavaScript 容許自定義對象。

JavaScript 提供多個內建對象,好比 String、Date、Array 等等。

對象只是帶有屬性和方法的特殊數據類型。

數組

數組對象的做用是:使用單獨的變量名來存儲一系列的值。相似於Python中的列表。

var a = [123, "ABC"];
console.log(a[1]);  // 輸出"ABC"

經常使用方法:

方法  說明
.length 數組的大小
.push(ele)  尾部追加元素
.pop()  獲取尾部的元素
.unshift(ele)   頭部插入元素
.shift()    頭部移除元素
.slice(start, end)  切片
.reverse()  反轉
.join(seq)  將數組元素鏈接成字符串
.concat(val, ...)   鏈接數組
.sort() 排序
.forEach()  將數組的每一個元素傳遞給回調函數
.splice()   刪除元素,並向數組添加新元素。
.map()  返回一個數組元素調用函數處理後的值的新數組

關於sort()須要注意:

若是調用該方法時沒有使用參數,將按字母順序對數組中的元素進行排序,說得更精確點,是按照字符編碼的順序進行排序。要實現這一點,首先應把數組的元素都轉換成字符串(若有必要),以便進行比較。

若是想按照其餘標準進行排序,就須要提供比較函數,該函數要比較兩個值,而後返回一個用於說明這兩個值的相對順序的數字。比較函數應該具備兩個參數 a 和 b,其返回值以下:

若 a 小於 b,在排序後的數組中 a 應該出如今 b 以前,則返回一個小於 0 的值。
若 a 等於 b,則返回 0。
若 a 大於 b,則返回一個大於 0 的值。

示例:

function sortNumber(a,b){
    return a - b
}
var arr1 = [11, 100, 22, 55, 33, 44]
arr1.sort(sortNumber)

關於遍歷數組中的元素,可使用下面的方式:

var a = [10, 20, 30, 40];
for (var i=0;i<a.length;i++) {
  console.log(a[i]);
}

類型查詢

typeof "abc"  // "string"
typeof null  // "object"
typeof true  // "boolean"
typeof 123 // "number"

typeof是一個一元運算符(就像++,--,!,- 等一元運算符),不是一個函數,也不是一個語句。

對變量或值調用 typeof 運算符將返回下列值之一:

  • undefined 若是變量是 Undefined 類型的
  • boolean 若是變量是 Boolean 類型的
  • number 若是變量是 Number 類型的
  • string 若是變量是 String 類型的
  • object 若是變量是一種引用類型或 Null 類型的

五. 運算符

算數運算符

+ - * / % ++ --

比較運算符

> >= < <= != == === !==

注意:

1 == 「1」  // true
1 === "1"  // false

邏輯運算符

&& || !

賦值運算符

= += -= *= /=

流程控制

if-else

var a = 10;
if (a > 5){
  console.log("yes");
}else {
  console.log("no");
}

if-else if-else

var a = 10;
if (a > 5){
  console.log("a > 5");
}else if (a < 5) {
  console.log("a < 5");
}else {
  console.log("a = 5");
}

switch

var day = new Date().getDay();
switch (day) {
  case 0:
  console.log("Sunday");
  break;
  case 1:
  console.log("Monday");
  break;
default:
  console.log("...")
}

switch中的case子句一般都會加break語句,不然程序會繼續執行後續case中的語句。

for

for (var i=0;i<10;i++) {
  console.log(i);
}

while

var i = 0;
while (i < 10) {
  console.log(i);
  i++;
}

三元運算

var a = 1;
var b = 2;
var c = a > b ? a : b

六. 函數

函數定義

JavaScript中的函數和Python中的很是相似,只是定義方式有點區別。

// 普通函數定義
function f1() {
  console.log("Hello world!");
}

// 帶參數的函數
function f2(a, b) {
  console.log(arguments);  // 內置的arguments對象
  console.log(arguments.length);
  console.log(a, b);
}

// 帶返回值的函數
function sum(a, b){
  return a + b;
}
sum(1, 2);  // 調用函數

// 匿名函數方式
var sum = function(a, b){
  return a + b;
}
sum(1, 2);

// 當即執行函數
(function(a, b){
  return a + b;
})(1, 2);

補充:

ES6中容許使用「箭頭」(=>)定義函數。

var f = v => v;
// 等同於
var f = function(v){
  return v;
}

若是箭頭函數不須要參數或須要多個參數,就是用圓括號表明參數部分:

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

var sum = (num1, num2) => num1 + num2;
// 等同於
var sum = function(num1, num2){
  return num1 + num2;
}

函數中的arguments參數

function add(a,b){
  console.log(a+b);
  console.log(arguments.length)
}

add(1,2)

輸出:

3
2

注意:

函數只能返回一個值,若是要返回多個值,只能將其放在數組或對象中返回。

函數的全局變量和局部變量

局部變量:

在JavaScript函數內部聲明的變量(使用 var)是局部變量,因此只能在函數內部訪問它(該變量的做用域是函數內部)。只要函數運行完畢,本地變量就會被刪除。

全局變量:

在函數外聲明的變量是全局變量,網頁上的全部腳本和函數都能訪問它。

變量生存週期:

JavaScript變量的生命期從它們被聲明的時間開始。

局部變量會在函數運行之後被刪除。

全局變量會在頁面關閉後被刪除。

做用域

1.

var city = "BeiJing";
function f() {
  var city = "ShangHai";
  function inner(){
    var 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

3.閉包


var city = "BeiJing";
function f(){
    var city = "ShangHai";
    function inner(){
        console.log(city);
    }
    return inner;
}
var ret = f();
ret();

# shanghai

七. 內置對象和方法

avaScript中的全部事物都是對象:字符串、數字、數組、日期,等等。在JavaScript中,對象是擁有屬性和方法的數據。

咱們在學習基本數據類型的時候已經帶你們瞭解了,JavaScript中的Number對象、String對象、Array對象等。

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

自定義對象

JavaScript的對象(Object)本質上是鍵值對的集合(Hash結構),可是隻能用字符串做爲鍵。

var a = {"name": "Alex", "age": 18};
console.log(a.name);
console.log(a["age"]);

遍歷對象中的內容:

var a = {"name": "Alex", "age": 18};
for (var i in a){
  console.log(i, a[i]);
}

建立對象:

var person=new Object();  // 建立一個person對象
person.name="Alex";  // person對象的name屬性
person.age=18;  // person對象的age屬性

注意:

ES6中提供了Map數據結構。它相似於對象,也是鍵值對的集合,可是「鍵」的範圍不限於字符串,各類類型的值(包括對象)均可以當作鍵。

也就是說,Object結構提供了「字符串--值」的對應,Map結構提供了「值--值」的對應,是一種更完善的Hash結構實現。

map->

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

繼承:

// 父類構造函數
var Car = function (loc) {
  this.loc = loc;
};

// 父類方法
Car.prototype.move = function () {
  this.loc ++;
};

// 子類構造函數
var Van = function (loc) {
  Car.call(this, loc);
};

// 繼承父類的方法
Van.prototype = Object.create(Car.prototype);
// 修復 constructor
Van.prototype.constructor = Van;
// 擴展方法
Van.prototype.grab = function () {
  /* ... */
};

Data對象

建立Date對象

//方法1:不指定參數
var d1 = new Date();
console.log(d1.toLocaleString());
//方法2:參數爲日期字符串
var d2 = new Date("2004/3/20 11:12");
console.log(d2.toLocaleString());
var d3 = new Date("04/03/20 11:12");
console.log(d3.toLocaleString());
//方法3:參數爲毫秒數
var d3 = new Date(5000);
console.log(d3.toLocaleString());
console.log(d3.toUTCString());

//方法4:參數爲年月日小時分鐘秒毫秒
var d4 = new Date(2004,2,20,11,12,0,300);
console.log(d4.toLocaleString());  //毫秒並不直接顯示

Date對象的方法:

var d = new Date(); 
//getDate()                 獲取日
//getDay ()                 獲取星期
//getMonth ()               獲取月(0-11)
//getFullYear ()            獲取完全年份
//getHours ()               獲取小時
//getMinutes ()             獲取分鐘
//getSeconds ()             獲取秒
//getMilliseconds ()        獲取毫秒
//getTime ()                返回累計毫秒數(從1970/1/1午夜)

JSON對象

var str1 = '{"name": "Alex", "age": 18}';
var obj1 = {"name": "Alex", "age": 18};
// JSON字符串轉換成對象
var obj = JSON.parse(str1); 
// 對象轉換成JSON字符串
var str = JSON.stringify(obj1);

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)      返回角的正切。

RegExp對象

//RegExp對象

//建立正則對象方式1
// 參數1 正則表達式(不能有空格)
// 參數2 匹配模式:經常使用g(全局匹配;找到全部匹配,而不是在第一個匹配後中止)和i(忽略大小寫)

// 用戶名只能是英文字母、數字和_,而且首字母必須是英文字母。長度最短不能少於6位 最長不能超過12位。

// 建立RegExp對象方式(逗號後面不要加空格)
var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$");

// 匹配響應的字符串
var s1 = "bc123";

//RegExp對象的test方法,測試一個字符串是否符合對應的正則規則,返回值是true或false。
reg1.test(s1);  // true

// 建立方式2
// /填寫正則表達式/匹配模式(逗號後面不要加空格)
var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/;

reg2.test(s1);  // true


// String對象與正則結合的4個方法
var s2 = "hello world";

s2.match(/o/g);         // ["o", "o"]             查找字符串中 符合正則 的內容
s2.search(/h/g);        // 0                      查找字符串中符合正則表達式的內容位置
s2.split(/o/g);         // ["hell", " w", "rld"]  按照正則表達式對字符串進行切割
s2.replace(/o/g, "s");  // "hells wsrld"          對字符串按照正則進行替換

// 關於匹配模式:g和i的簡單示例
var s1 = "name:Alex age:18";

s1.replace(/a/, "哈哈哈");      // "n哈哈哈me:Alex age:18"
s1.replace(/a/g, "哈哈哈");     // "n哈哈哈me:Alex 哈哈哈ge:18"      全局匹配
s1.replace(/a/gi, "哈哈哈");    // "n哈哈哈me:哈哈哈lex 哈哈哈ge:18"  不區分大小寫


// 注意事項1:
// 若是regExpObject帶有全局標誌g,test()函數不是從字符串的開頭開始查找,而是從屬性regExpObject.lastIndex所指定的索引處開始查找。
// 該屬性值默認爲0,因此第一次仍然是從字符串的開頭查找。
// 當找到一個匹配時,test()函數會將regExpObject.lastIndex的值改成字符串中本次匹配內容的最後一個字符的下一個索引位置。
// 當再次執行test()函數時,將會從該索引位置處開始查找,從而找到下一個匹配。
// 所以,當咱們使用test()函數執行了一次匹配以後,若是想要從新使用test()函數從頭開始查找,則須要手動將regExpObject.lastIndex的值重置爲 0。
// 若是test()函數再也找不到能夠匹配的文本時,該函數會自動把regExpObject.lastIndex屬性重置爲 0。

var reg3 = /foo/g;
// 此時 regex.lastIndex=0
reg3.test('foo'); // 返回true
// 此時 regex.lastIndex=3
reg3.test('xxxfoo'); // 仍是返回true
// 因此咱們在使用test()方法校驗一個字符串是否徹底匹配時,必定要加上^和$符號。

// 注意事項2(說出來你可能不信系列):
// 當咱們不加參數調用RegExpObj.test()方法時, 至關於執行RegExpObj.test("undefined"), 而且/undefined/.test()默認返回true。
var reg4 = /^undefined$/;
reg4.test(); // 返回true
reg4.test(undefined); // 返回true
reg4.test("undefined"); // 返回true
相關文章
相關標籤/搜索