【沒人看系列】js 數(shù)據(jù)類型

本文為作者JavaScript學(xué)習(xí)筆記升酣,只是加強(qiáng)個(gè)人理解和認(rèn)識(shí)东亦。大部分概念與代碼參考了阮一峰 js 教程


基本

1. 語(yǔ)句

語(yǔ)句(statement)是為了完成某種任務(wù)而進(jìn)行的操作

語(yǔ)句和表達(dá)式的區(qū)別在于欲低,前者主要為了進(jìn)行某種操作讯私,一般情況下不需要返回值愕乎;后者則是為了得到返回值呻此,一定會(huì)返回一個(gè)值。

2. 變量

變量是對(duì)“值”的具名引用趁仙。變量就是為“值”起名洪添,然后引用這個(gè)名字,就等同于引用這個(gè)值雀费。變量的名字就是變量名干奢。

變量的聲明和賦值,是分開的兩個(gè)步驟
如果只是聲明變量而沒有賦值盏袄,則該變量的值是==undefined==忿峻。==undefined==是一個(gè)特殊的值薄啥,表示“無(wú)定義”。

變量提升

JavaScript 引擎的工作方式是逛尚,先解析代碼垄惧,獲取所有被聲明的變量,然后再一行一行地運(yùn)行黑低。這造成的結(jié)果赘艳,就是所有的變量的聲明語(yǔ)句酌毡,都會(huì)被提升到代碼的頭部克握,這就叫做變量提升(hoisting)。

8.判斷

switch語(yǔ)句后面的表達(dá)式枷踏,與case語(yǔ)句后面的表示式比較運(yùn)行結(jié)果時(shí)菩暗,采用的是嚴(yán)格相等運(yùn)算符(===),而不是相等運(yùn)算符(==)旭蠕,這意味著比較時(shí)不會(huì)發(fā)生類型轉(zhuǎn)換停团。

7.do...while 循環(huán)

do...while循環(huán)與while循環(huán)類似,唯一的區(qū)別就是先運(yùn)行一次循環(huán)體掏熬,然后判斷循環(huán)條件佑稠。

不管條件是否為真,do...while循環(huán)至少運(yùn)行一次旗芬,這是這種結(jié)構(gòu)最大的特點(diǎn)舌胶。另外,while語(yǔ)句后面的分號(hào)注意不要省略疮丛。

數(shù)據(jù)類型概述

1. 簡(jiǎn)介

js 有6種數(shù)據(jù)類型, es6 又新增了第7種symbol

布爾值

下列運(yùn)算符會(huì)返回布爾值:

  • 前置邏輯運(yùn)算符: ! (Not)

  • 相等運(yùn)算符:===幔嫂,!====誊薄,!=

  • 比較運(yùn)算符:>履恩,>=<呢蔫,<=

    如果 JavaScript 預(yù)期某個(gè)位置應(yīng)該是布爾值切心,會(huì)將該位置上現(xiàn)有的值自動(dòng)轉(zhuǎn)為布爾值。轉(zhuǎn)換規(guī)則是除了下面六個(gè)值被轉(zhuǎn)為false片吊,其他值都視為true昙衅。

    • undefined
    • null
    • false
    • 0
    • NaN
    • ""''(空字符串)

注意,空數(shù)組([])和空對(duì)象({})對(duì)應(yīng)的布爾值定鸟,都是true而涉。

數(shù)值

NaN不等于任何值,包括它本身联予。

與數(shù)值相關(guān)的全局方法

parseInt()

parseInt方法用于將字符串轉(zhuǎn)為整數(shù)啼县。

parseInt('123') // 123

如果parseInt的參數(shù)不是字符串材原,則會(huì)先轉(zhuǎn)為字符串再轉(zhuǎn)換。

parseInt(1.23) // 1
// 等同于
parseInt('1.23') // 1

字符串轉(zhuǎn)為整數(shù)的時(shí)候季眷,是一個(gè)個(gè)字符依次轉(zhuǎn)換余蟹,如果遇到不能轉(zhuǎn)為數(shù)字的字符,就不再進(jìn)行下去子刮,返回已經(jīng)轉(zhuǎn)好的部分威酒。

parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt('15e2') // 15
parseInt('15px') // 15

parseFloat()

parseFloat方法用于將一個(gè)字符串轉(zhuǎn)為浮點(diǎn)數(shù)。

