国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS-對象

kidsamong / 2170人閱讀

摘要:一概述是一種面向?qū)ο蟮恼Z言。除了基本數(shù)據(jù)類型,其他的都是對象。表示創(chuàng)建一個沒有原型的空對象。模擬操作符注意返回值訪問對象屬性訪問方式也就是。對象在作為值時,是作為引用傳遞的。假如判斷對象是否為數(shù)組目前的很多庫,中都是這樣實現(xiàn)的。

一、概述

JS是一種面向?qū)ο蟮恼Z言。除了基本數(shù)據(jù)類型number, string, boolean(true, false), null, undefined,其他的都是對象。對象就是一個"name-value"對集合。

二、操作對象 2.1 創(chuàng)建對象

JS有三種創(chuàng)建對象的方式:字面量,Object.create,new構(gòu)造方式。

2.1.1 Object.create(null | object)

嚴格來說調(diào)用Object.create方法是創(chuàng)建JS對象的唯一方式(其他兩種方式內(nèi)部實現(xiàn)都是基于該方法的)。該方法功能是創(chuàng)建一個對象,并且該對象的原型指向create的參數(shù)對象。
參數(shù):必須是null或者對象,否則報錯。null表示創(chuàng)建一個沒有原型的空對象。

var p = { a: 1}; // 對象字面量
var c1 = Object.create(p); // 對象c1的原型指向p
var c2 = Object.create(null);// 對象c2沒有原型

2.1.2 對象字面量

對象字面量是一種創(chuàng)建對象的便捷方式,見上例。其中對象p的創(chuàng)建方式就是對象字面量。JS解釋器會對它進行處理的,等價于:

var p = Object.create(Object.prototype);
p.a = 1;

所以說對象字面量內(nèi)部也是通過Object.create方式創(chuàng)建對象的,并且所有對象字面量方式創(chuàng)建的對象的原型都執(zhí)行Object.prototype(如上圖)。

思考:JS解釋器如何區(qū)分語句塊花括號{}和空對象花括號{}的?
先看看這兩條語句執(zhí)行的結(jié)果?

{} + [] // 0
[] + {} // "[object Object]"

{}作為右值(賦值表達式右側(cè)),實參,在運算符的右側(cè),被括號()包裹則作為對象,其他則視為語句塊:
下面輸出都是:"[object Object]"

console.log({} + []) // 作為實參了

({}) + [] // 被括號包裹

var a = {} + [] //作為右值
console.log(a) 

我們知道當ES6箭頭函數(shù)的函數(shù)體只有一條語句時可以省略語句塊花括號,但是如果箭頭函數(shù)返回的是一個對象該如何書寫呢?

var func1 = () => {age: 12} // 本意是想返回對象{age:12},顯然這樣寫就不對了,花括號會被作為語句塊解析
var func2 = () => ({age: 12}) // 可以用括號包裹下
var func3 = () => { return {age: 12}} // 或顯示的寫全

2.1.3 new構(gòu)造方式

JS的作者為了討好類語言的開發(fā)者,引入了第三者創(chuàng)建對象方式,即new構(gòu)造方式。這使得JS對象的創(chuàng)建有點像類語言的對象創(chuàng)建。

1) 格式
new關鍵字 + 空格 + 函數(shù)名字 + [(參數(shù))]

其中參數(shù)是可選的,當沒有參數(shù)傳遞時,可以省略括號。如:

function Func(){}
var c1 = new Func();
var c2 = new Func; // 如果沒有參數(shù)傳遞,可以省略括號。
function Func(name){
  this.name = name;
}
Func.prototype.say = function(){
};
var c = new Func("q");

2) 內(nèi)部原理

這種方式的內(nèi)部也是通過Object.create方式構(gòu)建的。new方式創(chuàng)建對象大致分為三步:
Step1:創(chuàng)建一個對象A,并且對象A的原型指向構(gòu)造函數(shù)的prototype屬性
Step2:以對象A綁定到構(gòu)造函數(shù)上調(diào)用構(gòu)造函數(shù)
Step3:如果構(gòu)造函數(shù)返回值不是個非null的對象,則返回構(gòu)造函數(shù)的返回值作為new表達式的值,否則以對象A作為new表達式的值。

function Func(name){
  this.name = name;
}
Func.prototype.say = function(){
};
function create(){ // 模擬new操作符
  var func = arguments[0];
  var args = Array.prototype.slice.call(arguments, 1);
  var other = Object.create(func.prototype); // Step 1
  var result = func.apply(other, args); // Step 2
  return typeof result === "object" && result ? result: other; // Step3 注意返回值
}
var c = create(Func, "q");
2.2 訪問對象屬性

訪問方式也就是get/set/delete。在get訪問中會涉及原型鏈,set/delete訪問不會。

var Obj = {
  name: "john"
};
// Get操作
var n = Obj.name; // 等價var n = Obj["name"];
// Set操作
Obj.age = 12; 
2.2.1 Get操作流程:

2.2.2 Set操作流程:

2.2.3 delete操作

可以通過delete操作符刪除對象的屬性,只能刪除對象本身的屬性。

