數據類型和變量
var 變量名;可以命名多個同名變量
let 變量名; 不可以命名同名變量
比較運算符:> < !=
==僅比較數值
===不僅比較數字,還比較數據類型
NaN是個特殊number,與所有數值不相等,與自己也不相等,但可以通過isNaN();函數判斷
//比較運算符
alert(3>5);//false
var a=10;
var b="10";
alert(a==b);//true == 只比較數值
alert(a===b);//false ===不僅比較數值,也比較數據類型
alert(NaN===NaN);//false NaN這個特殊的number與所有其他之都不相等,與自己也不相等
isNaN(NaN);//true
null和undefined
null表示一個空值,與0和空字符串不同;undefined表示值未定義
數組:
var arr=[1,123,13.4,"abc",null,undefined];
var arr=new Array(1,2,3);
對象:由鍵值組成的無序集合
var person={
name:"Bob",
age:13,
city:Beijing,
hobby:[js,c++,java]
};
//獲取對象屬性 對象名.屬性名
person.name;
變量命名只能用數字、字母、下劃線、美元符號$(區分大小寫)
字符串
字符串可以用單引號或雙引號引出,如果'本身是一個字符,可以用“”括起來
“I'm OK”是6個字符;字符串內' ‘’等也可以用轉義字符\標識;ASCII碼可以是\x##形式的十六進制表示
多行字符用反引號括起來
`這是一個
多行
字符串`;
多個字符串可以用+連接,或者使用模板字符串
字符串名.length;求長度
字符串名【索引號】;獲取相應位置的值,索引號從0開始
注意:字符串是不可變的,如果對字符串中的某個索引賦值,不會有任何錯誤也沒有任何效果
字符串名.toUpperCase()全部大寫
字符串名.toLowerCase()全部小寫
字符串名.indexof();搜索指定字符串出現位置
字符串名.substring(a,d);返回指定索引區間子串
字符串名.substring(a);返回指定索引到結束的子串
var name="小米";
var age=10;
var message='hello',${name},'你今年'+age+"歲了";
alert(message);
var message="小米"+"愛喫"+"玉米";
alert(message);
var s="hello";
s.length;//5
s.toUpperCase();//HELLO
s.toLowerCase();//hello
s.indexof(o);//4
s.substring(2,3);//ll
s.substring(2);//llo
數組
javascript的Array可以包含任意數據類型
通過索引訪問各元素
直接給Array的length賦一個新值會改變數組大小
可以通過索引改變對應元素的值
通過索引賦值時超出範圍也會改變數組大小
數組名.indexof(索引值);訪問索引對應值
數組名.slice(a,b);截取從索引a到b但不包括b的值
數組名.slice(a);截取從索引a到最後的值
數組名.push(值,值……);在末尾增加數據
數組名.pop();在末尾刪除一個數據
數組名.unshift(值,值……);從數組頭部增加值
數組名.shift();從數組頭部刪除值
數組名.sort();給數組排序
數組名.reverse();數組反轉
數組名.splice(a,b,值,值);從索引a刪除b個值,然後添加後邊元素;b爲零時不刪除只添加;沒有值時只刪除不添加
數組名.concat(值);連接並返回新數組
數組名.join("-");如果數組中的元素不是字符串,自動轉換爲字符串後以括號中 的字符連接
多維數組
var arr=[[1,2,3],["abc",a,9]];
var arr=[1,1.3,222,"abc",null];
arr.length;//5
arr.indexof(2);//222
arr.slice(2,4);//222,"abc"
arr.slice(3);//"abc",null
arr.push(1,3,"ccc");//[1,1.3,222,"abc",null,1,3,"ccc"]
arr.pop();//[1,1.3,222,"abc",null,1,3]
arr.unshift(4);//[4,1,1.3,222,"abc",null,1,3]
arr.shift();//[1,1.3,222,"abc",null,1,3]
var arr=['A','C','B'];
arr.sort();//['A','B','C']
arr.reverse();//['B','C','A']
ar arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
// 從索引2開始刪除3個元素,然後再添加兩個元素:
arr.splice(2, 3, 'Google', 'Facebook'); // 返回刪除的元素 ['Yahoo', 'AOL', 'Excite']
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
// 只刪除,不添加:
arr.splice(2, 2); // ['Google', 'Facebook']
arr; // ['Microsoft', 'Apple', 'Oracle']
// 只添加,不刪除:
arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因爲沒有刪除任何元素
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
var arr = ['A', 'B', 'C'];
var add = arr.concat([1, 2, 3]);
alert(add); // ['A', 'B', 'C', 1, 2, 3]
alert(arr); // ['A', 'B', 'C']
var arr=['A','B','C'];
arr.join('-');//'A-B-C'
對象
var person={
name:'小米',
age:10,
'study-school':'第一實驗小學'
}
person.name;//'小米'
person['age'];//10
person['study-school'];//'第一實驗小學'
對象的屬性都在{}花括號中以鍵:值的方式成對出現
訪問屬性: 對象名.鍵;但是鍵必須是有效變量
屬性爲有效變量或不是有效變量都可以用以下方式
例: ‘study-school’不是有效變量,只能用對象名【‘study-school’】獲取值
條件判斷
var a=3;
var b=5;
if(a>b){
alert('a大');
}else if(a=b){
alert('一般大');
}else{
alert('b大');
}
循環
var sum=0;
for(var i=0;i<10;i++){
sum=sum+i;
}
alert(sum);//45
var person={
name:'小米',
age:10,
school:'第一小學'
}
for(var key in person){
if(person.hasOwnProperty(key)){
console.log(key);//'小米','10','第一小學'
}
var arr=[1,2,3];
for(var i in arr){
console.log(i);
console.log(arr[i]);
}
var n=10
while(n>0){
console.log("hello");
n--;
}
}
do{
console.log('hello');
n--;
}while(n>0);
Map Set
先測試瀏覽器是否支持ES6規範
'use strict'
var m=new Map();
var s=new Set()
console.log("瀏覽器支持Map和Set");
map
一個鍵對應一個value,多次對同一個鍵放入值,後面的值會把前面的值沖掉
var map=new Map([["小米",90],["小明",80]]);
//或
var map=new Map();
map.set("吉姆",70);//增加鍵值對
map.has("吉姆");//查看是否存在鍵,true存在
map.get("吉姆");//70
map.delete("吉姆");//刪除鍵值對
map.get("tom");//undefined
set
set是一組鍵集合,但是不存儲value,鍵不能重複,重複的元素自動被過濾
var s=new Set();
var s=new Set(['1',1,1,2,4,5]);//Set{'1',1,2,4,5}
s.add(6);//Set{'1',1,2,4,5,6}
s.delete(2);//Set{'1',1,4,5,6}
Map和Set不能用下標遍歷,爲同一集合類型,ES6標準引入iterable類型,Map、Set和Array都屬於此類型
用for……of遍歷
檢查瀏覽器是否支持
'use strict'
var a=[1,2,3];
for(var x of a){
}
console.log('瀏覽器支持');
for……in遍歷的是對象的屬性名稱;當array對象添加額外屬性後可以看出
var arr=[1,2,3];
arr.name='hello';
for(var x in arr){
console.log(x);//'0','1','2','name'
}//for in循環把name包括在內,但arr的length屬性卻不包括在內
for……of遍歷的是集合本身元素
iterable內置forEach()方法,接受一個函數,每次迭代就回調該函數
var a=['a','b','c'];
a.forEach(function(element,index,array){
//element 指向當前元素的值
//index 指向當前索引
//array 指向Array對象本身
console.log(element+',index='+index);
});
var map=new Map(['a',4],['b',2]);
map.forEach(function(value,key,map){
console.log(value);
});
var s=new Set([1,2,4]);
s.forEach(function(element,sameElement,set){
console.log(element);
});
函數
//方式一
/**
*function 函數名(【形式參數】){
* 函數體;
* 【return;】
*}
*
*/
function abc(x){
return x;
}
//方式二
/**
*var 函數名=function(【形式參數】){
* 函數體;
* 【return;】
*}
*
*/
funct
var abc=function(x){return x;}
一旦執行到return時執行完畢,返回結果,如果沒有return則返回unfinished
調用函數時允許傳入任意個參數而不影響調用
調用函數時傳入的參數少也可以,少的參數用undefined代替
避免收到undefined,可以對參數進行檢查
function abs(x) {
if (typeof x !== 'number') {
throw 'Not a number';
}
if (x >= 0) {
return x;
} else {
return -x;
}
}
argument只在函數內部起作用,永遠指向當前函數調用者傳入的所有參數,類似數組但不是數組,argument【i】;
rest參數是除去輸入對應形參的參數之外的元素的數組,rest參數用...標識,只能寫在形參最後
function foo(a, b, ...rest) {
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
foo(1, 2, 3, 4, 5);
// 結果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]
foo(1);
// 結果:
// a = 1
// b = undefined
// Array []
測試瀏覽器是否支持`
'use strict'
function sum(...rest){
}
// 測試:
var i, args = [];
for (i=1; i<=100; i++) {
args.push(i);
}
if (sum() !== 0) {
console.log('測試失敗: sum() = ' + sum());
} else if (sum(1) !== 1) {
console.log('測試失敗: sum(1) = ' + sum(1));
} else if (sum(2, 3) !== 5) {
console.log('測試失敗: sum(2, 3) = ' + sum(2, 3));
} else if (sum.apply(null, args) !== 5050) {
console.log('測試失敗: sum(1, 2, 3, ..., 100) = ' + sum.apply(null, args));
} else {
console.log('測試通過!');
}