1.字串一些常用方法,注意,呼叫這些方法本身不會改變原有字串的內容,而是傳回一個新字串。
toUpperCase()
把字串全部變成大寫:
var s = 'Hello'; s.toUpperCase(); // 返回'HELLO'
toLowerCase()
把字串全部變成小寫:
var s = 'Hello';var lower = s.toLowerCase(); // 返回'hello'并赋值给变量lowerlower; // 'hello'
indexOf()
會搜尋指定字串出現的位置:
var s = 'hello, world'; s.indexOf('world'); // 返回7s.indexOf('World'); // 没有找到指定的子串,返回-1
substring()
傳回指定索引區間的子字串:
var s = 'hello, world's.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello's.substring(7); // 从索引7开始到结束,返回'world'
2.陣列常用方法
indexOf()
來搜尋一個指定的元素的位置
var arr = [10, 20, '30', 'xyz']; arr.indexOf(10); // 元素10的索引为0arr.indexOf(20); // 元素20的索引为1arr.indexOf(30); // 元素30没有找到,返回-1arr.indexOf('30'); // 元素'30'的索引为2
slice()
截取Array的部分元素,然後傳回一個新的Array:
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: ['A', 'B', 'C']arr.slice(3); // 从索引3开始到结束: ['D', 'E', 'F', 'G']
如果不給slice()傳遞任何參數,它會從頭到尾截取所有元素。利用這一點,我們可以很容易地複製一個Array。
push和pop
push()在Array的最後加上若干元素,pop()則把Array的最後一個元素刪除掉:
var arr = [1, 2]; arr.push('A', 'B'); // 返回Array新的长度: 4arr; // [1, 2, 'A', 'B']arr.pop(); // pop()返回'B'arr; // [1, 2, 'A']arr.pop(); arr.pop(); arr.pop(); // 连续pop 3次arr; // []arr.pop(); // 空数组继续pop不会报错,而是返回undefinedarr; // []
#unshift和shift
var arr = [1, 2]; arr.unshift('A', 'B'); // 返回Array新的长度: 4arr; // ['A', 'B', 1, 2]arr.shift(); // 'A'arr; // ['B', 1, 2]arr.shift(); arr.shift(); arr.shift(); // 连续shift 3次arr; // []arr.shift(); // 空数组继续shift不会报错,而是返回undefinedarr; // []sort
對目前Array進行排序,它會直接修改目前Array的元素位置,直接呼叫時,依照預設順序排序:
var arr = ['B', 'C', 'A']; arr.sort(); arr; // ['A', 'B', 'C']reverse
把整個Array的元素給掉個個,也就是反轉:
var arr = ['one', 'two', 'three']; arr.reverse(); arr; // ['three', 'two', 'one']
splice
修改Array的“萬能方法”,它可以從指定的索引開始刪除若干元素,然後再從該位置添加若干元素
var 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']
concat
把當前的Array和另一個Array連接起來,並返回一個新的Array
var arr = ['A', 'B', 'C'];var added = arr.concat([1, 2, 3]); added; // ['A', 'B', 'C', 1, 2, 3]arr; // ['A', 'B', 'C']
#join
var arr = ['A', 'B', 'C', 1, 2, 3]; arr.join('-'); // 'A-B-C-1-2-3'
3.物件
由於JavaScript的物件是動態類型,你可以自由地為一個物件新增或刪除屬性:
var xiaoming = { name: '小明'}; xiaoming.age; // undefinedxiaoming.age = 18; // 新增一个age属性xiaoming.age; // 18delete xiaoming.age; // 删除age属性xiaoming.age; // undefineddelete xiaoming['name']; // 删除name属性xiaoming.name; // undefineddelete xiaoming.school; // 删除一个不存在的school属性也不会报错
檢測xiaoming是否擁有某一屬性,可以用in操作符:
var xiaoming = { name: '小明', birth: 1990, school: 'No.1 Middle School', height: 1.70, weight: 65, score: null};'name' in xiaoming; // true'grade' in xiaoming; // false不過要小心,如果in判斷一個屬性存在,這個屬性不一定是xiaoming的,它可能是xiaoming繼承得到的:
要判斷一個屬性是否是xiaoming本身擁有的,而不是繼承得到的,可以用hasOwnProperty()方法:
var xiaoming = { name: '小明'}; xiaoming.hasOwnProperty('name'); // truexiaoming.hasOwnProperty('toString'); // false
ES6規範引進了新的資料型別Map,Set
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]); m.get('Michael'); // 95var s1 = new Set(); // 空Setvar s2 = new Set([1, 2, 3]); // 含1, 2, 3
ES6標準引進了新的iterable型別(可逸代)
Array、Map和Set都屬於iterable型別。
透過新的for ... of迴圈來遍歷
var a = ['A', 'B', 'C'];var s = new Set(['A', 'B', 'C']);var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);for (var x of a) { // 遍历Array alert(x); }for (var x of s) { // 遍历Set alert(x); }for (var x of m) { // 遍历Mapalert(x[0] + '=' + x[1]); }
4.函數
免費贈送的關鍵字arguments,它只在函數內部運作,並且永遠指向當前函數的呼叫者傳入的所有參數。 arguments類似Array但它不是一個Array。
function foo(x) { alert(x); // 10for (var i=0; i<arguments.length; i++) { alert(arguments[i]); // 10, 20, 30 } } foo(10, 20, 30);
Max是一個JavaScript新手,他寫了一個max()函數,傳回兩個數字中較大的數字:
document.write(Math.max(7.25,7.30));
5.變數作用域
ES6引進了新的關鍵字let,用let取代var可以申明一個區塊級作用域的變數
'use strict';function foo() {var sum = 0;for (let i=0; i<100; i++) { sum += i; } i += 1; // SyntaxError}
ES6標準引入了新的關鍵字const來定義常數,const與let都具有區塊級作用域
const PI = 3.14; PI = 3; // 某些浏览器不报错,但是无效果!PI; // 3.14
6.高階函數
map( )方法定義在JavaScript的Array中,我們呼叫Array的map()方法,傳入我們自己的函數,就得到了一個新的Array作為結果。
function pow(x) {return x * x; }var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce()把一個函數作用在這個Array的[x1, x2, x3...]上,這個函數必須接收兩個參數,reduce()把結果繼續和序列的下一個元素做累積計算,其效果就是:
[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)var arr = [1, 3, 5, 7, 9]; arr.reduce(function (x, y) {return x + y; }); // 25
#filter也是一個常用的操作,它用來過濾Array的某些元素掉,然後回傳剩下的元素。
把傳入的函數依序作用在每個元素,然後根據回傳值是true還是false決定保留還是丟棄該元素。
例如,在一個Array中,刪掉偶數,只保留奇數
var arr = [1, 2, 4, 5, 6, 9, 10, 15];var r = arr.filter(function (x) {return x % 2 !== 0; }); r; // [1, 5, 9, 15]
把一個Array中的空字串刪掉,可以這麼寫:
var arr = ['A', '', 'B', null, undefined, 'C', ' '];var r = arr.filter(function (s) {return s && s.trim(); // 注意:IE9以下的版本没有trim()方法}); r; // ['A', 'B', 'C']
匿名的函數(沒有函數名稱的函數)
var friends = ["Mike", "Stacy", "Andy", "Rick"]; friends.forEach(function (eachName, index){ console.log(index + 1 + ". " + eachName); // 1. Mike, 2. Stacy, 3. Andy, 4. Rick});
sort排序演算法
// 看上去正常的结果:['Google', 'Apple', 'Microsoft'].sort(); // ['Apple', 'Google', 'Microsoft'];// apple排在了最后:['Google', 'apple', 'Microsoft'].sort(); // ['Google', 'Microsoft", 'apple']// 无法理解的结果:[10, 20, 1, 2].sort(); // [1, 10, 2, 20]
第二个排序把apple排在了最后,是因为字符串根据ASCII码进行排序,而小写字母a的ASCII码在大写字母之后。
第三个排序结果是什么鬼?简单的数字排序都能错?
这是因为Array的sort()方法默认把所有元素先转换为String再排序,结果'10'排在了'2'的前面,因为字符'1'比字符'2'的ASCII码小。
7闭包
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回
function lazy_sum(arr) {var sum = function () {return arr.reduce(function (x, y) {return x + y; }); }return sum; }
当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数:
var f = lazy_sum([1, 2, 3, 4, 5]); // function sum()
调用函数f时,才真正计算求和的结果:
f(); // 15
在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。
请再注意一点,当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数:
var f1 = lazy_sum([1, 2, 3, 4, 5]);var f2 = lazy_sum([1, 2, 3, 4, 5]); f1 === f2; // false
f1()和f2()的调用结果互不影响。
8.箭头函数
ES6标准新增了一种新的函数:Arrow Function(箭头函数)。
为什么叫Arrow Function?因为它的定义用的就是一个箭头:
x => x * x
上面的箭头函数相当于:
function (x) {return x * x; }
generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。
function* foo(x) { yield x + 1; yield x + 2;return x + 3; }
函数在执行过程中,如果没有遇到return语句(函数末尾如果没有return,就是隐含的return undefined;),控制权无法交回被调用的代码。
以上是JavaScript常用定義和方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!