isNaN()

isNaN方法可以用來(lái)判斷一個(gè)值是否為NaN挺峡。isNaN只對(duì)數(shù)值有效葵孤,如果傳入其他值,會(huì)被先轉(zhuǎn)成數(shù)值.也就是說橱赠,isNaNtrue的值尤仍,有可能不是NaN,而是一個(gè)字符串狭姨。

isFinite()

isFinite方法返回一個(gè)布爾值宰啦,表示某個(gè)值是否為正常的數(shù)值。除了Infinity饼拍、-Infinity赡模、NaNundefined這幾個(gè)值會(huì)返回falseisFinite對(duì)于其他的數(shù)值都會(huì)返回true师抄。

字符串

如果要在單引號(hào)字符串的內(nèi)部漓柑,使用單引號(hào),就必須在內(nèi)部的單引號(hào)前面加上反斜杠司澎,用來(lái)轉(zhuǎn)義欺缘。雙引號(hào)字符串內(nèi)部使用雙引號(hào),也是如此挤安。

轉(zhuǎn)義

\n表示換行谚殊,輸出的時(shí)候就分成了兩行。

字符串與數(shù)組

符串可以被視為字符數(shù)組蛤铜,因此可以使用數(shù)組的方括號(hào)運(yùn)算符嫩絮,無(wú)法改變字符串之中的單個(gè)字符。

length屬性返回字符串的長(zhǎng)度围肥,該屬性也是無(wú)法改變的剿干。

Base64 轉(zhuǎn)碼

JavaScript 原生提供兩個(gè) Base64 相關(guān)的方法。

  • btoa():任意值轉(zhuǎn)為 Base64 編碼
  • atob():Base64 編碼轉(zhuǎn)為原來(lái)的值

對(duì)象

簡(jiǎn)單說穆刻,對(duì)象就是一組“鍵值對(duì)”(key-value)的集合置尔,是一種無(wú)序的復(fù)合數(shù)據(jù)集合。

對(duì)象的每一個(gè)鍵名又稱為“屬性”(property)氢伟,它的“鍵值”可以是任何數(shù)據(jù)類型榜轿。如果一個(gè)屬性的值為函數(shù)幽歼,通常把這個(gè)屬性稱為“方法”,它可以像函數(shù)那樣調(diào)用谬盐。

對(duì)象的引用

如果不同的變量名指向同一個(gè)對(duì)象甸私,那么它們都是這個(gè)對(duì)象的引用,也就是說指向同一個(gè)內(nèi)存地址飞傀。修改其中一個(gè)變量皇型,會(huì)影響到其他所有變量。

如果取消某一個(gè)變量對(duì)于原對(duì)象的引用砸烦,不會(huì)影響到另一個(gè)變量弃鸦。

這種引用只局限于對(duì)象,如果兩個(gè)變量指向同一個(gè)原始類型的值外冀。那么寡键,變量這時(shí)都是值的拷貝掀泳。

屬性的讀取

讀取對(duì)象的屬性雪隧,有兩種方法,一種是使用點(diǎn)運(yùn)算符员舵,還有一種是使用方括號(hào)運(yùn)算符脑沿。

var obj = {
  p: 'Hello World'
};

obj.p // "Hello World"
obj['p'] // "Hello World"

請(qǐng)注意,如果使用方括號(hào)運(yùn)算符马僻,鍵名必須放在引號(hào)里面庄拇,否則會(huì)被當(dāng)作變量處理。

var foo = 'bar';

var obj = {
  foo: 1,
  bar: 2
};

obj.foo  // 1
obj[foo]  // 2

上面代碼中韭邓,引用對(duì)象objfoo屬性時(shí)措近,如果使用點(diǎn)運(yùn)算符,foo就是字符串女淑;如果使用方括號(hào)運(yùn)算符瞭郑,但是不使用引號(hào),那么foo就是一個(gè)變量鸭你,指向字符串bar屈张。

屬性的賦值

點(diǎn)運(yùn)算符和方括號(hào)運(yùn)算符,不僅可以用來(lái)讀取值袱巨,還可以用來(lái)賦值阁谆。

JavaScript 允許屬性的“后綁定”,也就是說愉老,你可以在任意時(shí)刻新增屬性场绿,沒必要在定義對(duì)象的時(shí)候,就定義好屬性嫉入。

屬性的查看

