tostring() 的應用:判斷資料型別
為了得到型別字串,最好直接使用object.prototype.tostring方法。通過函式的call方法,可以在任意值上呼叫這個方法,幫助我們判斷這個值的型別。
**object.prototype.tostring.call(value)**
不同資料型別的object.prototype.tostring方法返回值如下。
數值:返回[object number]。
字串:返回[object string]。
布林值:返回[object boolean]。
undefined:返回[object undefined]。
null:返回[object null]。
陣列:返回[object array]。
arguments 物件:返回[object arguments]。
函式:返回[object function]。
error 物件:返回[object error]。
date 物件:返回[object date]。
regexp 物件:返回[object regexp]。
其他物件:返回[object object]。
可以寫出乙個比typeof運算子更準確的型別判斷函式。
var type = function (o);
type({}); // "object"
type(); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new date()); // "date"
new 命令的原理
使用new命令時,它後面的函式依次執行下面的步驟。
建立乙個空物件,作為將要返回的物件例項。
將這個空物件的原型,指向建構函式的prototype屬性。
將這個空物件賦值給函式內部的this關鍵字。
開始執行建構函式內部的**。
建構函式內部,this指的是乙個新生成的空物件,所有針對this的操作,都會發生在這個空物件上。建構函式之所以叫「建構函式」,就是說這個函式的目的,就是操作乙個空物件(即this物件),將其「構造」為需要的樣子。
如果建構函式內部有return語句,而且return後面跟著乙個物件,new命令會返回return語句指定的物件;否則,就會不管return語句,返回this物件。
var vehicle = function () ;
(new vehicle()) === 1000
// false
上面**中,建構函式vehicle的return語句返回乙個數值。這時,new命令就會忽略這個return語句,返回「構造」後的this物件。
如果return語句返回的是乙個跟this無關的新物件,new命令會返回這個新物件,而不是this物件
var vehicle = function ();
};(new vehicle()).price
// 2000
如果對普通函式(內部沒有this關鍵字的函式)使用new命令,則會返回乙個空物件。
function getmessage()
var msg = new getmessage();
msg // {}
typeof msg // "object"
函式內部可以使用new.target屬性。如果當前函式是new命令呼叫,new.target指向當前函式,否則為undefined。
function f()
f() // false
new f() // true
可以判斷函式呼叫的時候,是否使用new命令。
function f()
// ...
}f() // uncaught error: 請使用 new 命令呼叫!
有時拿不到建構函式,只能拿到乙個現有的物件。我們希望以這個現有的物件作為模板,生成新的例項物件
var person1 =
};var person2 = object.create(person1);
person2.name // 張三
person2.greeting() // hi! i'm 張三.
object.getprototypeof()
方法返回引數物件的原型。這是獲取原型物件的標準方法。
var f = function () {};
var f = new f();
object.getprototypeof(f) === f.prototype // true
// 空物件的原型是 object.prototype
object.getprototypeof({}) === object.prototype // true
// object.prototype 的原型是 null
object.getprototypeof(object.prototype) === null // true
// 函式的原型是 function.prototype
function f() {}
object.getprototypeof(f) === function.prototype // true
object.create方法,用來滿足這種需求。該方法接受乙個物件作為引數,然後以它為原型,返回乙個例項物件。該例項完全繼承原型物件的屬性。
// 原型物件
var a =
};// 例項物件
var b = object.create(a);
object.getprototypeof(b) === a // true
b.print() // hello
b.print === a.print // true
//以a物件為原型,生成了b物件。b繼承了a的所有屬性和方法。
三種方式生成的新物件是等價的。
var obj1 = object.create({});
var obj2 = object.create(object.prototype);
var obj3 = new object();
如果想要生成乙個不繼承任何屬性(比如沒有tostring和valueof方法)的物件,可以將object.create的引數設為null
物件obj的原型是null,它就不具備一些定義在object.prototype物件上面的屬性,比如valueof方法。
var obj = object.create(null);
obj.valueof()
// typeerror: object [object object] has no method 'valueof'
第二個引數:是乙個屬性描述物件,它所描述的物件屬性,會新增到例項物件,作為該物件自身的屬性。
例項物件的isprototypeof方法,用來判斷該物件是否為引數物件的原型。
object.prototype.isprototypeof({}) // true
object.prototype.isprototypeof() // true
object.prototype.isprototypeof(/xyz/) // true
object.prototype.isprototypeof(object.create(null)) // false
由於object.prototype處於原型鏈的最頂端,所以對各種例項都返回true,只有直接繼承自null的物件除外。
物件例項的hasownproperty方法返回乙個布林值,用於判斷某個屬性定義在物件自身,還是定義在原型鏈上。
date.hasownproperty('length') // true
date.hasownproperty('tostring') // false
確保拷貝後的物件,與原物件具有同樣的原型。
確保拷貝後的物件,與原物件具有同樣的例項屬性。
function copyobject(orig)
//利用 es2017 才引入標準的object.getownpropertydescriptors方法
整理知識點
python中的變數不需要宣告。每個變數在使用前都必須賦值,變數賦值以後該變數才會被建立。在python 中,變數就是變數,它沒有型別,我們所說的 型別 是變數所指的記憶體中物件的型別。乙個變數可以通過賦值指向不同型別的物件。python3 有六個標準的資料型別 不可變資料 number 數字 st...
專案零碎知識點 5 10
io ioutil go mod go mod 使用 gin.context json.marshal 例 type stu struct type class struct fun main 指標變數 cla new class cla.name 1班 cla.grade 3 stu.class ...
js知識點 掘金 JS小知識點補充
toc 邏輯或與邏輯與 1.在條件判斷中使用 條件中的 兩個條件都成立,整體判斷條件才會成立 條件中的 只要有乙個條件成立,整體判斷條件就成立。2.在賦值操作中使用 var a 1 2 首先驗證1是真假,如果為真,把1賦值給a,如果為假,把2賦值給a a b 先驗證a的真假,為真結果是a,為假結果是...