JavaScript嚴(yán)格執(zhí)行

strict模式

啟用strict模式的方法是在JavaScript代碼的第一行寫(xiě)上:
'use strict';
  • 數(shù)據(jù)類(lèi)型

Number

1.計(jì)算機(jī)中的float類(lèi)型都是不能直接比較的
2.NaN:not a number,表示無(wú)法計(jì)算結(jié)果。
3.Infinity:表示無(wú)限大。

比較運(yùn)算符

1.==,它會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類(lèi)型再比較,很多時(shí)候,會(huì)得到非常詭異的結(jié)果;
2.===,它不會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類(lèi)型,如果數(shù)據(jù)類(lèi)型不一致,返回false,如果一致,再比較;
3.不要使用==比較,始終堅(jiān)持使用===比較。
4.NaN這個(gè)特殊的number與所有其他值都不相等,包括它自己。NaN===NaN;//false
4.所以,判斷NaN只能通過(guò)isNaN()函數(shù)。isNaN(NaN);//true
5.要比較兩個(gè)浮點(diǎn)數(shù)是否相等,只能計(jì)算它們之差的絕對(duì)值,看是否小于某個(gè)閾值。
    1 / 3 === (1 - 2 / 3); // false
    Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true

null 與 undefined

null表示一個(gè)“空”的值,它和0以及空字符串''不同,
0是一個(gè)數(shù)值,''表示長(zhǎng)度為0的字符串,而null表示“空”。
還有一個(gè)和null類(lèi)似的undefined,它表示“未定義”。
JavaScript的設(shè)計(jì)者希望用null表示一個(gè)空的值,而undefined表示值未定義。
事實(shí)證明,這并沒(méi)有什么卵用,區(qū)分兩者的意義不大。
大多數(shù)情況下,我們都應(yīng)該用null。undefined僅僅在判斷函數(shù)參數(shù)是否傳遞的情況下有用。

String

*需要特別注意的是*,字符串是不可變的,
如果對(duì)字符串的某個(gè)索引賦值,不會(huì)有任何錯(cuò)誤,但是,也沒(méi)有任何效果。
而JavaScript為字符串提供的一些常用方法,注意,調(diào)用這些方法本身不會(huì)改變?cè)凶址膬?nèi)容,而是返回一個(gè)新字符串。

數(shù)組

1.JavaScript的Array可以包含任意數(shù)據(jù)類(lèi)型,并通過(guò)索引來(lái)訪問(wèn)每個(gè)元素。
var arr = [1, 2, 3.14, 'Hello', null, true];
2.要取得Array的長(zhǎng)度,直接訪問(wèn)length屬性。
arr.length; // 6
3.*請(qǐng)注意*,直接給Array的length賦一個(gè)新的值會(huì)導(dǎo)致Array大小的變化。
  var arr = [1, 2, 3];
  arr.length; // 3
  arr.length = 6;
  arr; // arr變?yōu)閇1, 2, 3, undefined, undefined, undefined]
  arr.length = 2;
  arr; // arr變?yōu)閇1, 2]
4.*請(qǐng)注意*,如果通過(guò)索引賦值時(shí),索引超過(guò)了范圍,同樣會(huì)引起Array大小的變化。
  var arr = [1, 2, 3];
  arr[5] = 'x';
  arr; // arr變?yōu)閇1, 2, 3, undefined, undefined, 'x']
但是,如果僅是訪問(wèn)而沒(méi)有賦值是不會(huì)改變的。
  var a=[1,2,3];
  alert(a);//1,2,3
  var x=a[5];
  alert(a[5]);//undefined
  alert(a);//1,2,3

對(duì)象