查看一個(gè)對(duì)象本身的所有屬性焰盗,可以使用Object.keys方法贱鄙。

var obj = {
  key1: 1,
  key2: 2
};

Object.keys(obj);
// ['key1', 'key2']

屬性的刪除:delete 命令

delete命令用于刪除對(duì)象的屬性,刪除成功后返回true姨谷。

注意逗宁,刪除一個(gè)不存在的屬性,delete不報(bào)錯(cuò)梦湘,而且返回true瞎颗。

var obj = { p: 1 };
Object.keys(obj) // ["p"]

delete obj.p // true
obj.p // undefined
Object.keys(obj) // []

屬性是否存在:in 運(yùn)算符

in運(yùn)算符用于檢查對(duì)象是否包含某個(gè)屬性(注意,檢查的是鍵名捌议,不是鍵值)哼拔,如果包含就返回true,否則返回false瓣颅。它的左邊是一個(gè)字符串倦逐,表示屬性名,右邊是一個(gè)對(duì)象宫补。

var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true

in運(yùn)算符的一個(gè)問題是檬姥,它不能識(shí)別哪些屬性是對(duì)象自身的,哪些屬性是繼承的粉怕。就像上面代碼中健民,對(duì)象obj本身并沒有toString屬性,但是in運(yùn)算符會(huì)返回true贫贝,因?yàn)檫@個(gè)屬性是繼承的秉犹。

這時(shí),可以使用對(duì)象的hasOwnProperty方法判斷一下稚晚,是否為對(duì)象自身的屬性崇堵。

var obj = {};
if ('toString' in obj) {
  console.log(obj.hasOwnProperty('toString')) // false
}

屬性的遍歷:for...in 循環(huán)

for...in循環(huán)用來(lái)遍歷一個(gè)對(duì)象的全部屬性。

var obj = {a: 1, b: 2, c: 3};

for (var i in obj) {
  console.log('鍵名:', i);
  console.log('鍵值:', obj[i]);
}

如果繼承的屬性是可遍歷的客燕,那么就會(huì)被for...in循環(huán)遍歷到鸳劳。但是,一般情況下幸逆,都是只想遍歷對(duì)象自身的屬性棍辕,所以使用for...in的時(shí)候,應(yīng)該結(jié)合使用hasOwnProperty方法还绘,在循環(huán)內(nèi)部判斷一下楚昭,某個(gè)屬性是否為對(duì)象自身的屬性。

var person = { name: '老張' };

for (var key in person) {
  if (person.hasOwnProperty(key)) {
    console.log(key);
  }
}

with 語(yǔ)句

with語(yǔ)句的格式如下:

with (對(duì)象) {
  語(yǔ)句;
}

它的作用是操作同一個(gè)對(duì)象的多個(gè)屬性時(shí)拍顷,提供一些書寫的方便抚太。

// 例一
var obj = {
  p1: 1,
  p2: 2,
};
with (obj) {
  p1 = 4;
  p2 = 5;
}
// 等同于
obj.p1 = 4;
obj.p2 = 5;

// 例二
with (document.links[0]){
  console.log(href);
  console.log(title);
  console.log(style);
}
// 等同于
console.log(document.links[0].href);
console.log(document.links[0].title);
console.log(document.links[0].style);

注意,如果with區(qū)塊內(nèi)部有變量的賦值操作,必須是當(dāng)前對(duì)象已經(jīng)存在的屬性尿贫,否則會(huì)創(chuàng)造一個(gè)當(dāng)前作用域的全局變量电媳。 建議不使用with語(yǔ)句

函數(shù)

函數(shù)是一段可以反復(fù)調(diào)用的代碼塊。函數(shù)還能接受輸入的參數(shù)庆亡,不同的參數(shù)會(huì)返回不同的值匾乓。

1.概述

1.1 函數(shù)的聲明

JavaScript 有三種聲明函數(shù)的方法。

1)function 命令

function命令聲明的代碼區(qū)塊又谋,就是一個(gè)函數(shù)拼缝。function命令后面是函數(shù)名,函數(shù)名后面是一對(duì)圓括號(hào)彰亥,里面是傳入函數(shù)的參數(shù)咧七。函數(shù)體放在大括號(hào)里面。

function print(s) {
  console.log(s);
}

上面的代碼命名了一個(gè)print函數(shù)任斋,以后使用print()這種形式继阻,就可以調(diào)用相應(yīng)的代碼。這叫做函數(shù)的聲明(Function Declaration)废酷。