var p = {
  age: 26
}
var obj = Object.create(p);
obj.name = "john";
console.log(obj.name); // john
console.log(obj.age); // 26
delete obj.name; // 刪除屬性
delete obj.age; // 刪除屬性
console.log(obj.name); // undefined
console.log(obj.age); // undefined

2.3 引用對象

JS中對象是引用類型的。對象在作為值時,是作為引用傳遞的。

var a={}, b={}; // a,b分別指向不同的對象
var c = d = {}; // c,d指向同一個對象
三、反射

確定對象的類型有時很有必要。

3.1 typeof 操作符

通過typeof操作符可以獲取值的類型:

console.log(typeof 1); // number
console.log(typeof ""); // string
console.log(typeof null); // object
console.log(typeof undefined); // undefined
console.log(typeof true); // boolean
console.log(typeof {}); // object
console.log(typeof []); // object
console.log(typeof function(){}); // function

但是發(fā)現(xiàn)這種方式中null, 數(shù)組也都是返回“object”。原因是JS中沒有原生數(shù)組類型,數(shù)組是通過對象模擬的,所以數(shù)組也是對象。但是如何區(qū)分數(shù)組和對象呢???

3.2 Object.prototype.toString

typeof是有缺陷的,在實際應用中常通過Object.prototype.toString方法確定對象類型的。

console.log(Object.prototype.toString.call(1)); // [object Number]
console.log(Object.prototype.toString.call("")); // [object String]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call(true)); // [object Boolean]
console.log(Object.prototype.toString.call( {})); // [object Object]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call(function(){})); // [object Function]

看例子中輸出結(jié)果中發(fā)現(xiàn)不同之處了吧。假如判斷對象是否為數(shù)組:

var isArray = function(val){
  return Object.prototype.toString.call(val) === "[object Array]";
}

目前的很多庫zeptojs,underscorejs中都是這樣實現(xiàn)的。

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/83788.html

相關文章

  • JS中數(shù)據(jù)類型、內(nèi)置對象、包裝類型對象、typeof關系

    摘要:平時在復習基礎知識時,經(jīng)常會遇到數(shù)據(jù)類型基礎數(shù)據(jù)類型內(nèi)置對象包裝類型對象,檢測數(shù)據(jù)類型時,用到的值,感覺都差不多,但是又有差異。值與數(shù)據(jù)類型關系對比下圖,即可知值相較于基礎數(shù)據(jù)類型少多 平時在復習JS基礎知識時,經(jīng)常會遇到JS數(shù)據(jù)類型、基礎數(shù)據(jù)類型、內(nèi)置對象、包裝類型對象,檢測數(shù)據(jù)類型時,用到的typeof值,感覺都差不多,但是又有差異。今天特地整理下,方便理解。 JS數(shù)據(jù)類型 基礎數(shù)...

    OldPanda 評論0 收藏0
  • 精讀《JS 引擎基礎之 Shapes and Inline Caches》

    摘要:概述的解釋器優(yōu)化器代碼可能在字節(jié)碼或者優(yōu)化后的機器碼狀態(tài)下執(zhí)行,而生成字節(jié)碼速度很快,而生成機器碼就要慢一些了。比如有一個函數(shù),從獲取值引擎生成的字節(jié)碼結(jié)構(gòu)是這樣的指令是獲取參數(shù)指向的對象,并存儲在,第二步則返回。 1 引言 本期精讀的文章是:JS 引擎基礎之 Shapes and Inline Caches 一起了解下 JS 引擎是如何運作的吧! JS 的運作機制可以分為 AST 分...

    Tecode 評論0 收藏0
  • jQuery Deferred對象

    摘要:給普通的操作指定回調(diào)函數(shù)對象的最大優(yōu)點,就是它把這一套回調(diào)函數(shù)接口,從操作擴展到了所有操作。方法用于指定對象狀態(tài)為已失敗時的回調(diào)函數(shù)。執(zhí)行完畢執(zhí)行成功執(zhí)行失敗接收一個或多個對象作為參數(shù),為其指定回調(diào)函數(shù)。 什么是deferred對象 開發(fā)網(wǎng)站的過程中,我們經(jīng)常遇到某些耗時很長的javascript操作。其中,既有異步的操作(比如ajax讀取服務器數(shù)據(jù)),也有同步的操作(比如遍歷一個大型...

    baoxl 評論0 收藏0
  • [譯]執(zhí)行上下文、作用域鏈和JS內(nèi)部機制

    摘要:執(zhí)行上下文作用域鏈和內(nèi)部機制一執(zhí)行上下文執(zhí)行上下文是代碼的執(zhí)行環(huán)境,它包括的值變量對象和函數(shù)。創(chuàng)建作用域鏈一旦可變對象創(chuàng)建完,引擎就開始初始化作用域鏈。 執(zhí)行上下文、作用域鏈和JS內(nèi)部機制(Execution context, Scope chain and JavaScript internals) 一、執(zhí)行上下文 執(zhí)行上下文(Execution context EC)是js代碼的執(zhí)...

    caozhijian 評論0 收藏0

發(fā)表評論

0條評論

kidsamong

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<