JavaScript的對(duì)象是一種無(wú)序的集合數(shù)據(jù)類(lèi)型,它由若干鍵值對(duì)組成。
var xiaoming = {
    name: '小明',
    birth: 1990,
    'middle-school': 'No.1 Middle School',
    height: 1.70,
    weight: 65,
    score: null
};
訪問(wèn)屬性是通過(guò).操作符完成的,但這要求屬性名必須是一個(gè)有效的變量名。如果屬性名包含特殊字符,就必須用''括起來(lái):
xiaoming.name; // '小明'
xiaoming.birth; // 1990
xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小明'
xiaohong.name; // '小明'
如果訪問(wèn)一個(gè)不存在的屬性會(huì)返回什么呢?JavaScript規(guī)定,訪問(wèn)不存在的屬性不報(bào)錯(cuò),而是返回undefined。
由于JavaScript的對(duì)象是動(dòng)態(tài)類(lèi)型,你可以自由地給一個(gè)對(duì)象添加或刪除屬性:
var xiaoming = {
    name: '小明'
};
xiaoming.age; // undefined
xiaoming.age = 18; // 新增一個(gè)age屬性
xiaoming.age; // 18
delete xiaoming.age; // 刪除age屬性
xiaoming.age; // undefined
delete xiaoming['name']; // 刪除name屬性
xiaoming.name; // undefined
delete xiaoming.school; // 刪除一個(gè)不存在的school屬性也不會(huì)報(bào)錯(cuò)
要判斷一個(gè)屬性是否是xiaoming自身?yè)碛械模皇抢^承得到的,可以用hasOwnProperty()方法:
var xiaoming = {
    name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false

條件判斷

JavaScript把null、undefined、0、NaN和空字符串''視為false,其他值一概視為true。

Map和Set

1.JavaScript的默認(rèn)對(duì)象表示方式{}可以視為其他語(yǔ)言中的Map或Dictionary的數(shù)據(jù)結(jié)構(gòu),即一組鍵值對(duì)。
2.但是JavaScript的對(duì)象有個(gè)小問(wèn)題,就是鍵必須是字符串。
  但實(shí)際上Number或者其他數(shù)據(jù)類(lèi)型作為鍵也是非常合理的。
  為了解決這個(gè)問(wèn)題,最新的ES6規(guī)范引入了新的數(shù)據(jù)類(lèi)型Map。
  var m = new Map();
  var s = new Set();
3.初始化Map需要一個(gè)二維數(shù)組,或者直接初始化一個(gè)空Map。Map具有以下方法:
  var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
  m.get('Michael'); // 95
  var m = new Map(); // 空Map
  m.set('Adam', 67); // 添加新的key-value
  m.set('Bob', 59);
  m.has('Adam'); // 是否存在key 'Adam': true
  m.get('Adam'); // 67
  m.delete('Adam'); // 刪除key 'Adam'
  m.get('Adam'); // undefined
4.在Set中,沒(méi)有重復(fù)的key。
  要?jiǎng)?chuàng)建一個(gè)Set,需要提供一個(gè)Array作為輸入,或者直接創(chuàng)建一個(gè)空Set:
  var s1 = new Set(); // 空Set
  var s2 = new Set([1, 2, 3]); // 含1, 2, 3
  重復(fù)元素在Set中自動(dòng)被過(guò)濾:
  var s = new Set([1, 2, 3, 3, '3']);
  s; // Set {1, 2, 3, "3"}
5.通過(guò)add(key)方法可以添加元素到Set中,可以重復(fù)添加,但不會(huì)有效果,
  通過(guò)delete(key)方法可以刪除元素。

iterable

1.遍歷Array可以采用下標(biāo)循環(huán),遍歷Map和Set就無(wú)法使用下標(biāo)。
2.for ... in循環(huán)由于歷史遺留問(wèn)題,它遍歷的實(shí)際上是對(duì)象的屬性名稱(chēng)。
  一個(gè)Array數(shù)組實(shí)際上也是一個(gè)對(duì)象,它的每個(gè)元素的索引被視為一個(gè)屬性。
  當(dāng)我們手動(dòng)給Array對(duì)象添加了額外的屬性后,for ... in循環(huán)將帶來(lái)意想不到的意外效果:
  var a = ['A', 'B', 'C'];
  a.name = 'Hello';
  for (var x in a) {
    alert(x); // '0', '1', '2', 'name'
  }
3.for ... of循環(huán)則完全修復(fù)了這些問(wèn)題,它只循環(huán)集合本身的元素:
  var a = ['A', 'B', 'C'];
  a.name = 'Hello';
  for (var x of a) {
    alert(x); // 'A', 'B', 'C'
  }
4.更好的方式是直接使用iterable內(nèi)置的forEach方法,
  它接收一個(gè)函數(shù),每次迭代就自動(dòng)回調(diào)該函數(shù)
  var a = ['A', 'B', 'C'];
  a.forEach(function (element, index, array) {
    // element: 指向當(dāng)前元素的值
    // index: 指向當(dāng)前索引
    // array: 指向Array對(duì)象本身
    alert(element);
  });
  Set與Array類(lèi)似,但Set沒(méi)有索引,因此回調(diào)函數(shù)的前兩個(gè)參數(shù)都是元素本身:
  var s = new Set(['A', 'B', 'C']);
  s.forEach(function (element, sameElement, set) {
    alert(element);
  });
  Map的回調(diào)函數(shù)參數(shù)依次為value、key和map本身:
  var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
  m.forEach(function (value, key, map) {
    alert(value);
  });
  如果對(duì)某些參數(shù)不感興趣,由于JavaScript的函數(shù)調(diào)用不要求參數(shù)必須一致,因此可以忽略它們。
  例如,只需要獲得Array的element:
  var a = ['A', 'B', 'C'];
  a.forEach(function (element) {
    alert(element);
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容