(2)函數(shù)表達(dá)式

除了用function命令聲明函數(shù)瘟檩,還可以采用變量賦值的寫法。

var print = function(s) {
  console.log(s);
};

這種寫法將一個(gè)匿名函數(shù)賦值給變量锦积。這時(shí)芒帕,這個(gè)匿名函數(shù)又稱函數(shù)表達(dá)式(Function Expression)歉嗓,因?yàn)橘x值語(yǔ)句的等號(hào)右側(cè)只能放表達(dá)式丰介。

采用函數(shù)表達(dá)式聲明函數(shù)時(shí),function命令后面不帶有函數(shù)名鉴分。如果加上函數(shù)名哮幢,該函數(shù)名只在函數(shù)體內(nèi)部有效,在函數(shù)體外部無(wú)效志珍。

(3)Function 構(gòu)造函數(shù)

第三種聲明函數(shù)的方式是Function構(gòu)造函數(shù)橙垢。

總的來(lái)說,這種聲明函數(shù)的方式非常不直觀伦糯,幾乎無(wú)人使用柜某。

1.2 函數(shù)的重復(fù)聲明

如果同一個(gè)函數(shù)被多次聲明,后面的聲明就會(huì)覆蓋前面的聲明敛纲。

function f() {
  console.log(1);
}
f() // 2

function f() {
  console.log(2);
}
f() // 2

上面代碼中喂击,后一次的函數(shù)聲明覆蓋了前面一次。而且淤翔,由于函數(shù)名的提升(參見下文)翰绊,前一次聲明在任何時(shí)候都是無(wú)效的,這一點(diǎn)要特別注意。

1.3 圓括號(hào)運(yùn)算符监嗜,return 語(yǔ)句和遞歸

調(diào)用函數(shù)時(shí)谐檀,要使用圓括號(hào)運(yùn)算符。圓括號(hào)之中裁奇,可以加入函數(shù)的參數(shù)桐猬。

函數(shù)體內(nèi)部的return語(yǔ)句,表示返回刽肠。JavaScript 引擎遇到return語(yǔ)句课幕,就直接返回return后面的那個(gè)表達(dá)式的值,后面即使還有語(yǔ)句五垮,也不會(huì)得到執(zhí)行乍惊。也就是說,return語(yǔ)句所帶的那個(gè)表達(dá)式放仗,就是函數(shù)的返回值代虾。return語(yǔ)句不是必需的,如果沒有的話伯顶,該函數(shù)就不返回任何值害晦,或者說返回undefined

函數(shù)可以調(diào)用自身惶傻,這就是遞歸(recursion)棍郎。下面就是通過遞歸,計(jì)算斐波那契數(shù)列的代碼银室。

function fib(num) {
  if (num === 0) return 0;
  if (num === 1) return 1;
  return fib(num - 2) + fib(num - 1);
}

fib(6) // 8

上面代碼中涂佃,fib函數(shù)內(nèi)部又調(diào)用了fib,計(jì)算得到斐波那契數(shù)列的第6個(gè)元素是8蜈敢。

1.4函數(shù)名的提升

JavaScript 引擎將函數(shù)名視同變量名辜荠,所以采用function命令聲明函數(shù)時(shí),整個(gè)函數(shù)會(huì)像變量聲明一樣抓狭,被提升到代碼頭部伯病。

2.函數(shù)的屬性

name 屬性

函數(shù)的name屬性返回函數(shù)的名字。

如果是通過變量賦值定義的函數(shù)否过,那么name屬性返回變量名午笛。

如果變量的值是一個(gè)具名函數(shù),那么name屬性返回function關(guān)鍵字之后的那個(gè)函數(shù)名苗桂。

name屬性的一個(gè)用處药磺,就是獲取參數(shù)函數(shù)的名字。

length 屬性

函數(shù)的length屬性返回函數(shù)預(yù)期傳入的參數(shù)個(gè)數(shù)誉察,即函數(shù)定義之中的參數(shù)個(gè)數(shù)与涡。

toString()

函數(shù)的toString方法返回一個(gè)字符串,內(nèi)容是函數(shù)的源碼。

3. 函數(shù)的作用域

