摘要:示例構(gòu)造函數(shù)繼承實例對象其次,我們還可以使用中的新語法等關(guān)鍵字來實現(xiàn)繼承。對象的屬性是該對象的構(gòu)造函數(shù)的屬性。基于上邊構(gòu)造函數(shù)繼承代碼作用域與命名空間如果了解的用法,那么就應(yīng)該只要有塊級作用域和函數(shù)作用域。
JavaScript數(shù)據(jù)類型 JavaScript中有哪些基本數(shù)據(jù)類型
undefined、null、number、string、boolean、symbol(es6中新增)
為啥沒有object、array、function?他們都屬于復(fù)雜的數(shù)據(jù)類型??雌饋碛悬c咬文嚼字。
string-------------------------string
number-------------------------number
boolean------------------------boolean
function-----------------------function
undefined----------------------undefined
null---------------------------object (null值表示一個空對象指針)
array--------------------------object
object-------------------------object
因此,有些時候typeof并不能準確的判斷某個變量的數(shù)據(jù)類型。
通過上邊可以看出,使用typeof就可以判斷區(qū)null和undefined了。
還可以通過null === undefined這種方式來判斷。
JavaScript 中所有變量都可以當作對象使用,除了 null 和 undefined 兩個例外。所以我們可以使用對象原型鏈上的toString方法來將一個變量轉(zhuǎn)化成字符串,然后區(qū)分他們的類型。
Object.prototype.toString.call(*);示例:
Object.prototype.toString.call(null) // "[object Null]" Object.prototype.toString.call(undefined) // "[object Undefined]"
*在IE8中兩者結(jié)果都為 "[object Object]"
因此,我們也可以用這個方法來區(qū)分null和undefined
創(chuàng)建對象
var obj1 = {x:1,"long name":2}; var obj2 = new Object(); var obj3 = Object.create(obj2);
訪問對象屬性
obj1.x // 1 obj1["long name"] // 2 注意,如果屬性名有空格或者中劃線什么的就只能使用這種方式了
刪除對象屬性
delete obj1.x // 刪除對象屬性的唯一方法是delete繼承與原型鏈
前邊我們說了,可以認為 JavaScript 中萬物皆對象。每個對象都有一個私有 Prototype。它持有一個連接到另一個稱為其 prototype 對象(原型對象)的鏈接。該 prototype 對象又具有一個自己的原型,層層向上直到一個對象的原型為 null。
繼承
上邊創(chuàng)建對象以及可以看到使用 Object.create 可以實現(xiàn)繼承。還有可以使用Object.prototype來實現(xiàn)繼承。示例:
var obj = {a:1} function P(name){ // 構(gòu)造函數(shù) this.name = name } P.prototype = obj // 繼承obj var p = new P("wesley"); // 實例對象 p.a // 1
其次,我們還可以使用es6中的新語法class等關(guān)鍵字來實現(xiàn)繼承。
原型鏈
原型鏈的定義復(fù)雜拗口,我們可以通過 JavaScript 的非標準但許多瀏覽器實現(xiàn)的屬性__proto__來理解原型鏈。
對象的__proto__屬性是該對象的構(gòu)造函數(shù)的prototype屬性?;谏线厴?gòu)造函數(shù)繼承代碼:
console.log(p.__proto__ === P.prototype) // true console.log(P.prototype === obj) // true console.log(P.prototype.__proto__ === Object.prototype) // true console.log(Object.prototype.__proto__ === null) // true作用域與命名空間
如果了解es6的let用法,那么就應(yīng)該只要 JavaScript 有塊級作用域和函數(shù)作用域。簡單來說通常我們使用var創(chuàng)建的變量都屬于函數(shù)作用域。
什么是塊級作用域呢?其實可以簡單理解為一對花括號包圍的代碼塊的作用范圍內(nèi)。
JavaScript 中沒有顯式的命名空間定義,這就意味著所有對象都定義在一個全局共享的命名空間下面。
每次引用一個變量,JavaScript 會向上遍歷整個作用域直到找到這個變量為止。 如果到達全局作用域但是這個變量仍未找到,則會拋出 ReferenceError 異常。
隱式的全局變量
foo1 = 1; var foo2 = 2; // 如果是在函數(shù)內(nèi)部 就是局部變量 let foo3 = 3; // 如果是在代碼塊內(nèi) 就是局部變量
可以通過如下代碼的執(zhí)行結(jié)果來理解let和var
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10
如果使用let
var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6
變量聲明提升
var 表達式和 function 聲明都將會被提升到當前作用域的頂部。要注意的是 let 表達式并不會被提升。
這也正好可以說明如下代碼可以正常執(zhí)行:
test(); function test(){ console.log(a) var a = 5; }
可以理解為提升后的代碼:
function test(){ var a; // 此時a為undefined 所以我們打印的時候就是undefined了 console.log(a) a = 5; } test();
不使用var申明的變量提升示例:
test(); function test(){ b = 5 } console.log(b) // 5
可以理解為提升后:
var b; // undefined (function test(){ b = 5 })() console.log(b)閉包
閉包是 JavaScript 一個非常重要的特性,這意味著當前作用域總是能夠訪問外部作用域中的變量。
可以理解為訪問你本不能夠訪問到的東西,就是一個閉包。示例:
function Counter(start) { var count = start; return { increment: function() { count++; }, get: function() { return count; } } } var foo = Counter(4); // 此時如果我們在外部直接 console.log(count) 是會拋錯的 foo.increment(); foo.get(); // 5
這里,Counter 函數(shù)返回兩個閉包,函數(shù) increment 和函數(shù) get。這兩個函數(shù)都維持著對 Counter 函數(shù)內(nèi)部作用域的引用。
所以如果需要訪問或者說獲取Counter中的變量count,只能通過閉包的方式。
關(guān)于閉包,有個很經(jīng)典的例子:
for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 1000); } // 10個10
*想想,為什么。具體可以看:https://segmentfault.com/a/11...
setTimeout 和 setInterval
由于 JavaScript 是異步的,可以使用 setTimeout 和 setInterval 來計劃執(zhí)行函數(shù)。
*注意: 定時處理不是 ECMAScript 的標準,它們在 DOM (文檔對象模型) 被實現(xiàn)。
function foo() {} var id = setTimeout(foo, 1000); // 返回一個大于零的數(shù)字
當 setTimeout 被調(diào)用時,它會返回一個 ID 標識并且計劃在將來大約 1000 毫秒后調(diào)用 foo 函數(shù)。 foo 函數(shù)只會被執(zhí)行一次。
所以,通常我們可以認為被setTimeout執(zhí)行的函數(shù)是會被異步執(zhí)行的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/89592.html
摘要:功能測試在測試工作中占的比例最大,功能測試也叫黑盒測試。軟件的黑盒測試意味著測試要在軟件的接口處進行。因此白盒測試又稱為結(jié)構(gòu)測試或邏輯驅(qū)動測試。集成測試也叫組裝測試,聯(lián)合測試是單元測試的邏輯擴展。 ...
摘要:大家好,我來自駕考寶典。同時,我在駕考寶典也工作一年多了。駕考寶典算不上一線大公司,但我個人不管是通過工作,平常的積累,還是自主學習,我覺得還是能和大家分享一些更加實戰(zhàn)化的面試題。并處理好廣大安卓機的兼容性。 大家好,我來自駕考寶典。時間不知不覺進入2018金九銀十,下半年的尾聲了,想必很多朋友已經(jīng)看過網(wǎng)上新出的各大廠面試題。同時,我在駕考寶典也工作一年多了。駕考寶典算不上一線大公司,...
摘要:大家好,我來自駕考寶典。同時,我在駕考寶典也工作一年多了。駕考寶典算不上一線大公司,但我個人不管是通過工作,平常的積累,還是自主學習,我覺得還是能和大家分享一些更加實戰(zhàn)化的面試題。并處理好廣大安卓機的兼容性。 大家好,我來自駕考寶典。時間不知不覺進入2018金九銀十,下半年的尾聲了,想必很多朋友已經(jīng)看過網(wǎng)上新出的各大廠面試題。同時,我在駕考寶典也工作一年多了。駕考寶典算不上一線大公司,...
閱讀 1977·2021-09-23 11:21
閱讀 1749·2019-08-29 17:27
閱讀 1112·2019-08-29 17:03
閱讀 783·2019-08-29 15:07
閱讀 2000·2019-08-29 11:13
閱讀 2433·2019-08-26 12:14
閱讀 1002·2019-08-26 11:52
閱讀 1779·2019-08-23 17:09