摘要:一對(duì)象初始化創(chuàng)建對(duì)象的兩種方法對(duì)象初始化器或?qū)ο笞置媪繀?shù)成對(duì)的名稱字符串與值任何值,其中名稱通過(guò)冒號(hào)與值分隔之后簡(jiǎn)化了字面量寫法寫法以構(gòu)造函數(shù)形式來(lái)調(diào)用參數(shù)任何值訪問(wèn)對(duì)象屬性對(duì)象屬性可以用下標(biāo)小圓點(diǎn)標(biāo)記或者方括號(hào)標(biāo)記訪問(wèn)從開始,對(duì)象初始化
一、對(duì)象初始化 創(chuàng)建對(duì)象的兩種方法:
1.對(duì)象初始化器或?qū)ο笞置媪浚簕[nameValuePair1[, nameValuePair2[, ...nameValuePairN]]]}
參數(shù):nameValuePair1, nameValuePair2, ... nameValuePairN
? ? ?成對(duì)的名稱(字符串)與值(任何值),其中名稱通過(guò)冒號(hào)與值分隔
es2015之后簡(jiǎn)化了字面量寫法
let a = "foo", b = 42, c = {}; let object1 = { a: a, b: b, c: c }; //es2015寫法 let object2 = { a, b, c }; console.log(object1.a === object2.a); //true
2.以構(gòu)造函數(shù)形式來(lái)調(diào)用:new Object([value])
參數(shù):value? 任何值
let object = new Object({"foo": 123}); console.log(object.foo); //123訪問(wèn)對(duì)象屬性
對(duì)象屬性可以用下標(biāo)小圓點(diǎn)標(biāo)記或者方括號(hào)標(biāo)記訪問(wèn)
let object = new Object({"b": 42}); console.log(object["b"]); // 42 object.b = "baz"; console.log(object.b); //"baz"
從ECMAScript 2015開始,對(duì)象初始化語(yǔ)法開始支持計(jì)算屬性名,允許在[]中放入表達(dá)式,計(jì)算結(jié)果可以當(dāng)做屬性名
let i = 0; let object1 = { ["foo" + ++i]: i, ["foo" + ++i]: i, ["foo" + ++i]: i }; console.log(object1.foo1); // 1 console.log(object1.foo2); // 2 console.log(object1.foo3); // 3 let param = "size"; let object2 = { [param]: 12, ["mobile" + param.charAt(0).toUpperCase() + param.slice(1)]: 4 }; console.log(object2); // { size: 12, mobileSize: 4 }二、Object靜態(tài)方法 1.Object.defineProperty() 方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性,并返回這個(gè)對(duì)象
語(yǔ)法:Object.defineProperty(obj, prop, descriptor)
參數(shù):
? ? ? ? obj? 要在其上定義屬性的對(duì)象
? ? ? ? prop? 要定義或修改的屬性的名稱
? ? ? ? descriptor? 將被定義或修改的屬性描述符
? ? ? ? ? ? configurable? t當(dāng)且僅當(dāng)該屬性的 configurable 為 true 時(shí),該屬性描述符才能夠被改變,同時(shí)該屬性也能從對(duì)應(yīng)的對(duì)象上被刪除。默認(rèn)為 false
? ? ? ? ? ? enumerable? 當(dāng)且僅當(dāng)該屬性的enumerable為true時(shí),該屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中。默認(rèn)為 false
? ? ? ? ? ? value? 與屬性關(guān)聯(lián)的值??梢允侨魏斡行У腏avaScript值(數(shù)字,對(duì)象,函數(shù)等)。默認(rèn)為 undefined.
? ? ? ? ? ? writable? 當(dāng)且僅當(dāng)該屬性的writable為true時(shí),value才能被賦值運(yùn)算符改變。默認(rèn)為 false
? ? ? ? ? ? get? 作為該屬性的 getter 函數(shù),如果沒(méi)有 getter 則為undefined。當(dāng)訪問(wèn)該屬性時(shí),該方法會(huì)被執(zhí)行,方法執(zhí)行時(shí)沒(méi)有參數(shù)傳入,但是會(huì)傳入this對(duì)象。默認(rèn)為 undefined
? ? ? ? ? ? set? 作為屬性的 setter 函數(shù),如果沒(méi)有 setter 則為undefined。當(dāng)屬性值修改時(shí),觸發(fā)執(zhí)行該方法,該方法將接受唯一參數(shù),即該屬性新的參數(shù)值。默認(rèn)為 undefined
返回值:傳遞給函數(shù)的對(duì)象
(1)writable決定一個(gè)屬性能否被賦值
let object = {}; Object.defineProperty(object,"a",{ value: 30, writable: true }); console.log(object.a); //30 object.a = 15; console.log(object.a); //15 Object.defineProperty(object,"b",{ value: 30, writable: false }); console.log(object.b); //30 object.b = 15; //TypeError: Cannot assign to read only property "b" of object "#
(2)enumerable決定該屬性是否能被枚舉
let object = {}; Object.defineProperty(object,"a",{ value: 15, writable: true, enumerable: true }); Object.defineProperty(object,"b",{ value: 16, writable: true, enumerable: false }); Object.defineProperty(object,"c",{ value: 17, writable: true, enumerable: true }); for (let i in object) { console.log(i+"=",object[i]); //a=15 c=17 } console.log(Object.keys(object)); //["a", "c"] console.log(object.propertyIsEnumerable("a")); // true console.log(object.propertyIsEnumerable("b")); // false console.log(object.propertyIsEnumerable("c")); // true
(3)configurable
let object = {}; Object.defineProperty(object,"a",{ get: () => { return 10; }, configurable: false }); Object.defineProperty(object,"a",{ value: 15 }); //TypeError: Cannot redefine property: a console.log(object.a); //10 object.b = 5; //等同于 Object.defineProperty(object,"b",{ value: 5, writable: true, configurable: true, enumerable: true }); Object.defineProperty(object,"d",{ value: 5 }); //等同于 Object.defineProperty(object,"b",{ value: 5, writable: false, configurable: false, enumerable: false });
(4)set/get
function Test() { let x = null; let arr = []; Object.defineProperty(this,"x",{ get: () => { console.log("get"); return x; }, set: (value) => { console.log("set"); x = value; arr.push(x); } }); this.getTest = function () { return arr; } } let test = new Test(); test.x; //get test.x = 25; //set test.x = 30; //set console.log(test.getTest()); //[25, 30]2.Object.defineProperties() 方法直接在一個(gè)對(duì)象上定義新的屬性或修改現(xiàn)有屬性,并返回該對(duì)象
語(yǔ)法:Object.defineProperties(obj, props)
參數(shù):
? ? ? ? obj? 要在其上定義屬性的對(duì)象
? ? ? ? props? 要定義其可枚舉屬性或修改的屬性描述符的對(duì)象
返回值:被傳遞給函數(shù)的對(duì)象
let object = {}; Object.defineProperties(object, { "property1": { value: true, writable: true }, "property2": { value: "Hello", writable: false } });3.Object.getOwnPropertyDescriptor() 方法返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符,自有屬性指的是直接賦予該對(duì)象的屬性,不需要從原型鏈上進(jìn)行查找的屬性
語(yǔ)法:Object.getOwnPropertyDescriptor(obj, prop)
參數(shù):
? ? ? ? obj? 需要查找的目標(biāo)對(duì)象
? ? ? ? prop? 目標(biāo)對(duì)象內(nèi)屬性名稱(String類型)
返回值:如果指定的屬性存在于對(duì)象上,則返回其屬性描述符對(duì)象(property descriptor),否則返回 undefined
let object = { bar: 42, get foo() { return 17; } }; let foo = Object.getOwnPropertyDescriptor(object, "foo"); // { // configurable: true, // enumerable: true, // get: /*the getter function*/, // set: undefined // } let bar = Object.getOwnPropertyDescriptor(object, "bar"); // { // configurable: true, // enumerable: true, // value: 42, // writable: true // } Object.defineProperty(object, "baz", { value: 8675309, writable: false, enumerable: false }); let baz = Object.getOwnPropertyDescriptor(object, "baz"); // { // configurable: false, // enumerable: false, // value: 8675309, // writable: false // }4.Object.getOwnPropertyDescriptors() 方法用來(lái)獲取一個(gè)對(duì)象的所有自身屬性的描述符
語(yǔ)法:Object.getOwnPropertyDescriptors(obj)###
參數(shù):
? ? ? ? obj? 任意對(duì)象
返回值:所指定對(duì)象的所有自身屬性的描述符,如果沒(méi)有任何自身屬性,則返回空對(duì)象
let object = { bar: 42, get foo() { return 17; } }; Object.getOwnPropertyDescriptors(object); //{ // bar: {value: 42, writable: true, enumerable: true, configurable: true}, // foo: {get: ?, set: undefined, enumerable: true, configurable: true} // } function SuperClass() {} SuperClass.prototype = { x: 15, y: 20 }; let superClass = new SuperClass(); superClass.a = 50; superClass.b = 100; function SubClass() {} SubClass.prototype = Object.create(SuperClass.prototype, Object.getOwnPropertyDescriptors(superClass)); let subClass = new SubClass(); console.log(subClass.a); //505.Object.getOwnPropertyNames()方法返回一個(gè)由指定對(duì)象的所有自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol值作為名稱的屬性)組成的數(shù)組
語(yǔ)法:Object.getOwnPropertyNames(obj)
參數(shù):
? ? ? ? obj? 一個(gè)對(duì)象,其自身的可枚舉和不可枚舉屬性的名稱被返回
返回值:在給定對(duì)象上找到的屬性對(duì)應(yīng)的字符串?dāng)?shù)組
let arr = ["a", "b", "c"]; console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"] // 類數(shù)組對(duì)象 let object = { 0: "a", 1: "b", 2: "c"}; console.log(Object.getOwnPropertyNames(object).sort()); // ["0", "1", "2"]6.Object.getOwnPropertySymbols() 方法返回一個(gè)給定對(duì)象自身的所有 Symbol 屬性的數(shù)組
語(yǔ)法:Object.getOwnPropertySymbols(obj)
參數(shù):
? ? ? ? obj? 要返回 Symbol 屬性的對(duì)象
返回值:在給定對(duì)象自身上找到的所有 Symbol 屬性的數(shù)組
let object = {}; let a = Symbol("a"); let b = Symbol.for("b"); object[a] = "localSymbol"; object[b] = "globalSymbol"; let objectSymbols = Object.getOwnPropertySymbols(object); console.log(objectSymbols.length); // 2 console.log(objectSymbols); // [Symbol(a), Symbol(b)] console.log(objectSymbols[0]); // Symbol(a)7.Object.create()方法創(chuàng)建一個(gè)新對(duì)象,使用現(xiàn)有的對(duì)象來(lái)提供新創(chuàng)建的對(duì)象的__proto__
語(yǔ)法:Object.create(proto, [propertiesObject])
參數(shù):
? ? ?proto? 新創(chuàng)建對(duì)象的原型對(duì)象
? ? ?propertiesObject? 可選,這些屬性對(duì)應(yīng)Object.defineProperties()的第二個(gè)參數(shù)。
返回值:一個(gè)新對(duì)象,帶著指定的原型對(duì)象和屬性
function Father() { this.x = 0; this.y = 0; } Father.prototype.move = function (x,y) { this.x += x; this.y += y; }; function Son() { Father.call(this); //調(diào)用父類構(gòu)造函數(shù) } Son.prototype = Object.create(Father.prototype); Son.prototype.constructor = Son; let son = new Son(); console.log(son instanceof Son); //true console.log(son instanceof Father); //true8.Object.getPrototypeOf() 方法返回指定對(duì)象的原型
語(yǔ)法:Object.getPrototypeOf(object)
? ? ? ? obj? 要返回其原型的對(duì)象
返回值:給定對(duì)象的原型,如果沒(méi)有繼承屬性,則返回 null
let proto = {}; let object = Object.create(proto); Object.getPrototypeOf(object) === proto; // true let reg = /a/; Object.getPrototypeOf(reg) === RegExp.prototype; // true9.Object.assign() 方法用于將所有可枚舉屬性的值從一個(gè)或多個(gè)源對(duì)象復(fù)制到目標(biāo)對(duì)象
語(yǔ)法:Object.assign(target, ...sources)
參數(shù):
? ? ?target? 目標(biāo)對(duì)象
? ? ?sources? 源對(duì)象
返回值:目標(biāo)對(duì)象
let obj = { a: 1 }; let copy = Object.assign({}, obj); console.log(copy); // { a: 1 }
此方法是淺拷貝,Object.assign()拷貝的是屬性值,如果源對(duì)象的屬性值是一個(gè)指向?qū)ο蟮囊?,它也只拷貝那個(gè)引用值
let obj1 = { a: 0 , b: { c: 0}}; let obj2 = Object.assign({}, obj1); console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} obj1.b.c = 3; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}} console.log(JSON.stringify(obj2)); // { a: 1, b: { c: 3}}
如何實(shí)現(xiàn)深拷貝
let obj1 = { a: 0 , b: { c: 0}}; let obj2 = JSON.parse(JSON.stringify(obj1)); obj1.b.c = 4; console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
合并兩個(gè)對(duì)象
let obj1 = { a: 1, b: 1, c: 1 }; let obj2 = { b: 2, c: 2 }; let obj3 = { c: 3 }; let newObj = Object.assign({}, obj1, obj2, obj3); console.log(newObj); // { a: 1, b: 2, c: 3 }10.Object.is()方法判斷兩個(gè)值是否是相同的值
語(yǔ)法:Object.is(value1, value2);
參數(shù):
? ? ? ? value1? 需要比較的第一個(gè)值
? ? ? ? value2? 需要比較的第二個(gè)值
返回值:表示兩個(gè)參數(shù)是否相同的Boolean
以下情況返回true:
兩個(gè)值都是 undefined
兩個(gè)值都是 null
兩個(gè)值都是 true 或者都是 false
兩個(gè)值是由相同個(gè)數(shù)的字符按照相同的順序組成的字符串
兩個(gè)值指向同一個(gè)對(duì)象
兩個(gè)值都是數(shù)字并且
都是正零 +0
都是負(fù)零 -0
都是 NaN
都是除零和 NaN 外的其它同一個(gè)數(shù)字
console.log(NaN === NaN); //false console.log(NaN == NaN); //false console.log(Object.is(NaN,NaN)); //true console.log(0 == false); //true console.log(0 === false); //false console.log(Object.is(0,false)); //false console.log(-0 == 0); //true console.log(-0 === 0); //true console.log(Object.is(-0,0)); //false11.Object.isExtensible() 方法判斷一個(gè)對(duì)象是否是可擴(kuò)展的(是否可以在它上面添加新的屬性)
語(yǔ)法: Object.isExtensible(obj)
參數(shù):
? ? ?obj? 需要檢測(cè)的對(duì)象
返回值:表示給定對(duì)象是否可擴(kuò)展的一個(gè)Boolean
語(yǔ)法:Object.isSealed(obj)
參數(shù):
? ? ? ? obj? 要被檢查的對(duì)象
返回值:表示給定對(duì)象是否被密封的一個(gè)Boolean
語(yǔ)法:Object.isFrozen(obj)
參數(shù):
? ? ? ? obj? 被檢測(cè)的對(duì)象
返回值:表示給定對(duì)象是否被凍結(jié)的Boolean
語(yǔ)法:Object.preventExtensions(obj)
參數(shù):
? ? ? ? obj? 將要變得不可擴(kuò)展的對(duì)象
返回值:已經(jīng)不可擴(kuò)展的對(duì)象
描述:不可擴(kuò)展對(duì)象不能再添加新的屬性,但是原有的屬性仍然可被編輯、刪除
非空對(duì)象(其屬性的configurable為true,writable為true):
let object = { a:1, b:2 }; console.log(Object.isExtensible(object)); // true Object.preventExtensions(object); console.log(Object.isExtensible(object)); //false console.log(Object.isSealed(object)); // false console.log(Object.isFrozen(object)); // false ob.b = 20; //可以賦值 console.log(ob.b); //20 delete ob.b; //可以刪除 console.log(ob); //{a: 1} Object.defineProperty(ob,"c",{ // 不可以添加屬性 value: 3, writable: true }); //Cannot define property c, object is not extensible
非空對(duì)象(其屬性的configurable為false,writable為true):
let empty = {}; Object.defineProperty(empty,"foo",{ value: "baz", writable: true }); Object.preventExtensions(empty); console.log(Object.isExtensible(empty)); // false console.log(Object.isSealed(empty)); // true console.log(Object.isFrozen(empty)); // false
非空對(duì)象(其屬性的configurable為true,writable為false):
let empty = {}; Object.defineProperty(empty,"foo",{ value: "baz", writable: false, configurable: true }); Object.preventExtensions(empty); console.log(Object.isExtensible(empty)); // false console.log(Object.isSealed(empty)); // false console.log(Object.isFrozen(empty)); // false
非空對(duì)象(其屬性的configurable為false,writable為false):
let empty = {}; Object.defineProperty(empty,"foo",{ value: "baz" }); Object.preventExtensions(empty); console.log(Object.isExtensible(empty)); // false console.log(Object.isSealed(empty)); // true console.log(Object.isFrozen(empty)); // true
空對(duì)象:
let empty1 = {}; console.log(Object.isExtensible(empty1)); // true Object.preventExtensions(empty1); console.log(Object.isExtensible(empty1)); //false console.log(Object.isSealed(empty1)); // true console.log(Object.isFrozen(empty1)); // true15.Object.seal()方法封閉一個(gè)對(duì)象,阻止添加新屬性并將所有現(xiàn)有屬性標(biāo)記為不可配置。當(dāng)前屬性的值只要可寫就可以改變
語(yǔ)法:Object.seal(obj)
參數(shù):
? ? ? ? obj? 將要被密封的對(duì)象
返回值:被密封的對(duì)象
描述:密封一個(gè)對(duì)象會(huì)讓這個(gè)對(duì)象變的不能添加新屬性,且所有已有屬性會(huì)變的不可配置
空對(duì)象:
let empty = {}; Object.seal(empt); console.log(Object.isExtensible(empty)); // false console.log(Object.isSealed(empty)); // true console.log(Object.isFrozen(empty)); // true
非空對(duì)象:
let object = { foo: "bar" }; Object.seal(object); object.foo = "baz"; //可編輯 console.log(object.foo); //baz delete object.foo; //TypeError: Cannot delete property "foo" of #16.Object.freeze() 方法可以凍結(jié)一個(gè)對(duì)象,凍結(jié)指的是不能向這個(gè)對(duì)象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對(duì)象已有屬性的可枚舉性、可配置性、可寫性。也就是說(shuō),這個(gè)對(duì)象永遠(yuǎn)是不可變的
語(yǔ)法:Object.freeze(obj)
參數(shù):
? ? ?obj? 要被凍結(jié)的對(duì)象
返回值:被凍結(jié)的對(duì)象
描述:被凍結(jié)對(duì)象自身的所有屬性都不可能以任何方式被修改,如果一個(gè)屬性的值是個(gè)對(duì)象,則這個(gè)對(duì)象中的屬性是可以修改的,除非它也是個(gè)凍結(jié)對(duì)象
let object1 = { property1: 42 }; Object.freeze(object1); console.log(Object.isExtensible(object1)); // false console.log(Object.isSealed(object1)); // true console.log(Object.isFrozen(object1)); // true object1.property1 = 33; // TypeError: Cannot assign to read only property "property1" of object "#17.Object.entries()方法返回一個(gè)給定對(duì)象自身可枚舉屬性的鍵值對(duì)數(shù)組,其排列與使用 for...in 循環(huán)遍歷該對(duì)象時(shí)返回的順序一致
語(yǔ)法:Object.entries(obj)
參數(shù):
? ? ?obj? 可以返回其可枚舉屬性的鍵值對(duì)的對(duì)象
返回值:給定對(duì)象自身可枚舉屬性的鍵值對(duì)數(shù)組
const object1 = { foo: "bar", baz: 42 }; console.log(Object.entries(object1)); // [ ["foo", "bar"], ["baz", 42] ] // array like object const object2 = { 0: "a", 1: "b", 2: "c" }; console.log(Object.entries(object2)); // [ ["0", "a"], ["1", "b"], ["2", "c"] ] // array like object with random key ordering const object3 = { 100: "a", 2: "b", 7: "c" }; console.log(Object.entries(object3)); // [ ["2", "b"], ["7", "c"], ["100", "a"] ]18.Object.keys() 方法會(huì)返回一個(gè)由一個(gè)給定對(duì)象的自身可枚舉屬性組成的數(shù)組,數(shù)組中屬性名的排列順序和使用 for...in 循環(huán)遍歷該對(duì)象時(shí)返回的順序一致
語(yǔ)法:Object.keys(obj)
參數(shù):
? ? ? ? obj? 要返回其枚舉自身屬性的對(duì)象
返回值:一個(gè)表示給定對(duì)象的所有可枚舉屬性的字符串?dāng)?shù)組
let arr = ["a", "b", "c"]; console.log(Object.keys(arr)); // ["0", "1", "2"] // array like object let object = { 0: "a", 1: "b", 2: "c" }; console.log(Object.keys(object)); // ["0", "1", "2"]19.Object.values()方法返回一個(gè)給定對(duì)象自己的所有可枚舉屬性值的數(shù)組,值的順序與使用for...in循環(huán)的順序相同
語(yǔ)法:Object.values(obj)
參數(shù):
? ? ? ? obj? 被返回可枚舉屬性值的對(duì)象
返回值:一個(gè)包含對(duì)象自身的所有可枚舉屬性值的數(shù)組
let arr = ["a", "b", "c"]; console.log(Object.values(arr)); // ["a", "b", "c"] // array like object let object = { 0: "a", 1: "b", 2: "c" }; console.log(Object.values(object)); // ["a", "b", "c"]三、Object實(shí)例方法 1.hasOwnProperty() 方法會(huì)返回一個(gè)布爾值,指示對(duì)象自身屬性中是否具有指定的屬性
語(yǔ)法:obj.hasOwnProperty(prop)
參數(shù):
? ? ? ? prop? 要檢測(cè)的屬性? 字符串 名稱或者 Symbol
返回值:用來(lái)判斷某個(gè)對(duì)象是否含有指定的屬性的 Boolean
描述:這個(gè)方法可以用來(lái)檢測(cè)一個(gè)對(duì)象是否含有特定的自身屬性;和 in 運(yùn)算符不同,該方法會(huì)忽略掉那些從原型鏈上繼承到的屬性
let object = new Object(); object.prop = "exists"; console.log(object.hasOwnProperty("prop")); // true console.log(object.hasOwnProperty("toString")); // false console.log(object.hasOwnProperty("hasOwnProperty")); // false console.log("toString" in object); // true console.log("prop" in object); // true console.log("hasOwnProperty" in object); // true2.isPrototypeOf() 方法用于測(cè)試一個(gè)對(duì)象是否存在于另一個(gè)對(duì)象的原型鏈上
語(yǔ)法:prototypeObj.isPrototypeOf(object)
參數(shù):
? ? ? ? object? 在該對(duì)象的原型鏈上搜尋
返回值:Boolean,表示調(diào)用對(duì)象是否在另一個(gè)對(duì)象的原型鏈上
function Foo() {} function Bar() {} function Baz() {} Bar.prototype = Object.create(Foo.prototype); Baz.prototype = Object.create(Bar.prototype); let baz = new Baz(); console.log(Baz.prototype.isPrototypeOf(baz)); // true console.log(Bar.prototype.isPrototypeOf(baz)); // true console.log(Foo.prototype.isPrototypeOf(baz)); // true console.log(Object.prototype.isPrototypeOf(baz)); // true3.propertyIsEnumerable() 方法返回一個(gè)布爾值,表示指定的屬性是否可枚舉
語(yǔ)法:obj.propertyIsEnumerable(prop)
參數(shù):
? ? ? ? prop? 需要測(cè)試的屬性名
返回值:用來(lái)表示指定的屬性名是否可枚舉的Boolean
let o = {}; let a = []; o.prop = "is enumerable"; a[0] = "is enumerable"; o.propertyIsEnumerable("prop"); // 返回 true a.propertyIsEnumerable(0); // 返回 true4.toString() 方法返回一個(gè)表示該對(duì)象的字符串
語(yǔ)法:object.toString()
返回值:表示該對(duì)象的字符串
let object = new Object(); console.log(object.toString()); //[object Object] function Animal(name,age,color,sex) { this.name = name; this.age = age; this.color = color; this.sex = sex; } Animal.prototype.toString = function () { let string = this.name + "是一個(gè)" + this.age + "歲的" + this.color + "的" + this.sex + "動(dòng)物"; return string; }; let animal = new Animal("小可愛(ài)",1,"灰色","雌性"); console.log(animal.toString()); //小可愛(ài)是一個(gè)1歲的灰色的雌性動(dòng)物5.valueOf() 方法返回指定對(duì)象的原始值
語(yǔ)法:object.valueOf()
返回值:返回值為該對(duì)象的原始值
function Animal(name,age,color,sex) { this.name = name; this.age = age; this.color = color; this.sex = sex; } let animal = new Animal("小可愛(ài)",1,"灰色","雌性"); console.log(animal.valueOf()); //{name: "小可愛(ài)", age: 1, color: "灰色", sex: "雌性"}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97484.html
摘要:原文鏈接一個(gè)變量可以存放兩種類型的值,基本類型的值和引用類型的值。引入了一種新的原始數(shù)據(jù)類型,表示獨(dú)一無(wú)二的值。 原文鏈接 一個(gè)變量可以存放兩種類型的值,基本類型的值(primitive values)和引用類型的值(reference values)。 ES6 引入了一種新的原始數(shù)據(jù)類型 Symbol,表示獨(dú)一無(wú)二的值。它是 JavaScript 語(yǔ)言的第七種數(shù)據(jù)類型,前六種是:Un...
摘要:前提知識(shí)在實(shí)現(xiàn)克隆函數(shù)之前你需要明白以下一些概念如果你已經(jīng)明白了請(qǐng)直接閱讀實(shí)現(xiàn)部分什么是值類型引用類型很多新手可能會(huì)對(duì)值類型引用類型原始類型基本類型等等名稱感到困惑這里就解釋一下這些概念一個(gè)事物是可以有多種區(qū)分形式的比如貓我們可以說(shuō)它是貓科 前提知識(shí) 在實(shí)現(xiàn)克隆函數(shù)之前,你需要明白以下一些概念,如果你已經(jīng)明白了,請(qǐng)直接閱讀 實(shí)現(xiàn) 部分. 什么是值類型、引用類型? 很多新手可能會(huì)對(duì) 值類...
摘要:原始類型和引用類型原始類型存儲(chǔ)簡(jiǎn)單數(shù)據(jù)值,引用類型存儲(chǔ)對(duì)象,其本質(zhì)是指向內(nèi)存位置的應(yīng)用。保存指向內(nèi)存中實(shí)際對(duì)象所在位置的指針鑒別引用類型操作符以一個(gè)對(duì)象和一個(gè)構(gòu)造函數(shù)為參數(shù)。這些特殊引用類型的存在使得原始引用類型用起來(lái)和對(duì)象一樣方便。 原始類型和引用類型 1.原始類型存儲(chǔ)簡(jiǎn)單數(shù)據(jù)值,引用類型存儲(chǔ)對(duì)象,其本質(zhì)是指向內(nèi)存位置的應(yīng)用。 注:其他編程語(yǔ)言用棧存儲(chǔ)原始類型,用堆存儲(chǔ)引用類型。Ja...
摘要:值的比較只進(jìn)行值的比較會(huì)進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。只要在當(dāng)前實(shí)例的原型鏈上,我們用其檢測(cè)出來(lái)的結(jié)果都是。但檢測(cè)與不一樣,還可以處理基本數(shù)據(jù)類型的檢測(cè)。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類型的值? Javascript有兩種數(shù)據(jù)類型,分別是基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。其中...
摘要:值的比較只進(jìn)行值的比較會(huì)進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。只要在當(dāng)前實(shí)例的原型鏈上,我們用其檢測(cè)出來(lái)的結(jié)果都是。但檢測(cè)與不一樣,還可以處理基本數(shù)據(jù)類型的檢測(cè)。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類型的值? Javascript有兩種數(shù)據(jù)類型,分別是基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。其中...
摘要:值的比較只進(jìn)行值的比較會(huì)進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。只要在當(dāng)前實(shí)例的原型鏈上,我們用其檢測(cè)出來(lái)的結(jié)果都是。但檢測(cè)與不一樣,還可以處理基本數(shù)據(jù)類型的檢測(cè)。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有幾種類型的值? Javascript有兩種數(shù)據(jù)類型,分別是基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。其中...
閱讀 3236·2021-11-23 09:51
閱讀 1610·2021-11-22 09:34
閱讀 2903·2021-10-27 14:15
閱讀 2382·2021-10-12 10:17
閱讀 1999·2021-10-12 10:12
閱讀 1015·2021-09-27 14:00
閱讀 2060·2021-09-22 15:19
閱讀 1083·2019-08-30 10:51