在 ES5 的規(guī)范中驼卖,Javascript 只有兩種作用域:一種是全局作用域氨肌,變量在整個(gè)程序中一直存在,所有地方都可以讀茸眯蟆怎囚;另一種是函數(shù)作用域,變量只在函數(shù)內(nèi)部存在桥胞。ES6 又新增了塊級(jí)作用域

與全局作用域一樣恳守,函數(shù)作用域內(nèi)部也會(huì)產(chǎn)生“變量提升”現(xiàn)象。var命令聲明的變量贩虾,不管在什么位置催烘,變量聲明都會(huì)被提升到函數(shù)體的頭部。

函數(shù)本身的作用域

函數(shù)本身也是一個(gè)值缎罢,也有自己的作用域伊群。它的作用域與變量一樣,就是其聲明時(shí)所在的作用域策精,與其運(yùn)行時(shí)所在的作用域無(wú)關(guān)舰始。

var a = 1;
var x = function () {
  console.log(a);
};

function f() {
  var a = 2;
  x();
}

f() // 1

上面代碼中,函數(shù)x是在函數(shù)f的外部聲明的咽袜,所以它的作用域綁定外層丸卷,內(nèi)部變量a不會(huì)到函數(shù)f體內(nèi)取值,所以輸出1询刹,而不是2谜嫉。

總之,函數(shù)執(zhí)行時(shí)所在的作用域范抓,是定義時(shí)的作用域骄恶,而不是調(diào)用時(shí)所在的作用域。

閉包就是創(chuàng)建局部變量, 使得函數(shù)外部可以訪問到這個(gè)變量

4.參數(shù)

函數(shù)運(yùn)行的時(shí)候匕垫,有時(shí)需要提供外部數(shù)據(jù),不同的外部數(shù)據(jù)會(huì)得到不同的結(jié)果虐呻,這種外部數(shù)據(jù)就叫參數(shù)象泵。

函數(shù)參數(shù)不是必需的,Javascript 允許省略參數(shù)斟叼。

但是偶惠,沒有辦法只省略靠前的參數(shù),而保留靠后的參數(shù)朗涩。如果一定要省略靠前的參數(shù)忽孽,只有顯式傳入undefined

傳遞方式

函數(shù)參數(shù)如果是原始類型的值(數(shù)值、字符串兄一、布爾值)厘线,傳遞方式是傳值傳遞(passes by value)。這意味著出革,在函數(shù)體內(nèi)修改參數(shù)值造壮,不會(huì)影響到函數(shù)外部。

如果函數(shù)參數(shù)是復(fù)合類型的值(數(shù)組骂束、對(duì)象耳璧、其他函數(shù)),傳遞方式是傳址傳遞(pass by reference)展箱。也就是說旨枯,傳入函數(shù)的原始值的地址,因此在函數(shù)內(nèi)部修改參數(shù)混驰,將會(huì)影響到原始值召廷。

注意,如果函數(shù)內(nèi)部修改的账胧,不是參數(shù)對(duì)象的某個(gè)屬性竞慢,而是替換掉整個(gè)參數(shù),這時(shí)不會(huì)影響到原始值治泥。

arguments 對(duì)象

由于 JavaScript 允許函數(shù)有不定數(shù)目的參數(shù)筹煮,所以需要一種機(jī)制,可以在函數(shù)體內(nèi)部讀取所有參數(shù)居夹。這就是arguments對(duì)象的由來(lái)败潦。

嚴(yán)格模式下,arguments對(duì)象是一個(gè)只讀對(duì)象准脂,修改它是無(wú)效的劫扒,但不會(huì)報(bào)錯(cuò)。

與數(shù)組的關(guān)系

需要注意的是狸膏,雖然arguments很像數(shù)組沟饥,但它是一個(gè)對(duì)象。數(shù)組專有的方法(比如sliceforEach)湾戳,不能在arguments對(duì)象上直接使用贤旷。

如果要讓arguments對(duì)象使用數(shù)組方法,真正的解決方法是將arguments轉(zhuǎn)為真正的數(shù)組砾脑。下面是兩種常用的轉(zhuǎn)換方法:slice方法和逐一填入新數(shù)組幼驶。

var args = Array.prototype.slice.call(arguments);

// 或者
var args = [];
for (var i = 0; i < arguments.length; i++) {
  args.push(arguments[i]);
}

5.函數(shù)的其他知識(shí)點(diǎn)

閉包

理解閉包,首先必須理解變量作用域韧衣。前面提到盅藻,JavaScript 有兩種作用域:全局作用域和函數(shù)作用域购桑。函數(shù)內(nèi)部可以直接讀取全局變量。

由于在 JavaScript 語(yǔ)言中氏淑,只有函數(shù)內(nèi)部的子函數(shù)才能讀取內(nèi)部變量勃蜘,因此可以把閉包簡(jiǎn)單理解成“定義在一個(gè)函數(shù)內(nèi)部的函數(shù)”。閉包最大的特點(diǎn)夸政,就是它可以“記住”誕生的環(huán)境. 在本質(zhì)上元旬,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁。

閉包的最大用處有兩個(gè)守问,一個(gè)是可以讀取函數(shù)內(nèi)部的變量匀归,另一個(gè)就是讓這些變量始終保持在內(nèi)存中,即閉包可以使得它誕生環(huán)境一直存在耗帕。

閉包的另一個(gè)用處穆端,是封裝對(duì)象的私有屬性和私有方法。

立即調(diào)用的函數(shù)表達(dá)式

解決方法就是不要讓function出現(xiàn)在行首仿便,讓引擎將其理解成一個(gè)表達(dá)式体啰。最簡(jiǎn)單的處理,就是將其放在一個(gè)圓括號(hào)里面嗽仪。

(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();

通常情況下荒勇,只對(duì)匿名函數(shù)使用這種“立即執(zhí)行的函數(shù)表達(dá)式”。它的目的有兩個(gè):一是不必為函數(shù)命名闻坚,避免了污染全局變量沽翔;二是 IIFE 內(nèi)部形成了一個(gè)單獨(dú)的作用域,可以封裝一些外部無(wú)法讀取的私有變量窿凤。

// 寫法一
var tmp = newData;
processData(tmp);
storeData(tmp);

// 寫法二
(function () {
  var tmp = newData;
  processData(tmp);
  storeData(tmp);
}());

上面代碼中仅偎,寫法二比寫法一更好,因?yàn)橥耆苊饬宋廴救肿兞俊?/p>

數(shù)組

1.定義

數(shù)組(array)是按次序排列的一組值雳殊。每個(gè)值的位置都有編號(hào)(從0開始)橘沥,整個(gè)數(shù)組用方括號(hào)表示。

除了在定義時(shí)賦值夯秃,數(shù)組也可以先定義后賦值座咆。

任何類型的數(shù)據(jù),都可以放入數(shù)組寝并。

2.數(shù)組的本質(zhì)

本質(zhì)上箫措,數(shù)組屬于一種特殊的對(duì)象。typeof運(yùn)算符會(huì)返回?cái)?shù)組的類型是object衬潦。

3.length 屬性

數(shù)組的length屬性,返回?cái)?shù)組的成員數(shù)量植酥。

只要是數(shù)組镀岛,就一定有length屬性弦牡。該屬性是一個(gè)動(dòng)態(tài)的值,等于鍵名中的最大整數(shù)加上1漂羊。

length屬性是可寫的驾锰。如果人為設(shè)置一個(gè)小于當(dāng)前成員個(gè)數(shù)的值,該數(shù)組的成員會(huì)自動(dòng)減少到length設(shè)置的值走越。

清空數(shù)組的一個(gè)有效方法椭豫,就是將length屬性設(shè)為0。

如果人為設(shè)置length大于當(dāng)前元素個(gè)數(shù)旨指,則數(shù)組的成員數(shù)量會(huì)增加到這個(gè)值赏酥,新增的位置都是空位。

4. in 運(yùn)算符

檢查某個(gè)鍵名是否存在的運(yùn)算符in谆构,適用于對(duì)象裸扶,也適用于數(shù)組。

5.for...in 循環(huán)和數(shù)組的遍歷

for...in循環(huán)不僅可以遍歷對(duì)象搬素,也可以遍歷數(shù)組呵晨,畢竟數(shù)組只是一種特殊對(duì)象。但是熬尺,for...in不僅會(huì)遍歷數(shù)組所有的數(shù)字鍵摸屠,還會(huì)遍歷非數(shù)字鍵。所以粱哼,不推薦使用for...in遍歷數(shù)組季二。

數(shù)組的遍歷可以考慮使用for循環(huán)或while循環(huán)。

數(shù)組的forEach方法皂吮,也可以用來(lái)遍歷數(shù)組戒傻,詳見《標(biāo)準(zhǔn)庫(kù)》的 Array 對(duì)象一章。

數(shù)組的空位

當(dāng)數(shù)組的某個(gè)位置是空元素蜂筹,即兩個(gè)逗號(hào)之間沒有任何值需纳,我們稱該數(shù)組存在空位(hole)。需要注意的是艺挪,如果最后一個(gè)元素后面有逗號(hào)不翩,并不會(huì)產(chǎn)生空位。也就是說麻裳,有沒有這個(gè)逗號(hào)口蝠,結(jié)果都是一樣的。

數(shù)組的空位是可以讀取的津坑,返回undefined妙蔗。

使用delete命令刪除一個(gè)數(shù)組成員,會(huì)形成空位疆瑰,并且不會(huì)影響length屬性眉反。

類似數(shù)組的對(duì)象

如果一個(gè)對(duì)象的所有鍵名都是正整數(shù)或零昙啄,并且有length屬性,那么這個(gè)對(duì)象就很像數(shù)組寸五,語(yǔ)法上稱為“類似數(shù)組的對(duì)象”(array-like object)梳凛。

典型的“類似數(shù)組的對(duì)象”是函數(shù)的arguments對(duì)象,以及大多數(shù) DOM 元素集梳杏,還有字符串韧拒。

數(shù)組的slice方法可以將“類似數(shù)組的對(duì)象”變成真正的數(shù)組。

var arr = Array.prototype.slice.call(arrayLike);

除了轉(zhuǎn)為真正的數(shù)組十性,“類似數(shù)組的對(duì)象”還有一個(gè)辦法可以使用數(shù)組的方法叛溢,就是通過call()把數(shù)組的方法放到對(duì)象上面。

function print(value, index) {
  console.log(index + ' : ' + value);
}

Array.prototype.forEach.call(arrayLike, print);

注意烁试,這種方法比直接使用數(shù)組原生的forEach要慢雇初,所以最好還是先將“類似數(shù)組的對(duì)象”轉(zhuǎn)為真正的數(shù)組,然后再直接調(diào)用數(shù)組的forEach方法减响。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末靖诗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子支示,更是在濱河造成了極大的恐慌刊橘,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颂鸿,死亡現(xiàn)場(chǎng)離奇詭異促绵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嘴纺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門败晴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人栽渴,你說我怎么就攤上這事尖坤。” “怎么了闲擦?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵慢味,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我墅冷,道長(zhǎng)纯路,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任寞忿,我火速辦了婚禮驰唬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腔彰。我一直安慰自己定嗓,他們只是感情好蜕琴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布萍桌。 她就那樣靜靜地躺著宵溅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪上炎。 梳的紋絲不亂的頭發(fā)上恃逻,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音藕施,去河邊找鬼寇损。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裳食,可吹牛的內(nèi)容都是我干的矛市。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼诲祸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浊吏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起救氯,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤找田,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后着憨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墩衙,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年甲抖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漆改。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡准谚,死狀恐怖挫剑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氛魁,我是刑警寧澤暮顺,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站秀存,受9級(jí)特大地震影響捶码,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜或链,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一惫恼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澳盐,春花似錦祈纯、人聲如沸令宿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)粒没。三九已至,卻和暖如春簇爆,著一層夾襖步出監(jiān)牢的瞬間癞松,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工入蛆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留响蓉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓哨毁,卻偏偏與公主長(zhǎng)得像枫甲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扼褪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)想幻,也就是一...
    悟名先生閱讀 4,149評(píng)論 0 13
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,208評(píng)論 0 3
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章迎捺,發(fā)現(xiàn)簡(jiǎn)書還為我保存起的...
    Jenaral閱讀 2,762評(píng)論 2 9
  • 種財(cái)富20w举畸,在2.15前,已顯化5.3w 1.早上給早餐老板送去3.89元凳枝,實(shí)際是4元抄沮,0.11是馬云發(fā)的紅包感...
    1C611艷燕閱讀 152評(píng)論 0 0
  • 我遇見了一位像小熊一樣的女生。 她膽子小岖瑰,羞赧又青澀叛买。卻可愛而善良。 認(rèn)識(shí)她不算久蹋订,卻讓我覺得這個(gè)世界很溫柔率挣,會(huì)讓...
    膩膩歪歪扭扭捏捏閱讀 336評(píng)論 0 5